2013-04-04 44 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