圖數據庫之Cypher語言

1、什麼是Cypher
2、寫(create、merge、set、delete、remove、foreach、import)
3、讀(match、optional match、where、start、聚合)
4、常規(return、order by、limit、skip、with、unwind、union)
5、函數(謂詞、標準函數、集合函數、數學函數、字符串函數)
6、模式(索引、約束、統計)

1、什麼是Cypher
Cypher是一種聲明式圖查詢語言,表達高效查詢和更新圖數據庫。Cypher是相對簡單的查詢語法,它讓我們更關注業務領域問題。

2、寫
Create:
創建單個節點(注意有個空格):create (n)
創建帶標籤的節點(ID:n,label:Person):create (n:Person)
創建帶兩個標籤的節點:create (n:Person:Student)
創建帶標籤、屬性的節點: create (n:Person {name:"weiw",age:23})
返回創建的節點:create (a {name:"Tom"}) return a
創建關係(兩個節點之間的關係):
match (a:Person),(b:Person) where a.name="zhangs" and b.name="lisi"  create (a)-[r:RELTYPE]->(b) return r
創建關係的同時設置屬性:
match (a:Person),(b:Person) where a.name="zhangs" and b.name="lisi" 
create (a)-[r:RELTYPE {name:a.name +"<->" + b.name}]->(b) return r
完整創建:三個節點兩個關係
create p=(an {name:"an"})-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(mach {name:"mach"}) return p;

Merge:
對不存在的節點創建,存在的節點返回。
merge (robert:Critic) return robert,labels(robert);    
單個屬性節點:merge (charlie {name:"Charlie",age:10}) return charlie;
帶標籤和屬性的單個節點:merge (michel:Person {name:"michelDoug"}) return michel;
如果要創建節點就設置屬性:merge on create
merge (keanu:Person {name:"Keanu"}) on create  set keanu.created=timestamp() return keanu;
如果找到節點就設置屬性:merge on match
merge (person:Person) on  match set person.found=true return person;


如果找到就設置屬性,沒找到創建節點並設置屬性:merge on create on match:
merge (keanu:Person {name:"Keanu"}) on create set keanu.created=timestamp() on match set keanu.lastSeen=timestamp() return keanu;

merge on match 多個屬性,如果沒有屬性則創建:
merge (person:Person) on match set person.found=true,person.lastAccessed=timestamp() return person;
merge 關係:
match (charlie:Person {name:"Charlie"}),(wall:Movie {title:"Wall"})
merge (charlie)-[r:ACTED_AT]->(wall)  return r;
merge多重關係:
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 上使用唯一性約束:
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 ;

Set:
用於更新一個節點和關係的標籤或屬性。
create (n { name: 'Andres' }) ;
MATCH (n { name: 'Andres' }) SET n.surname = 'Taylor' RETURN n;
刪除屬性:MATCH (n { name: 'Andres' })  SET n.name = NULL RETURN n
在節點和關係之間複製屬性:MATCH (at { name: 'Andres' }),(pn { name: 'Peter' }) SET at = pn RETURN at, pn;
從map添加屬性:MATCH (peter { name: 'Peter' }) SET peter += { hungry: TRUE , position: 'Entrepreneur' }
設置多個屬性: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 

DELETE:
刪除節點和關係
刪除單個節點:MATCH (n:Useless) DELETE n;
刪除節點和連接它的關係:MATCH (n { name: 'Andres' })-[r]-() DELETE n, r
刪除所有節點和關係:MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r

REMOVE:
刪除標籤和屬性
刪除屬性:MATCH (andres { name: 'Andres' }) REMOVE andres.age RETURN andres;
刪除節點的標籤:MATCH (n { name: 'Peter' }) REMOVE n:German RETURN n;
刪除多重標籤:MATCH (n { name: 'Peter' }) REMOVE n:German:Swedish RETURN n

FOREACH:
爲所有節點設置mark屬性:MATCH p =(begin)-[*]->(END ) WHERE begin.name='A' AND END .name='D' FOREACH (n IN nodes(p)| SET n.marked = TRUE )

CREATE UNIQUE:
創建唯一性節點:MATCH (root { name: 'root' }) CREATE UNIQUE (root)-[:LOVES]-(someone) RETURN someone

IMPORT CSV:
LOAD CSV WITH HEADERS FROM "http://neo4j.com/docs/2.2.3/csv/import/persons.csv" AS csvLine CREATE (p:Person { id: toInt(csvLine.id), name: csvLine.name }) 
id,name 
1,Charlie Sheen 
2,Oliver Stone 
3,Michael Douglas 
4,Martin Sheen 
5,Morgan Freeman 

3、讀
MATCH:
查詢所有節點:MATCH (n) RETURN n
查詢指定標籤的節點:MATCH (movie:Movie) RETURN movie;
關聯節點:MATCH (director { name:'Oliver Stone' })--(movie) RETURN movie.title
查詢標籤:MATCH (charlie:Person { name:'Charlie Sheen' })--(movie:Movie) RETURN movie
關係查詢:MATCH (martin { name:'Martin Sheen' })-->(movie) RETURN movie.title
MATCH (martin { name:'Martin Sheen' })-[r]->(movie) RETURN r 
通過關係類型查詢:MATCH (wallstreet { title:'Wall Street' })<-[:ACTED_IN]-(actor) RETURN actor

OPTIONAL MATCH:
與match類似,只是如果沒有匹配上,則將使用null作爲沒有匹配上的模式。類似於SQL中的外連接。
匹配關係:match (a:Movie {title:"Wall Street"}) optional match (a)-->(x) return x;  如果沒有返回null。
匹配屬性:match (a:Movie {title:"Wall Street"}) optional match (a)-->(x) return x,x.name

WHERE: 
MATCH (n)  WHERE n.name = 'Peter' XOR (n.age < 30 AND n.name = "Tobias") OR NOT (n.name = "Tobias" OR n.name="Peter") 
RETURN n;
過濾標籤:MATCH (n)  WHERE n:Swedish  RETURN n;
過濾屬性:MATCH (n)  WHERE n.age < 30  RETURN n;
MATCH (n)  WHERE HAS (n.belt)  RETURN n;
正則:MATCH (n)  WHERE n.name =~ 'Tob.*'  RETURN n;
在where中使用pattern:
MATCH (tobias { name: 'Tobias' }),(others)  WHERE others.name IN ['Andres', 'Peter'] AND (tobias)<--(others)   RETURN others
使用not:MATCH (persons),(peter { name: 'Peter' })  WHERE NOT (persons)-->(peter)  RETURN persons
使用屬性:MATCH (n)  WHERE (n)-[:KNOWS]-({ name:'Tobias' })  RETURN n
關係類型:MATCH (n)-[r]->()  WHERE n.name='Andres' AND type(r)=~ 'K.*'  RETURN r
使用IN:MATCH (a)  WHERE a.name IN ["Peter", "Tobias"]  RETURN a
MATCH (n)  WHERE n.belt = 'white'  RETURN n
MATCH (n)  WHERE n.belt = 'white' OR n.belt IS NULL RETURN n  ORDER BY n.name
過濾NULL:MATCH (person)  WHERE person.name = 'Peter' AND person.belt IS NULL RETURN person

START:
START n=node:nodes(name = "A")  RETURN n
START r=relationship:rels(name = "Andrés")  RETURN r
START n=node:nodes("name:A")  RETURN n

聚合函數:
count:MATCH (n { name: 'A' })-->(x)  RETURN n, count(*)
sum:MATCH (n:Person)  RETURN sum(n.property)
avg:MATCH (n:Person)  RETURN avg(n.property)
percentileDisc:計算百分位。MATCH (n:Person)  RETURN percentileDisc(n.property, 0.5)
percentileCont:MATCH (n:Person)  RETURN percentileCont(n.property, 0.4)
stdev:計算標準偏差。MATCH (n)  WHERE n.name IN ['A', 'B', 'C'] RETURN stdev(n.property)
stdevp:MATCH (n) WHERE n.name IN ['A', 'B', 'C']  RETURN stdevp(n.property)
max:MATCH (n:Person) RETURN max(n.property)
min:MATCH (n:Person)  RETURN min(n.property)
collect:MATCH (n:Person) RETURN collect(n.property)
distinct:MATCH (a:Person { name: 'A' })-->(b) RETURN count(DISTINCT b.eyes)


4、常規
RETURN:

返回一個節點:match (n {name:"B"}) return n;
返回一個關係:match (n {name:"A"})-[r:KNOWS]->(c) return r;
返回一個屬性:match (n {name:"A"}) return n.name;
返回所有節點:match p=(a {name:"A"})-[r]->(b) return *;
列別名: match (a {name:"A"}) return a.age as thisisage;
表達式: match (a {name:"A"}) return a.age >30 ,"literal",(a)-->();
唯一結果:match (a {name:"A"})-->(b) return distinct b;

ORDER BY:

通過屬性排序所有節點:match (n) return n order by n.name;
多個屬性排序:match (n) return n order n.name,n.age;
指定排序方式:match (n) return n order by n.name desc;
NULL值的排序:match (n) return n.length,n order by n.length;

LIMIT:

match (n) return n order by n.name limit 3;

SKIP:
match (n) return n order by n.name skip 3;
match (n) return n order by n.name skip 1 limit 3;

WITH:

過濾聚合函數的結果:
MATCH (david { name: "David" })--(otherPerson)-->()  WITH otherPerson, count(*) AS foaf 
WHERE foaf > 1  RETURN otherPerson;
collect前排序結果:MATCH (n)  WITH n   ORDER BY n.name DESC LIMIT 3  RETURN collect(n.name;
limit搜索路徑的分支:
MATCH (n { name: "Anders" })--(m)  WITH m 
ORDER BY m.name DESC LIMIT 1  MATCH (m)--(o)  RETURN o.name;

UNWIND:
將一個集合展開爲一個序列:unwind[1,2,3] as x return x;
創建一個去重的集合:with [1,1,2,3] as coll unwind coll x with distinct x return collect(x) as set;

UNION & UNION ALL:

不刪除重複:match (n:Actor) return n.name as name union all match(n:Movie) return b.title as name;
刪除重複:match (n:Actor) return n.name as name union match(n:Movie) return b.title as name;


5、函數
謂詞:
ALL:ALL(identifier in collection WHERE predicate)
ANY:ANY(identifier in collection WHERE predicate)
MATCH (a)  WHERE a.name='Eskil' AND ANY (x IN a.array WHERE x = "one")   RETURN a
NONE:NONE(identifier in collection WHERE predicate)
SINGLE:SINGLE(identifier in collection WHERE predicate)
EXISTS:EXISTS( pattern-or-property )
MATCH (n)
WHERE EXISTS(n.name)
RETURN n.name AS name, EXISTS((n)-[:MARRIED]->()) AS is_married

Scalar function:
length:返回集合長度。match p=(a)-->(b)-->(c) where a.name="Alice" return length(p)
type:關係類型。match (n)-[r]->() where n.name='Alice' return type(r)
id:返回節點或關係的id。match (a) return id(a)
coalesce:返回第一個not null值。match (a) where a.name='Alice' return coalesce(a.hairColor,a.eyes)
head:返回集合的第一個元素。match (a) where a.name='Alic' return a.array,head(a.array);
last:返回集合的最後一個元素。match (a) where a.name='Alic' return a.array,last(a.array);
timestamp:返回當前時間的毫秒
startNode:返回一個關係的開始節點。match (x:foo)-[r]-() return startNode(r);
endNode:返回一個關係的結束節點。match (x:foo)-[r]-() return endNode(r);
toInt,toFloat,toString

集合函數:
nodes(path):返回path中節點。match p=(a)-->(b)-->(c) where a.name='Alice' and c.name='Eskil' return nodes(p)
relationships(path):返回path中的關係。match p=(a)-->(b)-->(c) where a.name='Alice' and c.name='Eskil' return relationships(p)
labels:返回節點標籤。match (a) where a.name='Alice' return labels(a);
keys:返回節點的所有屬性。match (a) where a.name='Alice' return keys(a);
extract:從一個節點或關係集合中返回單個屬性或值的集合。EXTRACT( identifier in collection | expression )
MATCH p=(a)-->(b)-->(c)
WHERE a.name='Alice' AND b.name='Bob' AND c.name='Daniel'
RETURN extract(n IN nodes(p)| n.age) AS extracted
filter:FILTER(identifier in collection WHERE predicate)
tail:返回集合中的非第一個元素的集合。
range:RANGE( start, end [, step] ) 。RETURN range(0,10), range(2,18,3)
reduce:REDUCE( accumulator = initial, identifier in collection | expression )。將滿足條件的節點的age屬性值求和。
MATCH p=(a)-->(b)-->(c)
WHERE a.name='Alice' AND b.name='Bob' AND c.name='Daniel'
RETURN reduce(totalAge = 0, n IN nodes(p)| totalAge + n.age) AS reduction

數學函數:
abs(),acos(),asin(),atan(),atan2(x,y),cos(),cot(),degree(),e()返回一個常量,exp(2) e的二次方,floor(0.9)=0.0,
haversin(),log(),log10(),pi()常量PI,radians(180),rand()返回0到1.0的值,round(3.14)=3.0,sign(),sin(),sqrt(),tan()

字符串函數:
str(1)="1",replace("hello",'l','w')=hewwo,substring('hello',1,3)="ell",substring("hello",2)="llo",left("hello",3)="hel",
right("hello",3)="llo",ltrim("    hello")="hello",rtrim("hello   ")="hello",trim("   hello   ")="hello",lower("HELLO")="hello",
upper("hello")="HELLO",split("one,two",",")=["one","two"]


6、模式(索引、約束、統計)
索引:
標籤上創建索引:create index on :Person(name)
drop index on :Person(name)

約束:
創建唯一約束:CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE
刪除約束:DROP CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章