当cypher使用Neo4j :: Rails :: Model时,为什么这个Neo4j.query没有返回结果?

时间:2012-10-28 20:01:41

标签: neo4j

我正在尝试使用Neo4j :: Rails :: Neo4j.rb进行一个简单的测试,它标记一个东西,然后执行查询以使用标记再次找到该东西。

所以数据基本上就是这样,只有一个标签和一个东西:

(标签)-tags->(事)

当我使用我的脚本运行查询时,我没有得到任何结果,但如果我使用neo4j附带的webadmin控制台运行等效查询,我会得到结果为execpted。

我无法弄清楚我做错了什么,但我认为它必须是我使用Neo4j.query块的方式。

这是我从控制台运行的,它给出了正确的结果。

neo4j-sh (0)$ START tag=node:Tag_exact(text='tag') MATCH tag-[:tags]->thing RETURN thing;

==> +------------------------------------------+
==> | thing                                    |
==> +------------------------------------------+
==> | Node[1]{name:"thing",_classname:"Thing"} |
==> +------------------------------------------+
==> 1 row
==> 197 ms
==> 
neo4j-sh (0)$

这是测试脚本,它提供等效的密码查询但不返回任何结果。

require 'rubygems'
require 'neo4j'
require 'fileutils'

# Create a new database each time
Neo4j::Config[:storage_path] = "test_neo"
FileUtils.rm_rf(Neo4j::Config[:storage_path])

# Models
class Tag < Neo4j::Rails::Model
    property :text, :index => :exact
end

class Thing < Neo4j::Rails::Model
    property :name
end

# Data
thing = Thing.new(:name => "thing")
thing.save

tag = Tag.new(:text => "tag")
tag.outgoing(:tags) << thing
tag.save

# Query
puts Neo4j::Cypher.query {
  lookup("Tag_exact", "text", "tag").outgoing(:tags).as(:thing)
}.to_s # START v1=node:Tag_exact(text="tag") MATCH (v1)-[:`tags`]->(thing) RETURN thing

results = Neo4j.query do
  lookup("Tag_exact", "text", "tag").outgoing(:tags).as(:thing)
end 

results.each do |result|
  p result["thing"]
end # nil, I want to get the name of thing back here

1 个答案:

答案 0 :(得分:2)

在倒数第二行,使用符号而不是字符串来访问查询的结果。

result.each do |result|
  p result[:thing]
end

要知道返回哪些列,请使用columns方法,例如:

puts Neo4j.query { node(tag_id).outgoing(:tags).as(:thing) }.columns
不过,请记住,密码查询结果只能遍历一次。