Merge 語法
Merge 語法能夠避免重復創(chuàng)建節(jié)點或者關系,如創(chuàng)建節(jié)點的時候可以避免重復創(chuàng)建
MERGE (mark:Person {name: 'Mark'})
RETURN mark
但是需要注意,創(chuàng)建關系的時候
MATCH (j:Person {name: 'Jennifer'})
MATCH (m:Person {name: 'Mark'})
MERGE (j)-[r:IS_FRIENDS_WITH]->(m)
RETURN j, r, m
如上Cypher語句不會產生重復的節(jié)點,因為首先會通過兩個match,獲取到指定節(jié)點,再查詢是否包含關系,如果不存在關系則創(chuàng)建。
但是如果使用下面這個語句
MERGE (j:Person {name: 'Jennifer'})-[r:IS_FRIENDS_WITH]->(m:Person {name: 'Mark'})
RETURN j, r, m
則會產生重復節(jié)點,因為merge檢查是否存在是針對整個pattern的,當前圖中即使存在了Person {name: 'Jennifer'} 節(jié)點和Person {name: 'Mark'}節(jié)點,但是因為它們之間還未建立連接,因此merge判定該pattern不存在,因此會全部重新創(chuàng)建。
如果要根據Merge時,是重新創(chuàng)建還是match到已有的pattern來update不同的的屬性,可以用on create 和on match ,語法如下
MERGE (m:Person {name: 'Mark'})-[r:IS_FRIENDS_WITH]-(j:Person {name:'Jennifer'})
ON CREATE SET r.since = date('2018-03-01')
ON MATCH SET r.updated = date()
RETURN m, r, j
where 語法
- 正則表達式
MATCH (p:Person)
WHERE p.name =~ 'Jo.*'
RETURN p.name
- pattern 作為查詢條件
MATCH (p:Person)-[r:IS_FRIENDS_WITH]->(friend:Person)
WHERE p.name = 'Jennifer'
AND NOT exists((friend)-[:WORKS_FOR]->(:Company))
RETURN friend.name
- optional match
類似于SQL中的outer join,如果匹配則返回數據,否則返回null
查詢名字開頭為j且可能為某個公司工作的人
MATCH (p:Person)
WHERE p.name STARTS WITH 'J'
OPTIONAL MATCH (p)-[:WORKS_FOR]-(other:Company)
RETURN p.name, other.name
返回結果如下: joe他沒有為一個公司工作,但他依舊返回了,如果去掉optional,則不會返回。

result3.jpg
4 復雜pattern 查詢
//Query1: find who likes graphs besides Jennifer
MATCH (j:Person {name: 'Jennifer'})-[r:LIKES]-(graph:Technology {type: 'Graphs'})-[r2:LIKES]-(p:Person)
RETURN p.name
//Query2: find who likes graphs besides Jennifer that she is also friends with
MATCH (j:Person {name: 'Jennifer'})-[:LIKES]->(:Technology {type: 'Graphs'})<-[:LIKES]-(p:Person),
(j)-[:IS_FRIENDS_WITH]-(p)
RETURN p.name
- 子查詢
MATCH (person:Person)
where exits{
MATCH (person)-[:HAS_DOG]->(:Dog)
WHERE person.name = dog.name
}
RETURN person.name as name
MATCH (person:Person)
where exits{
MATCH (person)-[:HAS_DOG]->(:Dog)
WHERE EXITS{
MATCH (dog)-[:HAS_TOY]->(toy:Toy)
where toy.name = 'Banana'
}
}
RETURN person.name as name
Order by 語法
如果在with后使用order by,則是只在with當前階段進行排序,不保證后續(xù)的有序性
MATCH (n)
WITH n ORDER BY n.age
RETURN collect(n.name) AS names
result:
["C","A","B"]
set 語法
case when
MATCH (n {name:'Andy'})
set (case when n.age=36 then n END).workdsIn = 'Malmo'
return n.name,n.worksIn
添加屬性
MATCH (p {name:'Peter'})
SET p+={age:30,hungry:true,position:'Entrepreneur'}
return p.name,p.age,p.hungry,p.position
設置Label
MATCH (n {name: 'Stefan'})
SET n:German
RETURN n.name, labels(n) AS labels
FOREACH 語法
將路徑上的所有節(jié)點的marked屬性設為True
MATCH p = (start)-[*]->(finish)
WHERE start.name = 'A' and finish.name = 'D'
FOREACH (n IN nodes(p) | SET n.marked = true)