Neo4j - 合并具有相同标签或属性值的所有节点

时间:2016-02-11 00:56:22

标签: merge neo4j cypher

在Neo4j中,如何通过单个属性合并所有节点,即node1.property1 = node2.property2?或者,如何合并具有相同标签名称的所有节点?

manual中,它讨论了各个节点:

MATCH (person:Person)
MERGE (city:City { name: person.bornIn })
RETURN person.name, person.bornIn, city
  

创建标记为City的三个节点,每个节点都包含一个名称   物业价值纽约,俄亥俄州和新泽西州,   分别。请注意,即使MATCH子句导致三个   绑定节点具有值为New York的bornIn属性,只有一个   单个纽约节点(即名称为纽约的城市节点)是   创建。由于纽约节点与第一个绑定节点不匹配,   它被创造了。但是,新创建的纽约节点是匹配的   绑定到第二个和第三个绑定节点。

     

结果

     

5行   节点创建:3   属性集:3   标签补充:3

我的问题是我的节点标签是可变的,因此我必须为包含不同标签的每个节点执行上述代码(上例中的标签是Person)。对于我的示例,如果节点具有属性值,则它们也将具有相同的标签。

更新: 所以,现在我不确定我最初的问题是我需要的东西(一旦事情变得更加突出,我会清理问题)。

我的问题是我有两个节点边缘节点实例

(node1) - [relation1] - > (node2)

(node2) - [relation2] - >(node3)

其中node1,node2等是每个节点边缘节点的标签。注意,node2可以在不同的实例上具有一些不同的属性值,并且可能有许多节点具有标签node2,每个节点具有如上所示的恰好一种关系。但是,某些属性将始终相同(与标签名称相关的唯一标识符)。

话虽如此,我想运行查询:

MATCH (n1: node1) -[r1: relation1]->
(n2: node2) -[r2: relation2]-> (n3: node3)
RETURN n1, r1, n2, r2, n3

但由于有许多节点带有标签node2,但它们都没有连接(或合并?),因此上述查询不返回任何内容。那么,如何将所有节点合并为相同的标签,以便查询按照我的意愿工作?

1 个答案:

答案 0 :(得分:0)

您可以从手册中调整查询,使其适用于具有指定集合标签的任何节点(例如,['人物',' Foo',&# 39;酒吧'])。 (以下查询假设所有此类节点都具有namebornIn属性。)

MATCH (person)
WHERE ANY(x IN LABELS(person) WHERE x IN ['Person', 'Foo', 'Bar'])
MERGE (city:City { name: person.bornIn })
RETURN person.name, person.bornIn, city;

可以调整上述查询以传递parameter中的标签列表,如果有多组标签,则会更有效。

另一种做同样事情的方法,如果标签组没有改变:

MATCH (person)
WHERE person:Person OR person:Foo OR person:Bar
MERGE (city:City { name: person.bornIn })
RETURN person.name, person.bornIn, city