我有一个大约有900万个节点和1200万个关系的图。对于图形中的每个节点,每个单独的节点都有一个属性子集,该属性子集通过Label形成了该节点的唯一标识。正在由各种数据源更新该图,这些数据源会扩充该图内的现有节点,或者如果不存在该节点,则创建新节点。我不想在更新期间根据图表中的唯一属性集创建重复项。
例如,我在图中有“人”,其唯一性取决于他们的名字和姓氏。以下代码创建两个不同的人:
CREATE (p:Person{first:"barry",last:"smith",height:187});
CREATE (p:Person{first:"fred",last:"jones",language:"welsh"});
稍后,从其中一个数据源接收以下数据记录(每行一个):
first: "fred", last: "lake", height: 201
first: "barry", last: "smith", language: "english"
first: "fred", last: "jones", language: "welsh", height: 188
first: "fred", last: "jones", eyes: "brown"
first: "barry", last: "smith"
更新图后,我要具有以下节点:
(:Person{first:"fred",last:"jones",language:"welsh",height:"188,eyes:"brown"})
(:Person{first:"barry",last:"smith",language"english",height:187})
(:Person{first:"fred",last"lake",height:201})
我正在尝试制定一个
MERGE
查询,它可以进行这种更新。我想出了以下方法:MERGE
(示例中的first
和last
)开始查找或创建初始节点。 SET
,其中包含传入记录中定义的每个属性。 因此,对于上面给出的三个示例记录:
MERGE (p:Person{first:"fred",last:"lake"}) SET p.height = 201;
MERGE (p:Person{first:"barry",last:"smith"}) SET p.language = "english";
MERGE (p:Person{first:"fred",last:"jones"}) SET p.language = "welsh", p.height = 188;
MERGE (p:Person{first:"fred",last:"jones"}) SET p.eyes = "brown";
MERGE (p:Person{first:"barry",last:"smith"});
我已经尝试了这个方法并且它起作用了,但是我很想知道这是否是确保一组属性基于节点的唯一性并允许添加其他信息的最佳方法(最有效...)。 (或不)随着时间的推移而出现更新?
最佳答案
只是一种幼稚的方法:如果您运行MERGE
并只是创建或更新它,该怎么办?
给定您的记录列表,将每个记录视为一个映射:
{ first: "fred", last: "lake", height: 201 }
{ first: "barry", last: "smith", language: "english" }
{ first: "fred", last: "jones", language: "welsh", height: 188 }
{ first: "fred", last: "jones", eyes: "brown" }
{ first: "barry", last: "smith" }
然后以参数方式编写查询:
MERGE (p:Person{ first: { map }.name, last: { map }.last }
ON CREATE SET n = { map }
ON MATCH SET n += { map }
查询说明:
{map}
传递的所有属性我已经使用
MERGE ON MATCH
在the page linked above控制台中运行了一些查询,它似乎将现有属性更新为新值。我运行的查询如下:
MATCH (peter { name: 'Peter' }) RETURN peter
MERGE (peter { name: 'Peter' }) ON MATCH SET peter += { hungry: TRUE , position: 'Entrepreneur' }
MATCH (peter { name: 'Peter' }) RETURN peter
// added two new properties here
MERGE (peter { name: 'Peter' }) ON MATCH SET peter += { hungry: FALSE , position: 'Entrepreneur' }
MATCH (peter { name: 'Peter' }) RETURN peter
// hungry is now false in here
关于merge - neo4j cypher更新现有节点或创建新节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25177788/