我正在使用令人敬畏的neography宝石,在将Cypher查询的结果转换为结构化对象(OpenStruct.new ...)时遇到了一个小问题。

我不知道如何从列和数据查询结果创建哈希或OpenStruct,

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

我无法从中创建可用的哈希。我尝试了几件事,包括
["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)

我要寻找的是存储在struct对象中的类似以下内容的文件,以便支架视图可以未经修改地读取它:
{:challenge_id=>158, :author_id=>88}
{:challenge_id=>158, :author_id=>90}
{:challenge_id=>158, :author_id=>99}

我的视图将查找object.challenge_id

现在,我尝试在使用.map方法时对“challenge_id”使用to_sym无济于事。

我尝试对[“data”]进行哈希处理[@mydata],但该方法也无法正常工作

是否有一种简单的方法可以将所有这些数据都放入一个结构化对象(OpenStruct.new ..),以便我的表单可以像读取活动记录查询的结果一样简单地读取它?我可以使用neo.get_node_properties做到这一点,但似乎无法正常工作。

最佳答案

假设您有两个节点,分别是名称和标题。

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 =>“马克”

10-08 04:28