【问题标题】:Cypher Query where 2 different labels do not contain a relationship to a 3rd label/node密码查询,其中 2 个不同的标签不包含与第三个标签/节点的关系
【发布时间】:2017-07-18 18:12:56
【问题描述】:

我有 3 个标签,A、B 和 Z。A 和 B 都与 Z 有关系。我想找到所有与 B 不共享任何节点 Z 的 A 节点

目前,在存在关系的情况下进行正常查询是可行的。

MATCH (a:A)-[:rel1]->(z:Z)<-[:rel2]-(b:B { uuid: {<SOME ID>} })
RETURN DISTINCT a

但是当我这样做时

MATCH (a:A)
WHERE NOT (a)-[:rel1]->(z:Z)<-[:rel2]-(b:B { uuid: {<SOME ID>} }))
RETURN DISTINCT a

会报错

Neo4j::Server::CypherResponse::ResponseError: z not defined

不确定语法是否不正确,我尝试了WHERE NOT EXIST(),但没有运气。

查询是使用 neo4jrb / (Neo4j::Session.query) 的 Rails 应用调用的更大查询的一部分

【问题讨论】:

    标签: neo4j cypher neo4jrb


    【解决方案1】:

    这是与查询范围有关的问题。当您在 MATCH 子句中描述一个节点时,如下所示

    MATCH (n:SomeLabel)
    

    您告诉 cypher 查找标签为 SomeLabel 的节点,并将其分配给其余查询中的变量 n,在查询结束时,您可以返回存储的值在此节点中使用RETURN n(除非您通过不将n 包含在WITH 子句中来删除它)。

    稍后在你查询时,如果你想MATCH另一个节点,你可以参考n,例如:

    MATCH (m:SomeOtherLabel)-[:SOME_RELATIONSHIP]-(n)
    

    将匹配(在任何方向)连接到节点 n 且带有标签 SomeOtherLabel 的变量,并将其分配给变量 m 以用于查询的其余部分。

    您只能在MATCHOPTIONAL MATCHMERGECREATE 和(某种)在WITHUNWIND 子句中将节点分配给这样的变量(如果我'我错过了一个,我想你也在列表推导和FOREACH 子句中这样做)。

    在您的第二个查询中,您尝试查找标签为 A 的节点,该节点未连接到标签为 Z 的节点。但是,您编写查询的方式意味着您实际上是在说找到一个标签为A 的节点,该节点未通过rel1 关系连接到存储为z 的节点。这将失败(如图所示,neo 抱怨 z 未定义),因为您无法在 WHERE 子句中创建这样的新变量。

    要纠正您的错误,您需要删除对变量z 的引用,并确保您还在WHERE 子句之前定义了包含您的节点的变量b。现在,您将标签保留在查询中,如下所示。

    MATCH (a:A)
    MATCH (b:B { uuid: {<SOME ID>} })
    WHERE NOT (a)-[:rel1]->(:Z)<-[:rel2]-(b) // changed this line
    RETURN DISTINCT a
    

    如果运气好的话,现在可以使用了。

    【讨论】:

    • 感谢这一切都很好!对 Cypher/Neo4j 来说还是比较新的。试图加快由于循环和过度使用 neo4jrb 的 ActiveNode 调用而导致的报告速度。在上面的另一边,我有一个查询来获取 A & B 与 Z 的关系匹配的位置。很容易。我将如何组合查询以带回它们匹配的 Z 集合和剩余不匹配 Z 的另一个集合?如果当前正在工作的查询以获取匹配的 rels 是... MATCH (a:A)-[:rel1]->(z:Z) } }) RETURN DISTINCT a, collect({match: z.title})
    【解决方案2】:

    您收到错误是因为 z 是您在尚未识别的 where 子句中使用的节点的标识符。

    既然你已经知道 b 我会先匹配它,然后在你的 where 子句中使用它。您不需要为:Z 分配标识符,只需使用节点标签就足够了。

    MATCH (b:B { uuid: {<SOME ID>} })
    WITH b
    MATCH (a:A)
    WHERE NOT (a)-[:rel1]->(:Z)<-[:rel2]-(b)
    RETURN DISTINCT a
    

    【讨论】:

      猜你喜欢
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 2021-07-31
      • 2021-09-17
      • 1970-01-01
      相关资源
      最近更新 更多