当前位置: 代码迷 >> 综合 >> neo4j--Cypher语法练习(START、CREATE、MERGE)
  详细解决方案

neo4j--Cypher语法练习(START、CREATE、MERGE)

热度:60   发布时间:2023-11-17 22:14:59.0

1.5 START

通过遗留索引(legacy index)查找开始点。START语句应当仅用于访问遗留的索引。所有其他的情况,都应使用MATCH代替,从Cyper3.2开始START语句已经被废弃。

(1)通过索引获取节点

     当采用复杂的Lucene查询来查找开始点时,语法 为:node:index-name("query")。这样可以写出很高级的索引查询出来。

START n = node:nodes("name:A")

RETURN n

(2)通过索引获取关系

     当采用索引搜索查找开始点时,可以像这样做:relationship:index-name(key = "value")。在本例中存在一个名为rels的关系索引。

START r = relationship:rels(name = 'Andres')

RETURN r

1.6 CREATE

1.6.1 创建节点

(1)创建单个节点

CREATE(n)

(2)创建多个节点

CREATE (n), (m)

(3)创建带有标签的节点

CREATE (n:Person)

(4)创建带有多个标签的节点

CREATE (n:Person:Swedish)

(5)创建同时带有标签和属性的节点

CREATE (n:Person { name: 'Andres', title: 'Developer' })

(7)返回创建的节点

CREATE (a { name: 'Andres' })

RETURN a

1.6.2 创建关系

 (1) 创建两个节点之间的关系。

CREATE (n:Person {name: 'Node A'}),(n1:Person {name: 'Node B'})

MATCH (a:Person),(b:Person)

WHERE a.name = 'Node A' AND b.name = 'Node B'

CREATE (a)-[r:RELTYPE]->(b)

RETURN r

 

Match (n)-[r]-(m)

     注意:关系必须有箭头指向

 (2) 创建关系并设置属性

MATCH (a:Person),(b:Person)

WHERE a.name = 'Node A' AND b.name = 'Node B'

CREATE (a)-[r:RELTYPE { name: 'abc' }]->(b)

RETURN r

 (3) 创建一个完整路径

      当使用CREATE和模式时,模式中所有还不存在的部分都会被创建。

CREATE p =(andres { name:'Andres' })-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael { name: 'Michael' })

RETURN p

 1.6.3 创建索引

      CREATE INDEX ON :Person(name)

1.7  MERGE

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

1.7.1 MERGE节点

 (1)合并带标签的节点

     下面的例子合并给定标签的节点。

MERGE (robert:Critic)

RETURN robert, labels(robert)

      因为没有包含Ctritic标签的节点,一个新节点在数据库中创建了。

 (2) 合并带多个属性的单个节点

     合并有多个属性但并不是所有属性都匹配到已存在节点的单个节点。

MERGE (charlie { name: 'Charlie Sheen', age: 10 })

RETURN charlie

    名为'Charlie Sheen'新节点创建了,因为不是所有属性都在已存在的'Charlie Sheen'节点上匹配到了。

(3)合并同时指定标签和属性的节点

MERGE (michael:Person { name: 'Michael Douglas', bornIn:'newyork'})

RETURN michael.name, michael.bornIn

     

 'Michael Douglas'节点被匹配到。同时返回它的name和bornIn属性。

(4)合并属性来自已存在节点的单个节点

       当每个绑定节点的属性’p’来自一个节点集时,如果’p’存在重复,创建的时候只会创建一次。

MERGE (riky:Person { name: 'riky', bornIn:'newyork'})

RETURN riky.name, riky.bornIn

 

MATCH (person:Person{ bornIn:'newyork'})

MERGE (city:City { name: person.bornIn })

RETURN person.name, person.bornIn, city

 

1.7.2 MERGE在CREATE和MATCH中的使用

(1) MERGECREATE搭配

      检查节点是否存在,如果不存在则创建它并设置属性。

MERGE (keanu:Person { name: 'Keanu Reeves' })

ON CREATE SET keanu.created = timestamp()

RETURN keanu.name, keanu.created

   

本查询创建了keanu节点,并设置created属性为创建的时间戳。

(2)MERGEMATCH搭配

      匹配节点,并在找到的节点上设置属性。

MERGE (person:Person { name: 'Keanu Reeves2' })

ON MATCH SET person.found = TRUE

RETURN person.name, person.found

     

(3) MERGE与CREATEMATCH同时使用

     检查节点是否存在,如果不存在则创建它并设置属性。

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

(4)利用MergeMATCH设置多属性

      如果需要设置多个属性,将它们简单地以逗号分开即可。

MERGE (person:Person)

ON MATCH SET person.found = TRUE , person.lastAccessed = timestamp()

RETURN person.name, person.found, person.lastAccessed

1.7.3 MERGE关系

     (1) MERGE可用于匹配或者创建关系。

MATCH (charlie:Person { name: 'Charlie Sheen' }),(wallStreet:Movie { title: 'The Matrix' })

MERGE (charlie)-[r:ACTED_IN]->(wallStreet)

RETURN charlie.name, type(r), wallStreet.title

      因为"Charlie Sheen"已经在"The Matrix"参演了,所以找到已存的关系并返回。注意:使用MERGE去匹配或者创建关系时,必须至少指定一个绑定的节点。

  (2)合并多个关系

     当MERGE应用于整个模式时,要么全部匹配上,要么全部新创建。

MATCH (oliver:Person { name: 'Lilly Wachowski' }),(reiner:Person { name: 'Rob Reiner' })

MERGE (oliver)-[:DIRECTED]->(movie:Movie)<-[:ACTED_IN]-(reiner)

RETURN movie

(3)合并无方向关系

      MERGE也可以用于合并无方向的关系。当需要创建一个关系的时候,它将选择一个任意的方向。

MATCH (charlie:Person { name: 'Charlie Sheen' }),(oliver:Person { name: 'Lilly Wachowski' })

MERGE (charlie)-[r:KNOWS]-(oliver)

RETURN  r

     注意此处可以没有关系方向

(4)合并已存在两节点之间的关系

     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

(5)同时合并\创建一个新节点和关系

      MERGE能够同时创建一个新节点和关系。

MATCH (person:Person{name: 'Demi Moore'})

MERGE (person)-[r:HAS_CHAUFFEUR]->(chauffeur:Chauffeur { name: person.name })

RETURN person.name, person.chauffeurName, chauffeur

1.7.4 用MERGE的唯一性约束

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

 (1)在Person的name上创建一个唯一性约束。

CREATE CONSTRAINT ON (n:Person) ASSERT n.name IS UNIQUE;

 (2)如果节点未找到,使用唯一性约束创建该节点

MERGE (laurence:Person { name: 'Laurence Fishburne' })

RETURN laurence.name

        本查询创建了'laurence'节点。如果'laurence'已经存在,MERGE 仅仅匹配已经存在的节点。

(3)唯一性约束与部分匹配

      当只有部分匹配时,使用唯一性约束合并将失败。

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

 

 

  相关解决方案