Neo4j通过关系合并节点

时间:2019-11-27 17:56:50

标签: neo4j merge nodes graph-databases

我拥有庞大的人员数据集,并通过算法发现了很多重复项。 我在Neo4j中将这些重复项标记为有关系。 例: (p:Person)-[:同类]->(d:Person)

出于测试目的,我通过组合标记有相似关系的所有节点来创建虚拟节点。

CALL algo.unionFind.stream('Person', 'similar', {})
YIELD nodeId, setId
WITH setId AS idd, collect(algo.getNodeById(nodeId)) AS nodis
WHERE size(nodis) > 1
CALL apoc.nodes.collapse(nodis,{properties:'combine'}) YIELD from, rel
RETURN idd, from, rel

在这里我发现了问题,只有两个节点被比较并存储在结果数据中。 示例:

ID:5,彼得·史密斯 ID:4635,彼得·史密特(Peter Smit)

ID:4635,彼得·史密斯 ID:765,彼得·史密斯

ID:5,彼得·史密斯 ID:765,彼得·史密斯

我想重构该图并将重复项(forrest)合并到一个节点中。但是只有一个节点被合并。我该如何合并由于“相似”关系而存在的所有阿甘?

更新:

我找到了一个半解法。所有类似的人都通过以下代码合并。所有属性都合并为一个列表。对我来说似乎很好,除了Ids现在也位于列表中-但这不是问题的主题。

CALL algo.unionFind.stream('Person', 'similar', {})
YIELD nodeId,setId
WITH setId AS idd, collect(algo.getNodeById(nodeId)) AS nodis
CALL apoc.refactor.mergeNodes(nodis, {properties:'combine', mergeRels: true}) YIELD node
RETURN node

1 个答案:

答案 0 :(得分:0)

如何使用唯一约束?

我在MERGE上也遇到同样的问题。

示例)

创建约束(book:Book)assert book.isbn是唯一的