繁体   English   中英

在 Neo4J 中创建具有相同属性的节点之间的关系

[英]Create relation between nodes with same property in Neo4J

我想在同年出生的两个演员之间建立一种新的关系。

我正在运行此查询,但似乎不起作用:

MATCH (a:Person)
with a AS personA
MATCH (b:Person)
with b AS personB
WHERE personA.born = personB.born AND personA <> personB
CREATE UNIQUE (personA)-[:HAS_SAME_AGE {sameAge: "Has same age"}]-(personB)

非常感谢。

  1. 在您的查询中,第二个WITH子句不包含personA ,因此该变量被删除。
  2. 但是在您的查询中甚至不需要两个WITH子句,因此应该省略(为了清楚起见,如果没有别的)。
  3. 您的查询也可以很容易地只包含一个直接使用personApersonB变量名称的MATCH子句。
  4. 您的WHERE子句将允许处理同一对Person节点两次(以相反的顺序)。 例如,您可以使用ID(personA) < ID(personB)而不是personA <> personB来确保同一对只处理一次。
  5. 不推荐使用CREATE UNIQUE ,而应使用MERGE
  6. MERGE不需要您指定关系的方向——它可以自动为您指定一个。 如果您想将这种关系视为无向关系(在您的情况下是这样),这是合适的。

这是一个处理上述所有项目的查询:

MATCH (personA:Person), (personB:Person)
WHERE ID(personA) < ID(personB) AND personA.born = personB.born
MERGE (personA)-[:HAS_SAME_AGE {sameAge: "Has same age"}]-(personB)

注意:您可能想要给sameAge一个布尔值( truefalse )。 或者,更好的是,完全消除sameAge ,因为HAS_SAME_AGE关系仅在 2 个相关节点具有相同的年龄时才存在。

此查询将创建空节点并在空节点和给定节点之间创建关系。

这里的问题是“ personA ”不在“CREATE UNIQUE”的范围内。

您需要在第二个“with”子句中将它与“personB”一起传递

新版本的 Cypher 不支持CREATE UNIQUE ,请改用MERGE

MATCH (a:Person)
with a AS personA
MATCH (b:Person)
with personA, b AS personB
WHERE personA.born = personB.born AND personA <> personB
CREATE UNIQUE (personA)-[:HAS_SAME_AGE {sameAge: "Has same age"}]->(personB)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM