Neo4j:合并重复节点

时间:2013-08-06 20:05:42

标签: graph neo4j cypher

我在Neo4j中做了一些错误的动作,现在我们有一个重复节点的图表。在重复对中,完整属性集属于该对中的第一个,并且所有关系都属于该对中的第二个。索引是node_auto_index。

节点:

Id  Name Age  From       Profession

1  Bob  23   Canada       Doctor
2  Amy  45   Switzerland  Lawyer
3  Sam  09   US  
4  Bob   
5  Amy
6  Sam

关系:

Id  Start  End   Type
1     4     6     Family
2     5     6     Family
3     4     5     Divorced

我正在努力避免重做整批导入。有没有办法根据“name”字符串属性合并cypher中的节点,同时保留所有属性和关系?

谢谢!

2 个答案:

答案 0 :(得分:1)

好吧,我想我弄清楚了:

START first=node(*), second=node(*) 
WHERE has(first.Name) and has(second.Name) and has(second.Age) and NOT(has(first.Age))
WITH first, second
WHERE first.Name= second.Name
SET first=second

查询仍在处理中,但有更有效的方法吗?

答案 1 :(得分:1)

您在这两组之间创建了一个交叉产品,因此价格昂贵。最好是对名称进行索引查找。

START first=node(*), second=node(*) 
WHERE has(first.Name) and has(second.Name) and has(second.Age) and NOT(has(first.Age))
WITH first, second
SKIP 20000 LIMIT 20000
WHERE first.Name= second.Name
SET first=second

你可能还必须对处理进行分页。

START n=node:node_auto_index("Name:*")
WITH n.Name, collect(n) nodes
SKIP 20000 LIMIT 20000
WHERE length(nodes) == 2
WITH head(filter(x in nodes : not(has(x.Age)))) as first, head(filter(x in nodes : has(x.Age))) as second
SET first=second