美文网首页
Nosql-neo4j-Cypher 语句 (5)

Nosql-neo4j-Cypher 语句 (5)

作者: Viterbi | 来源:发表于2022-09-18 08:14 被阅读0次

    目录: [TOC]

    MERGE

    MERGE确保模式在graph中存在,要么已经存在要么创建
    MERGE是MATCH和CREATE结合
    为了性能考虑,在标签和属性创建索引是推荐使用MERGE
    当MERGE使用在全模式时候,要么全部匹配,要么全部创建;MERGE不会部分匹配,要么nothing要么all;如果需要匹配部分,建议分开使用MERGE
    CREATE INDEX PersonIndex FOR (n:Person) ON (n.name)创建所以提高MERGE性能
    Cypher不能创建null的属性 MERGE和ON CREATE和ON MATCH,如果创建则,如果匹配则

    MERGE节点

    //创建单个节点
    MERGE (robert:Critic)
    RETURN robert, labels(robert)
    
    //MERGE带属性的节点
    MERGE (charlie { name: 'Charlie Sheen', age: 10 })
    RETURN charlie
    
    //MERGE带标签和属性的节点
    MERGE (michael:Person { name: 'Michael Douglas' })
    RETURN michael.name, michael.bornIn
    
    //从已有的节点MERGE节点
    //节点City只会创建一个
    MATCH (person:Person)
    MERGE (city:City { name: person.bornIn })
    RETURN person.name, person.bornIn, city
    
    

    Use ON CREATE and ON MATCH

    • 如果有节点和属性,其他属性将被创建
    • 如果没有这个节点,创建并创建属性
    //没有则创建节点,并设置节点属性
    MERGE (keanu:Person { name: 'Keanu Reeves' })
    ON CREATE SET keanu.created = timestamp()
    RETURN keanu.name, keanu.created
    
    //没有则创建,并设置节点属性
    MERGE (person:Person)
    ON MATCH SET person.found = TRUE 
    RETURN person.name, person.found
    
    //有这个属性则不变
    // 没有则穿创建
    MERGE (keanu:Person { name: 'Keanu Reeves' }) //这个节点已经存储所以是MATCH
    ON CREATE SET keanu.created = timestamp() 
    ON MATCH SET keanu.lastSeen = timestamp() //这条语句会执行
    RETURN keanu.name, keanu.created, keanu.lastSeen
    //上面这条语句是如果只创建的节点,这走ON CREATE,如果是MATCH则走ON MATCH
    
    //MERGE ON MATCH 设置多个属性
    MERGE (person:Person)
    ON MATCH SET person.found = TRUE , person.lastAccessed = timestamp()
    RETURN person.name, person.found, person.lastAccessed
    
    

    MERGE关系

    //MERGE一个关系
    MATCH (charlie:Person { name: 'Charlie Sheen' }),(wallStreet:Movie { title: 'Wall Street' })
    MERGE (charlie)-[r:ACTED_IN]->(wallStreet)
    RETURN charlie.name, type(r), wallStreet.title
    
    //MERGE多个关系
    //下面这个会创建新的Movie节点
    MATCH (oliver:Person { name: 'Oliver Stone' }),(reiner:Person { name: 'Rob Reiner' })
    MERGE (oliver)-[:DIRECTED]->(movie:Movie)<-[:ACTED_IN]-(reiner)
    RETURN movie
    
    //MERGE无向关系
    //当没有时候,这创建这个关系,会随机加入方向
    MATCH (charlie:Person { name: 'Charlie Sheen' }),(oliver:Person { name: 'Oliver Stone' })
    MERGE (charlie)-[r:KNOWS]-(oliver)
    RETURN r
    
    
    
    //MERGE已经存在的两个j节点
    MATCH (person:Person)
    MERGE (city:City { name: person.bornIn })
    MERGE (person)-[r:BORN_IN]->(city)
    RETURN person.name, person.bornIn, city
    
    //MERGE存在的节点和MERGE的节点
    MATCH (person:Person)
    MERGE (person)-[r:HAS_CHAUFFEUR]->(chauffeur:Chauffeur { name: person.chauffeurName })
    RETURN person.name, person.chauffeurName, chauffeur
    
    

    MERGE时使用唯一约束

    为了MERGE冲突的结果,引入唯一约束,使得最多一个节点匹配

    //创建约束
    CREATE CONSTRAINT ON (n:Person) ASSERT n.name IS UNIQUE;
    CREATE CONSTRAINT ON (n:Person) ASSERT n.role IS UNIQUE;
    
    //
    MERGE (laurence:Person { name: 'Laurence Fishburne' })
    RETURN laurence.name
    
    

    本文使用 文章同步助手 同步

    相关文章

      网友评论

          本文标题:Nosql-neo4j-Cypher 语句 (5)

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