【问题标题】:WHERE NOT() in cypher neo4j query密码 Neo4j 查询中的 WHERE NOT()
【发布时间】:2014-07-17 16:42:58
【问题描述】:

我在使用简单的密码查询时遇到了问题。查询是:

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 关系的节点。

我觉得我对NOT()的理解很薄弱

【问题讨论】:

  • 它似乎在这里工作:console.neo4j.org/r/4nukek你能在那里重现问题并分享一个新链接吗?
  • 还要小心这样的不连贯模式,您将得到两个模式部分中单独匹配的任何内容的叉积。在小图上它可能无关紧要,但在较大的图上它会很昂贵。我可能会更好地使用WITH a MATCH (c:category ... 中断查询而不是过滤返回到不同的值。
  • 在此处查看重现的问题:link 最后一个查询不应返回对象 3704。我尝试使用 WITH A 语法。谢谢你。
  • 我开始回答,但 Jim 打败了我,这是一个很好的回答。仅返回不同的结果有时会隐藏路径组合的意外影响。此外,您可能最好在模式中声明关系类型和方向,并且您可以尝试在WHERE 子句中的路径谓词中使用更长的模式(使用匹配来达到新结果,使用位置来限制)。你可以尝试这样的事情:console.neo4j.org/r/xlvmsy

标签: neo4j cypher


【解决方案1】:

传统,

查询正在返回您所要求的内容。在您的链接示例中,有三个区域。前两个区域不包含任何对象,因此返回所有三个节点。如果您将 RETURN 行更改为

RETURN a.area_number, o.id

你会看到这个。

我不知道您更大的问题背景,但是如果您想了解不在 any 区域中的对象,那么查询

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

将完成任务。

恩典与和平,

吉姆

【讨论】:

    猜你喜欢
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多