2014-04-04 54 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查询,以便明确使用较早的语法。