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

时间:2019-01-19 11:27:16

标签: 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)

非常感谢您。

2 个答案:

答案 0 :(得分:0)

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

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

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

新版本的Cypher不支持

创建唯一,请使用 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)

答案 1 :(得分:0)

  1. 在您的查询中,第二个WITH子句不包含personA,因此该变量被删除。
  2. 但是您的查询中甚至不需要两个WITH子句,因此应将其省略(为清楚起见,如果没有其他要求)。
  3. 您的查询也可以很容易地只有一个MATCH子句,该子句直接使用personApersonB变量名。
  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关系仅在两个相关节点的年龄相同的情况下才存在。

相关问题