我拥有庞大的人员数据集,并通过算法发现了很多重复项。 我在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
答案 0 :(得分:0)
如何使用唯一约束?
我在MERGE上也遇到同样的问题。
示例)
创建约束(book:Book)assert book.isbn是唯一的