2012-10-28 19 views
0

我想用Neo4j :: Rails :: Models做一個簡單的測試,用Neo4j.rb標記一個單一的東西,然後執行一個查詢來再次找到使用標籤的東西。當cypher使用Neo4j :: Rails :: Model時,爲什麼Neo4j.query不返回結果?

所以數據基本上是這樣的,有一個標籤和一個單一的東西:

(標籤),標籤都有效 - >(事)

當我使用我的腳本運行查詢,我不不會得到任何結果,但如果我使用neo4j附帶的webadmin控制檯來運行等效查詢,我會得到執行結果。

我只是不知道我在做什麼錯,但我認爲它一定是我使用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 

回答

2

在第二行最後一行中,使用符號而不是字符串來訪問查詢結果。

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

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

puts Neo4j.query { node(tag_id).outgoing(:tags).as(:thing) }.columns 

順便說一句,請記住,CYPHER查詢結果是穿越的只有一次。

+0

謝謝安德烈亞斯。非常感謝。出色的Neo4j寶石。 – nuxibyte

相關問題