CREATE(创建)

CREATE 子句用于创建图的顶点和边。

注意!
在 YMatrix AGE 中,同一个 cypher 函数包含的 CREATE 子句创建的所有点、边都会在同一个Segment上。

终端 CREATE 子句

不跟随其他子句的 CREATE 子句称为终端子句。当 Cypher 查询以终端子句结尾时,cypher 函数调用不会返回任何结果。但是,cypher 函数调用仍然需要列定义列表as (a agtype)。当 cypher 以终端节点结尾时,在列定义列表中定义一个值即可:该变量不会返回任何数据。

查询

SELECT *
FROM cypher('graph_name', $$
    CREATE /* 此处为 Create 子句,后面没有其他子句 */
$$) as (a agtype);
a
返回 0 行

创建单个顶点

通过以下查询创建单个顶点。

查询

SELECT *
FROM cypher('graph_name', $$
    CREATE (n)
$$) as (v agtype);

此查询不返回任何内容。

 v
---
(0 rows)

创建多个顶点

通过逗号分隔来创建多个顶点。

查询

SELECT *
FROM cypher('graph_name', $$
    CREATE (n), (m)
$$) as (v agtype);

结果

 v
---
(0 rows)

创建带标签的顶点

创建顶点时添加标签,使用以下语法:

查询

SELECT *
FROM cypher('graph_name', $$
    CREATE (:Person)
$$) as (v agtype);

此查询不返回任何内容。

结果

 v
---
(0 rows)

创建带标签和属性的顶点

可以同时创建带标签和属性的顶点。

查询

SELECT *
FROM cypher('graph_name', $$
    CREATE (:Person {name: 'Andres', title: 'Developer'})
$$) as (n agtype);

此查询不返回任何内容。

结果

 n
---
(0 rows)

返回创建的节点

可以在同一查询中创建并返回节点:

查询

SELECT *
FROM cypher('graph_name', $$
    CREATE (a {name: 'Andres'})
    RETURN a
$$) as (a agtype);

返回新创建的节点。

结果

                                       a
--------------------------------------------------------------------------------
 {"id": 281474976710660, "label": "", "properties": {"name": "Andres"}}::vertex
(1 row)                                                 

创建自环

要创建一个顶点指向自身的边(边的startidendid相同),有两种创建方式。

  • 使用CREATE创建时,直接创建
  • 使用MATCH 匹配顶点之后,然后创建。

查询

SELECT *
FROM cypher('graph_name', $$
    CREATE (a)-[e:RELTYPE]->(a)
    RETURN e
$$) as (e agtype);

结果

                                                               e
-------------------------------------------------------------------------------------------------------------------------------
 {"id": 28428972647776257, "label": "RELTYPE", "end_id": 281474976710661, "start_id": 281474976710661, "properties": {}}::edge
(1 row)

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (a:Person)
    CREATE (a)-[e:RELTYPE]->(a)
    RETURN e
$$) as (e agtype);

结果

                            e                                      
 --------------------------------------------------------------------- 
 {id: 0; startid: 0, endid: 0; label: 'RELTYPE'; properties: {}}::edge 
(1 row)                                                               

在两个节点之间创建边

要在两个顶点之间创建边,首先使用 MATCH 匹配这两个顶点,然后在它们之间创建边。

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (a:Person), (b:Person)
    WHERE a.name = 'Node A' AND b.name = 'Node B'
    CREATE (a)-[e:RELTYPE]->(b)
    RETURN e
$$) as (e agtype);

查询返回创建的边。

结果

e
{id: 3; startid: 0, endid: 1; label: 'RELTYPE'; properties: {}}::edge
(1 row)

创建边并设置属性

在边上设置属性的方式与在创建顶点时设置属性类似。注意,值可以是任意表达式。

查询

SELECT *
FROM cypher('graph_name', $$
    MATCH (a:Person), (b:Person)
    WHERE a.name = 'Node A' AND b.name = 'Node B'
    CREATE (a)-[e:RELTYPE {name:a.name + '<->' + b.name}]->(b)
    RETURN e
$$) as (e agtype);

查询返回新创建的边。

结果

e
{id: 3; startid: 0, endid: 1; label: 'RELTYPE'; properties: {name: 'Node A<->Node B'}}::edge
(1 row)

创建完整路径

使用 CREATE 和模式时,所有在当前作用域中不存在的部分都将被创建。

查询

SELECT *
FROM cypher('graph_name', $$
    CREATE p = (andres {name:'Andres'})-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael {name:'Michael'})
    RETURN p
$$) as (p agtype);

此查询同时创建三个节点和两个关系,将模式赋值给路径变量,并返回该模式。

结果

p
[{id:0; label: ''; properties:{name:'Andres'}}::vertex, {id: 3; startid: 0, endid: 1; label: 'WORKS_AT'; properties: {}}::edge, {id:1; label: ''; properties: }::vertex, {id: 3; startid: 2, endid: 1; label: 'WORKS_AT'; properties: {}}::edge, {id:2; label: ''; properties: {name:'Michael'}}::vertex]::path
(1 row)