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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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. 你的查询也可以很容易地只有一个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,因为只有当2个相关节点具有相同的年龄时才会存在HAS_SAME_AGE关系。

另一答案

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

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

你需要在第二个'with'子句中将它与'person'一起传递。

新版本的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)

以上是关于在Neo4J中创建具有相同属性的节点之间的关系的主要内容,如果未能解决你的问题,请参考以下文章

尝试放松并在节点之间建立新的关系Neo4J C#Client

在neo4j中创建一对多关系

如何在Neo4j中创建节点时跳过重复节点

Neo4j在链接在一起的节点上对相同属性执行平均操作

如何从neo4j中的csv文件中导入相同标签的节点之间的关系?

在将节点从 csv 创建到 neo4j 时创建关系