概览
UPSERT语句用于更新图中已有的点和边。如果未找到匹配的现有数据,则会插入新的点或边。
在类型图中,每个点或边只属于一个Schema,且插入后Schema不可更改。尝试给现有的点、边指定不同的Schema将导致错误。更新点或边时,新定义中包含的属性会被更新,而未包含的属性将保持不变。
在开放图中,当点或边被覆盖时,其标签和属性都会被更新。
更新点
如果属性定义中包含_id,且其值在图中已存在,则对应点将被更新。例如:
UPSERT (:User {_id: "U2", name: "Jumpy88"})
如果图中已存在_id为U2的点,该节点的Schema/标签和属性将更新至新的值。如果不存在这样的点,则会插入一个新点。
UPSERT (:User {name: "Jumpy88"})
由于属性定义中未包含_id,因此会在图中插入一个新点。
更新边
如果属性定义中包含EDGE KEY属性,且其值在图中已存在,同时指定的起点和终点保持不变,则对应边将被更新。
例如,将EDGE KEY约束应用于属性eID:
ALTER EDGE * ADD CONSTRAINT EDGE KEY ON eID STRING
MATCH (n1:User {name: "mochaeach"}), (n2:User {name: "Brainy"})
UPSERT (n1)-[e:Follows {eID: "e6561"}]->(n2)
如果图中已存在eID为e6561的边,且其起点和终点分别为mochaeach和Brainy,则该边的Schema/标签和属性将更新至新的值。如果不存在这样的边,则会插入一条新边。