Cypher語法關鍵字(二)CREATE、MERGE、CREATE UNIQUE、SET

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
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。