2014-04-04 108 views
0

我想用Neo4j 2.0.1(最新版)提供的Graph Databases書(PDF page 51-52)中提供的示例。看來我不能複製粘貼代碼示例(我猜這個語法不再有效)。如何使用START與Cypher/Neo4j 2.0

START bob=node:user(username='Bob'), 
charlie=node:user(username='Charlie') 
MATCH (bob)-[e:EMAILED]->(charlie) 
RETURN e 

Got #=> Index `user` does not exist. 

於是,我嘗試沒有 '用戶'

START bob=node(username='Bob'), 
charlie=node(username='Charlie') 
MATCH (bob)-[e:EMAILED]->(charlie) 
RETURN e 

Got #=> Invalid input 'u': expected whitespace, an unsigned integer, a parameter or '*' 

試過,但沒有奏效

START bob=node({username:'Bob'}), 
(charlie=node({username:'Charlie'}) 
MATCH (bob)-[e:EMAILED]->(charlie) 
RETURN e 

Got #=> Invalid input ':': expected an identifier character, whitespace or '}' 

我想用START然後MATCH實現這一目標。會很感激一點點的方向開始。

回答

0

從版本2.0開始語法已更改。

http://docs.neo4j.org/chunked/stable/query-match.html

你的第一個查詢應該是這樣的。

MATCH (bob {username:'Bob'})-[e:EMAILED]->(charlie {username:'Charlie'}) 
RETURN e 
+0

語法仍然有效,您剛纔提供了一個不同的查詢來提供相同的結果。 – tstorms

+0

我想使用'START'和'MATCH'(除非在2.0版中棄用'START')。 – Bala

0

由於您需要首先創建用戶索引,因此查詢無法正常工作。這不能與Cypher完成,請參閱the documentation瞭解更多信息。您的語法仍然有效,但Lucene索引被認爲是遺留的。模式索引取代它們,但它們尚未完全成熟(例如,沒有通配符搜索,IN支持,...)。

你也想使用標籤,在你的情況下用戶標籤。查詢可重構爲:

MATCH (b:User { username:'Bob' })-[e:EMAILED]->(c:User { username:'Charlie' }) 
RETURN e 

獲得良好的性能,在用戶名添加屬性架構指數以及:

CREATE INDEX ON :User(username) 
+0

什麼解決方案,而不創建一個'索引'。我可以通過省略對索引的引用來使用相同的查詢嗎?或者'START'總是必須有索引? – Bala

+0

不,你也可以從ID開始,如果你有它們的話。例如。 'START n =節點(1),m =節點(2)'。 Fred的建議是在Neo4j 2.0中使用它的首選方法之一。 – tstorms

0

開始是可選的,如上所述。鑑於它在Cypher 2.0 refcard的「已棄用」部分中列出,我會盡量避免僅僅爲了安全目的而使用它。

但是,refcard確實聲明可以用「CYPHER 1.9」(不帶引號)預先安排您的Cypher查詢,以便明確使用較早的語法。