美文网首页
Cypher语法关键字(二)CREATE、MERGE、CREAT

Cypher语法关键字(二)CREATE、MERGE、CREAT

作者: 数据的艺术2 | 来源:发表于2020-06-30 22:14 被阅读0次

    cypher关键字

    cypher关键字可分为三类。

    • 读关键字:MATCH、OPTIONAL MATCH、WHERE、START、Aggregation和LOAD CSV
    • 写关键字:CREATE、MERGE、SET、DELETE、REMOVE、FOREACH和CREATE UNIQUE
    • 通用关键字:RETURN、ORDER BY、LIMIT、SKIP、WITH、UNWIND、UNION和CALL

    1,CREATE

    CREATE语句用于创建图元素:节点和关系、索引。

    创建节点

    //创建单个节点
    CREATE (n)
    
    //创建多个节点
    CREATE (n),(m)
    
    //创建带有标签的节点
    CREATE (p:Person)
    
    //创建同时带有标签和属性的节点
    CREATE (p:Person { name: 'Andres', title: 'Developer' })
    

    创建关系

    //创建两个节点之间的关系:关系必须有箭头指向
    MATCH (a:Person),(b:Person)
    WHERE a.name = 'NodeA' AND b.name = 'NodeB'
    CREATE (a)-[r:RELTYPE]->(b)
    RETURN r
        
    //创建关系并设置属性
    MATCH (a:Person),(b:Person)
    WHERE a.name = 'NodeA' AND b.name = 'NodeB'
    CREATE (a)-[r:RELTYPE{ name: 'abc' }]->(b)
    RETURN r
    
    //创建一个完整路径:当使用CREATE和模式时,模式中所有还不存在的部分都会被创建
    CREATE p =(andres { name:'Andres' })-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael { name: 'Michael' })
    RETURN p
    

    创建索引

    CREATE INDEX ON :Person(name)
    

    2,MERGE

    ​ MERGE可以确保图数据库中存在某个特定的模式(pattern)。如果该模式不存在,那就创建它。

    MERGE 节点

    //合并带标签的节点:如果没有包含Ctritic标签的节点,就会创建一个新节点。
    MERGE (robert:Critic)
    RETURN robert, labels(robert)
    
    //合并带多个属性的单个节点
    MERGE (charlie { name: 'Charlie Sheen', age: 10 })
    RETURN charlie
    
    //合并同时指定标签和属性的节点
    MERGE (michael:Person { name: 'Michael Douglas' bornIn:'newyork'})
    RETURN michael.name, michael.bornIn
    
    //合并属性来自已存在节点的单个节点
    MATCH (person:Person{ bornIn:'newyork'})
    MERGE (city:City { name: person.bornIn })
    RETURN person.name, person.bornIn, city    
    

    MERGE在CREATE和MATCH中的使用

    //MERGE与CREATE搭配:检查节点是否存在,如果不存在则创建它并设置属性
    MERGE (keanu:Person { name: 'Keanu Reeves' })
    ON CREATE SET keanu.created = timestamp()
    RETURN keanu.name, keanu.created
    
    //MERGE与MATCH搭配:匹配节点,并在找到的节点上设置属性。
    MERGE (person:Person { name: 'Keanu Reeves2' })
    ON MATCH SET person.found = TRUE 
    RETURN person.name, person.found
    
    //MERGE与CREATE和MATCH同时使用:检查节点是否存在,如果不存在则创建它并设置created属性,如果存在就修改lastSeen属性。
    MERGE (keanu:Person { name: 'Keanu Reeves' })
    ON CREATE SET keanu.created = timestamp()
    ON MATCH SET keanu.lastSeen = timestamp()
    RETURN keanu.name, keanu.created, keanu.lastSeen
    

    MERGE关系

    //匹配或者创建关系:使用MERGE去匹配或者创建关系时,必须至少指定一个绑定的节点。
    MATCH (p:Person { name: 'Charlie Sheen' }),(m:Movie { title: 'The Matrix' }) 
    MERGE (p)-[r:ACTED_IN]->(m)
    RETURN p.name, type(r), m.title
    
    //合并多个关系:当MERGE应用于整个模式时,要么全部匹配上,要么全部新创建。
    MATCH (oliver:Person { name: 'Lilly Wachowski' }),(reiner:Person { name: 'Rob Reiner' })
    MERGE (oliver)-[:DIRECTED]->(movie:Movie)<-[:ACTED_IN]-(reiner)
    RETURN movie
    
    //合并无方向关系:MERGE也可以用于合并无方向的关系。当需要创建一个关系的时候,它将选择一个任意的方向。
    MATCH (p1:Person { name: 'Charlie Sheen' }),(p2:Person { name: 'Lilly Wachowski' })
    MERGE (p1)-[r:KNOWS]-(p2)
    RETURN r
    
    //合并已存在两节点之间的关系:MERGE可用于连接前面的MATCH和MERGE语句。
    MATCH (person:Person { name: 'riky' })
    MERGE (city:City { name: person.bornIn })
    MERGE (person)-[r:BORN_IN]->(city)
    RETURN person.name, person.bornIn, city
    
    //同时合并\创建一个新节点和关系
    MATCH (person:Person{name: 'Demi Moore'})
    MERGE (person)-[r:HAS_CHAUFFEUR]->(chauffeur:Chauffeur { name: person.name })
    RETURN person.name, person.chauffeurName, chauffeur
    

    MERGE的唯一性约束

    ​ 当使用的模式涉及唯一性约束时,Cypher可以通过MERGE来防止获取相冲突的结果。

    ​ 下面的例子在Person的name属性上创建一个唯一性约束。

    CREATE CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE;
    
    //如果节点未找到,使用唯一性约束创建该节点
    MERGE (laurence:Person { name: 'Laurence Fishburne' })
    RETURN laurence.name
    
    //唯一性约束与部分匹配:当只有部分匹配时,使用唯一性约束合并将失败。
    CREATE CONSTRAINT ON (n:Person) ASSERT n.role IS UNIQUE;
    CREATE (alisanda:Person { name: 'alisanda', role: 'Gordon Gekko' })
    
    MERGE (michael:Person { name: 'Michael Douglas', role: 'Gordon Gekko' })
    RETURN michael
    //错误消息:Node(1578733) already exists with label `Person` and property `role` = 'Gordon Gekko'
    

    CREATE UNIQUE

    ​ CREATE UNIQUE语句相当于MATCH和CREATE的混合体—尽可能地匹配,然后创建未匹配到的。

    ​ 可能会想到用MERGE来代替CREATE UNIQUE,然而MERGE并不能很强地保证关系的唯一性。

    创建唯一节点

    //创建未匹配到的节点:root节点没有任何LOVES关系。因此,创建了一个节点及其与root节点的LOVES关系。注意这里可以不指定关系方向
    MATCH (root { name: 'root' })
    CREATE UNIQUE (root)-[:LOVES]-(someone)
    RETURN someone
    
    //用含值的模式创建节点:没有与root节点相连的name为D的节点,所以创建一个新的节点来匹配该模式。
    MATCH (root { name: 'A' })
    CREATE UNIQUE (root)-[:X]-(leaf { name: 'D' })
    RETURN leaf
    
    //创建未匹配到带标签的节点
    MATCH (a { name: 'Node A' })
    CREATE UNIQUE (a)-[:KNOWS]-(c:blue)
    RETURN c
    

    创建唯一关系

    //创建未匹配到的关系:匹配一个左节点和两个右节点之间的关系。其中一个关系已存在,因此能匹配到。然后创建了不存在的关系。
    MATCH (lft { name: 'A' }),(rgt)
    WHERE rgt.name IN ['B', 'C']
    CREATE UNIQUE (lft)-[r:KNOWS]->(rgt)
    RETURN lft, rgt
    
    //用含值的模式创建关系
    MATCH (root { name: 'root' })
    CREATE UNIQUE (root)-[r:X { since: 'forever' }]-()
    RETURN r
    
    //描述复杂模式
    MATCH (root { name: 'root' })
    CREATE UNIQUE (root)-[:FOO]->(x),(root)-[:BAR]->(x)
    RETURN x
    

    SET

    ​ SET语句用于更新节点的标签以及节点和关系的属性。

    //设置属性
    MATCH (n { name: ' Taylor Hackford' })
    SET n.surname = 'Taylor'
    RETURN n
    
    //删除属性
    MATCH (n { name: 'Taylor Hackford' })
    SET n. surname = NULL 
    RETURN n
    
    //在节点和关系间拷贝属性
    MATCH (at { name: 'Andres' }),(pn { name: 'Peter' })
    SET at = pn
    RETURN at, pn
    
    //从map中添加属性:当用map来设置属性时,可以使用+=形式的SET来只添加属性,而不删除图元素中已存在的属性。
    MATCH (peter { name: 'Peter' })
    SET peter += { hungry: TRUE , position: 'Entrepreneur' }
    
    //使用一个SET语句设置多个属性
    MATCH (n { name: 'Andres' })
    SET n.position = 'Developer', n.surname = 'Taylor'
    
    //设置节点的标签
    MATCH (n { name: 'Stefan' })
    SET n :German
    RETURN n
    
    //给一个节点设置多个标签
    MATCH (n { name: 'Emil' })
    SET n :Swedish:Bossman
    RETURN n
    

    相关文章

      网友评论

          本文标题:Cypher语法关键字(二)CREATE、MERGE、CREAT

          本文链接:https://www.haomeiwen.com/subject/tmbfqktx.html