在Neo4j中合并具有相同属性值的节点

时间:2016-09-16 09:58:44

标签: neo4j cypher

当我搜索带有某个邮政编码的节点时:

MATCH (z:ZipCode) WHERE z.zipcode = "2014 AAE" RETURN z.zipcode

我得到重复:

z.zipcode
2014 AAE
2014 AAE

当我搜索某个邮政编码的关系时:

MATCH p=(z:ZipCode)-->() WHERE z.zipcode = "2014 AAE" RETURN p

我得到一个指向房屋节点2014 AAE

的单个邮政编码节点518Q

如何将zipcode节点与相同的属性值合并, 但保留所有关系完整的邮政编码?

修改

在cybersam的回答之后,我构建了一个查询。这是将节点与APOC组合的方式吗?

MATCH (z1:ZipCode)-->(), (z2:ZipCode)-->()
WHERE z1.zipcode = z2.zipcode
AND ID(z1) <> ID(z2)
WITH COLLECT([z1,z2]) AS zs
CALL apoc.refactor.mergeNodes(zs) YIELD node
RETURN node;

我认为这是错误:

Type mismatch: expected Collection<Node> but was Collection<Collection<Node>> (line 5, column 31 (offset: 160))
"CALL apoc.refactor.mergeNodes(zs) YIELD node"

1 个答案:

答案 0 :(得分:2)

[增订]

旁白:您有2个节点具有相同的邮政编码,但这些节点中只有一个有关系。这解释了迄今为止的结果。

在neo4j 3.x中,您可以安装APOC plugin并使用mergeNodes()过程,该过程需要一组节点。它将第二个节点和最后一个节点的属性和关系合并到第一个节点上,并删除第二个节点到最后一个节点。

例如:

MATCH (z:ZipCode)
WHERE z.zipcode = "2014 AAE"
WITH COLLECT(z) AS zs
CALL apoc.refactor.mergeNodes(zs) YIELD node
RETURN node;