gpt4 book ai didi

neo4j - 密码查询,其中 2 个不同的标签不包含与第三个标签/节点的关系

转载 作者:行者123 更新时间:2023-12-02 08:12:32 36 4
gpt4 key购买 nike

我有 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 应用程序调用的更大查询的一部分

最佳答案

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

MATCH (n:SomeLabel)

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

稍后在您的查询中,如果您想MATCH 另一个节点,您可以引用n 来完成,例如:

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

将匹配一个变量(在任何方向上)连接到节点n,标签为SomeOtherLabel,并将其分配给变量m 查询的其余部分。

您只能在 MATCHOPTIONAL MATCHMERGECREATE 和(有点)在 WITHUNWIND 子句中(如果我错过了一个,请有人在这里纠正我,我想你也在列表理解和 FOREACH 子句)。

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

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

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

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

关于neo4j - 密码查询,其中 2 个不同的标签不包含与第三个标签/节点的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45174225/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com