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) MERGE与CREATE搭配
检查节点是否存在,如果不存在则创建它并设置属性。
MERGE (keanu:Person { name: 'Keanu Reeves' }) ON CREATE SET keanu.created = timestamp() RETURN keanu.name, keanu.created |
本查询创建了keanu节点,并设置created属性为创建的时间戳。
(2)MERGE与MATCH搭配
匹配节点,并在找到的节点上设置属性。
MERGE (person:Person { name: 'Keanu Reeves2' }) ON MATCH SET person.found = TRUE RETURN person.name, person.found |
(3) MERGE与CREATE和MATCH同时使用
检查节点是否存在,如果不存在则创建它并设置属性。
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)利用Merge和MATCH设置多属性
如果需要设置多个属性,将它们简单地以逗号分开即可。
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 |