关于 YMatrix
部署数据库
使用数据库
管理集群
最佳实践
高级功能
高级查询
联邦查询
Grafana 监控
备份恢复
灾难恢复
图数据库
管理手册
性能调优
故障诊断
工具指南
系统配置参数
SQL 参考
MERGE 子句确保图中存在某个模式。该模式要么已经存在,要么需要被创建。
MERGE 要么匹配现有节点,要么创建新数据。它是 MATCH 和 CREATE 的组合。
注意!
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' 将匹配现有顶点,并返回该顶点的 name 和 bornIn 属性。
name | bornin
-------------------+--------------
"Michael Douglas" | "New Jersey"
(1 row)