2013-04-04 93 views
3

我使用了令人敬畏的neography gem,並遇到將Cypher查詢的結果轉換爲結構化對象(OpenStruct.new ...)的輕微問題。 )Neo4j&Neography - 在密碼/打開對象中獲取密碼查詢結果

我不知道如何創建一個散列或從列和數據查詢結果,這是

{"columns"=>["p.pd_challenge_id", "p.author_id"], "data"=>[["158", "88"], ["158", "90"], ["158", "99"], ["158", "95"], ["158", "97"]]} 

我不能從它創建一個可用的哈希OpenStruct。 .I've試過幾件事,包括

["data"].map{|x|{ "challenge_id" => x[1],"author_id"=>x[0]}}.to_json 

結果

{{"challenge_id":158, "author_id":88}, {"challenge_id":158, "author_id":90}, {"challenge_id":158, "author_id":99}} etc.. (to which I simply cannot convert to a hash or openstruct) 

我正在尋找的是類似以下內容存儲在一個結構對象,以便腳手架視圖可以讀取它不變:

{:challenge_id=>158, :author_id=>88} 
{:challenge_id=>158, :author_id=>90} 
{:challenge_id=>158, :author_id=>99} 

我認爲會尋找object.challenge_id

現在,我試圖使用to_sym「challenge_id」無法使用.map方法..

我試圖對[[數據]]上散列[@mydata]也不起作用

是否有一種簡單的方法將所有這些數據都存入一個結構化對象(OpenStruct.new ..),以便我的表單可以像讀取活動記錄查詢的結果一樣簡單地讀取它?我可以用neo.get_node_properties做到這一點,但似乎無法得到這個工作的權利。

回答

6

比方說,你有兩個節點,名稱和標題。

cypher = "start n = node(1,2) return n.name as name, n.title as title" 
results = @neo.execute_query(cypher) 
{"columns"=>["name", "title"], "data"=>[["Marc", "awesome"], ["Tom", "chief"]]} 

然後你把你的結果,並做到這一點:

array_of_hashes = results["data"].map {|row| Hash[*results["columns"].zip(row).flatten] } 

這將留給你:

[{"name"=>"Marc", "title"=>"awesome"}, {"name"=>"Tom", "title"=>"chief"}]

你可以在這裏停止或...

objects = array_of_hashes.map{|m| OpenStruct.new(m)}

[#<OpenStruct name="Marc", title="awesome">, #<OpenStruct name="Tom", title="chief">]

然後你就可以訪問

objects.first.name => 「馬克」

+1

馬克斯 - 這是一個偉大的答案,但對於空值?當數據包含它們時,生成的結構不會失調 - 數據存在錯誤的列。任何保存空值的方法? – 2013-05-08 23:45:01