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

在Neo4j中合并具有相同属性值的节点,neo4j,cypher,Neo4j,Cypher,当我搜索具有特定zipcode的节点时: MATCH (z:ZipCode) WHERE z.zipcode = "2014 AAE" RETURN z.zipcode MATCH p=(z:ZipCode)-->() WHERE z.zipcode = "2014 AAE" RETURN p 我得到了副本: z.zipcode 2014 AAE 2014 AAE 当我搜索某个zipcode的关系时: MATCH (z:ZipCode) WHERE z.zipcode = "2014

当我搜索具有特定zipcode的节点时:

MATCH (z:ZipCode) WHERE z.zipcode = "2014 AAE" RETURN z.zipcode
MATCH p=(z:ZipCode)-->() WHERE z.zipcode = "2014 AAE" RETURN p
我得到了副本:

z.zipcode
2014 AAE
2014 AAE
当我搜索某个zipcode的关系时:

MATCH (z:ZipCode) WHERE z.zipcode = "2014 AAE" RETURN z.zipcode
MATCH p=(z:ZipCode)-->() WHERE z.zipcode = "2014 AAE" RETURN p
我得到一个zipcode节点
2014 AAE
指向房屋节点
518Q

如何合并具有相同属性值的zipcode节点, 但是让zipcode的所有关系保持不变

编辑:

赛博萨姆回答后,我提出了一个问题。这是将节点与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;
匹配(z1:ZipCode-->(),(z2:ZipCode-->)()
其中z1.zipcode=z2.zipcode
和ID(z1)ID(z2)
使用COLLECT([z1,z2])作为zs
调用apoc.refactor.mergeNodes(zs)YIELD节点
返回节点;
我认为这是一个错误:

Type mismatch: expected Collection<Node> but was Collection<Collection<Node>> (line 5, column 31 (offset: 160))
"CALL apoc.refactor.mergeNodes(zs) YIELD node"
类型不匹配:预期收集但为收集(第5行第31列(偏移量:160))
“调用apoc.refactor.mergeNodes(zs)屈服节点”
[更新]

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

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

例如:

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

我认为不可能从第一个查询得到2个结果,从第二个查询得到1个结果。第一个查询清楚地表明有两个节点具有特定的
ZipCode
。是否有可能存在zipcode
2014 AAE
的节点
p
,该节点具有
“相关”
?我的意思是
(z:ZipCode)如果你想删除重复项,你只需要匹配所有节点(匹配两个节点,例如
m
n
),比较它们,这样你就知道它们是相同的(具有相同的属性
m.ZipCode=n.ZipCode
),但它们不是同一个节点
mn
,然后,您必须找到
n
中不在
m
中的所有关系,在节点
m
上创建这些“n-关系”,最后删除
节点n及其所有关系。更好的解决方案是创建一个好的查询,这样您就可以在创建节点和关系的过程中合并重复项,以后就不必这样做了。@Gondi:有2个邮政编码节点,其中只有一个涉及到关系。因此,这两个查询的结果非常合理。
YIELD node
是什么意思?APOC把它转换成一个节点?我的意思是,它们还有其他的收益类型吗?
mergeNodes
过程返回(
YIELD
s)集合中的第一个节点。有关
CALL
YIELD
的更多信息,请参阅。我根据您的APOC建议CyberSam编辑了我的问题。您应该使用我的示例查询。您添加的查询正在创建并尝试传递集合的集合。另外,您已经知道只有一个节点具有该关系,因此您尝试执行的操作无论如何都不会起作用。