merge - neo4j cypher更新现有节点或创建新节点

标签 merge neo4j cypher

我有一个大约有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(示例中的firstlast)开始查找或创建初始节点。
  • 然后执行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}传递的所有属性
  • 创建一个新节点
  • 如果匹配it should add new properties to the node without deleting any

  • 我已经使用MERGE ON MATCHthe 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/

    相关文章:

    r - 合并多个列名重复的数据表

    neo4j - 如何将 py2neo.database.cursor 类转换为 python 中的字典或列表?

    neo4j - 按关系属性排序 neo4j

    database - Neo4j:逐步创建自动索引

    neo4j - 通过属性值获取节点 neo4j

    testing - 用于测试密码注入(inject)的示例查询?

    javascript - 与合并对象连接

    java - 编程 - Java - 将合并算法与操作分离

    tfs - TFS:合并回主分支

    Neo4j - 是否有密码查询语法来列出(显示)数据库中的所有索引?