2014-07-17 88 views
0

我遇到了一个简单的密码查询的麻烦。查询是:哪里不是()在cypher neo4j查询

MATCH (u:user { google_id : 'example_user' })--(rm:room)--(a:area), 
    (c:category { name : 'culture:Yoruba' })--(o:object) 
WHERE NOT (a-[:CONTAINS]->o) 
RETURN DISTINCT o.id 

“WHERE NOT ..”被忽略,我从区域节点获取带有传入:CONTAINS关系的节点。如果我拿出“NOT”函数,那么我正确地只返回具有这个a - > o关系的节点。

我想我还没有()

+0

它似乎在这里工作:http://console.neo4j.org/r/4nukek你能重现该问题存在并共享一个新的链接? – jjaderberg

+1

也要小心这样的断开模式,你会得到任何在两个模式部分单独匹配的叉积。在一个小图上它可能并不重要,但是在更大的图上它将是昂贵的。我可能会更好地使用WITH WITH MATCH(c:category ...)来打破查询,而不是将返回过滤到不同的值。 – jjaderberg

+0

在这里寻找转载问题:[link](http://console.neo4j.org/r/nn691p)最后一个查询不应该返回对象3704,我尝试使用WITH A语法,感谢。 – trad

回答

5

岛的弱理解,

该查询返回的正是你问它。在你的例子中,有三个区域。前两个区域都不包含任何对象,因此所有三个节点都会返回。如果将RETURN行更改为

RETURN a.area_number, o.id 

您会看到此内容。

我不知道你的问题比较大背景下,但如果你想知道这个问题是不是在任何面对象,然后将查询

MATCH (o:object) 
WHERE NOT (o)<-[:CONTAINS]-() 
RETURN o.id 

能完成这个任务。

恩惠,平安,

吉姆