MERGE(合并)

MERGE 子句确保图中存在某个模式。该模式要么已经存在,要么需要被创建。

MERGE 要么匹配现有节点,要么创建新数据。它是 MATCHCREATE 的组合。

注意!
YMatrix AGE 中 MERGE 的限制:

1.不支持 ON MATCH SET/ON CREATE SET 语法。

MERGE (n:node {name: 'Lisa'}) ON MATCH SET n.age = 23
-- ERROR: syntax error at or near "ON"

2.MERGE 与其他写操作(CREATE、SET)通过 WITH 组合时报错 3.当 MERGE 与 CREATE 或 SET 通过 WITH 传递变量组合使用时,会触发分布式事务错误:

-- 报错
CREATE (n) WITH n as a MERGE (a)-[:e]->()
-- ERROR: AssignTransactionId() called by Segment Reader process
-- 报错
CREATE (n {i : 1}) SET n.i = 2 MERGE ({i: 2})
-- ERROR: AssignTransactionId() called by Segment Reader process

使用建议:将 MERGE 与其他写操作拆分为独立的 Cypher 语句执行。

例如,你可以指定图中必须包含一个具有特定名称的用户节点。如果没有具有正确名称的节点,将创建一个新节点并设置其 name 属性。当对完整模式使用 MERGE 时,行为是要么整个模式匹配,要么整个模式被创建。MERGE 不会部分使用现有模式。如果需要部分匹配,可以通过将模式拆分为多个 MERGE 子句来实现。

MATCH 一样,MERGE 可以匹配模式的多个出现。如果有多个匹配,它们都将传递给查询的后续阶段。

数据准备

SELECT * from cypher('graph_name', $$
CREATE (A:Person {name: "Charlie Sheen", bornIn: "New York"}),
    (B:Person {name: "Michael Douglas", bornIn: "New Jersey"}),
    (C:Person {name: "Rob Reiner", bornIn: "New York"}),
    (D:Person {name: "Oliver Stone", bornIn: "New York"}),
    (E:Person {name: "Martin Sheen", bornIn: "Ohio"})
$$) as (result agtype);

合并节点

合并带标签的节点

通过指定包含单个顶点和标签的模式来合并节点。

查询

SELECT * FROM cypher('graph_name', $$
MERGE (v:Critic)
RETURN v
$$) as (v agtype);

如果存在标签为 Critic 的顶点,则返回该顶点。否则,将创建并返回该顶点。

                                   v
------------------------------------------------------------------------
 {"id": 22799473113563137, "label": "Critic", "properties": {}}::vertex
(1 row)

合并带属性的单个顶点

合并一个带属性的顶点节点,其中并非所有属性都匹配现有顶点。

查询

SELECT * FROM cypher('graph_name', $$
MERGE (charlie {name: 'Charlie Sheen', age: 10})
RETURN charlie
$$) as (v agtype);

如果存在具有所有属性的顶点,则返回该顶点。否则,将创建并返回一个名为 'Charlie Sheen' 的新顶点。

                                                v
--------------------------------------------------------------------------------------------------
 {"id": 281474976710657, "label": "", "properties": {"age": 10, "name": "Charlie Sheen"}}::vertex
(1 row)

合并同时指定标签和属性的单个顶点

合并一个标签和属性约束都匹配现有顶点的顶点。

查询

SELECT * FROM cypher('graph_name', $$
MERGE (michael:Person {name: 'Michael Douglas'})
RETURN michael.name, michael.bornIn
$$) as (Name agtype, BornIn agtype);

'Michael Douglas' 将匹配现有顶点,并返回该顶点的 namebornIn 属性。

       name        |    bornin
-------------------+--------------
 "Michael Douglas" | "New Jersey"
(1 row)