Cypher 語法易錯點整理

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 語法

  1. 正則表達式
MATCH (p:Person)
WHERE p.name =~ 'Jo.*'
RETURN p.name
  1. pattern 作為查詢條件
MATCH (p:Person)-[r:IS_FRIENDS_WITH]->(friend:Person)
WHERE p.name = 'Jennifer'
AND NOT exists((friend)-[:WORKS_FOR]->(:Company))
RETURN friend.name
  1. 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
  1. 子查詢
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)
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容