1.15 WITH
WITH語句將分段的查詢部分連接在一起,查詢結果從一部分以管道形式傳遞給另外一部分作爲開始點。
使用WITH可以在將結果傳遞到後續查詢之前對結果進行操作。操作可以是改變結果的形式或者數量。WITH的一個常見用法就是限制傳遞給其他MATCH語句的結果數。通過結合ORDER BY和LIMIT,可獲取排在前面的X個結果。
1.15.1 過濾聚合函數結果
聚合的結果必須要通過WITH語句傳遞才能進行過濾。
MATCH (david { name: 'Tom Hanks' })--()--(otherPerson) WITH otherPerson, count(*) AS foaf WHERE foaf > 1 RETURN otherPerson |
1.15.2 在collect前對結果排序
可以在將結果傳遞給collect函數之前對結果進行排序,這樣就可以返回排過序的列表。
MATCH (n) WITH n ORDER BY n.name DESC LIMIT 3 RETURN collect(n.name) |
1.15.3 限制路徑搜索的分支
可以限制匹配路徑的數量,然後以這些路徑爲基礎再做任何類似的有限制條件的搜索。
MATCH (n { name: 'Tom Hanks' })--(m) WITH m ORDER BY m.name DESC LIMIT 1 MATCH (m)--(o) RETURN o.name |
1.16 FOREACH
FOREACH語句用於循環遍歷結果集列表,然後做一些操作。
列表(lists)和路徑(paths)是Cypher中的關鍵概念。可以使用FOREACH來更新其中的數據。它可以在路徑或者聚合的列表的每個元素上執行更新命令。FOREACH括號中的變量是與外部分開的,這意味着FOREACH中創建的變量不能用於該語句之外。
在FOREACH括號內,可以執行任何的更新命令,包括CREATE,CREATE UNIQUE,DELETE和FOREACH。如果希望對列表中的每個元素執行額外的MATCH命令,使用UNWIND命令更合適。
1.16.1 標記路徑上的所有節點
這個查詢將設置路徑上所有節點的marked屬性爲true值。
MATCH p = (root { name: 'root' })-[r]-(A) FOREACH (n IN nodes(p)| SET n.marked = TRUE ) |
1.16.2 從列表中創建朋友
下面的查詢將列表中的人全部加爲'A'的朋友。
MATCH (a {name: 'root' }) FOREACH (name IN ["Mike", "Carl", "Bruce"] | CREATE (a)-[:FRIEND]->(:Person {name: name})) |
1.17 Aggregation
Cypher支持使用聚合(Aggregation)來計算聚在一起的數據,類似SQL中的group by。聚合函數有多個輸入值,然後基於它們計算出一個聚合值
RETURN n, count(*) |
1.17.1 Count
count用於計算行的數量。
(1)計算節點
MATCH (n :Person) RETURN count(*) |
(2)按組計算關係類型的數量
計算關係類型組中的數量,返回類型和數量。
MATCH (n { name: 'Tom Hanks' })-[r]->() RETURN type(r), count(*) |
(3)計算非空值的數量
可以通過count(expression)來計算非空值的數量。
MATCH (n) RETURN count(n.title) |
1.17.2 統計
CREATE (A :Person{name: 'A', property:13 }),(B :Person { name: 'B', property:33,eyes: 'blue' }),(C:Person { name: 'C', property:44,eyes: 'blue' }),(D:Person { name: 'D', eyes: 'blue' }) return A,B,C,D |
(1)sum
聚合函數sum簡單地計算所有值之和。計算的時候,空值將被丟棄。
MATCH (n:Person) RETURN sum(n.property) |
返回包含Person標籤的所有節點的property屬性值的和。
(2)avg
avg計算數值列的平均值。
MATCH (n:Person) RETURN avg(n.property) |
返回property屬性值的平均值。
(3)percentileDisc
percentileDisc計算給定值在一個組中的百分位,取值從0.0到1.0。它使用舍入法,返回最接近百分位的值。對於插值法,請參考percentileCont小節。
MATCH (n:Person) RETURN percentileDisc(n.property, 0.5) |
(4)percentileCont
percentileCont計算給定值在一個組中的百分位,百分位的值從0.0到1.0。
MATCH (n:Person) RETURN percentileCont(n.property, 0.4) |
(5)stdev
stddev計算給定值在一個組中的標準偏差。
MATCH (n) WHERE n.name IN ['A', 'B', 'C'] RETURN stdev(n.property) |
(6)stdevp
stdevp計算給定值在一個組中的標準偏差。
MATCH (n) WHERE n.name IN ['A', 'B', 'C'] RETURN stdevp(n.property) |
(7)max
max查找數值列中的最大值。
MATCH (n:Person) RETURN max(n.property) |
返回了property屬性中的最大值。
(8)min
min查找數值列中的最小值。
MATCH (n:Person) RETURN min(n.property) |
返回了property屬性中的最小值。
1.17.3 collect
collect將所有的值收集起來放入一個列表。空值null將被忽略。
MATCH (n:Person) RETURN collect(n.property) |
以列表的形式返回收集到的值。
1.17.4 DISTINCT
所有的聚合函數都可以帶有DISTINCT修飾符,它將去掉其中的重複值。
計算節點中不重複眼睛顏色數量的查詢可以這樣寫:
MATCH (b) RETURN count(DISTINCT b.eyes) |
1.18 UNWIND
UNWIND將一個列表展開爲一個行的序列(行轉列)。
1.18.1 UNWIND列表
將一個常量列表轉爲名爲x的行並返回。
UNWIND [1, 2, 3] AS x RETURN x |
1.18.2 創建唯一列表
使用DISTINCT將一個重複值列表轉爲一個集合。
WITH [1, 1, 2, 2] AS coll UNWIND coll AS x WITH DISTINCT x RETURN collect(x) AS SET |
1.19 UNION
UNION語句用於將多個查詢結果組合起來。
1.19.1 組合兩個查詢
用UNION ALL將兩個查詢的結果組合在一起,可能包含重複行。
MATCH (n:Actor) RETURN n.name AS name UNION ALL MATCH (n:Movie) RETURN n.title AS name |
1.19.2 組合兩個查詢並移除重複值
在UNION中不使用ALL時,組合的結果集中會去掉重複值。
MATCH (n:Actor) RETURN n.name AS name UNION MATCH (n:Movie) RETURN n.title AS name |
1.20 CALL
CALL語句用於調用數據庫中的過程(procedure)。
1.20.1 調用過程
本例調用數據庫內嵌的過程db.labels,它可列出數據庫中的所有標籤。
CALL db.labels |
1.20.2 使用命名空間和名字調用過程
本例調用數據庫內嵌的過程db.labels,它可列出數據庫中的所有標籤。
CALL `db`.`labels` |
1.20.3 使用字面值參數調用過程
下面使用字面值參數調用了例子中的過程org.neo4j.procedure.example.addNodeToIndex,如參數直接寫在語句中。
CALL org.neo4j.procedure.example.addNodeToIndex('users', 0, 'name') |
因爲例子中的過程不返回任何結果,因此結果返回空。
1.20.4 在複雜查詢中調用過程
這裏調用數據庫內嵌的過程db.labels計算數據庫中的總標籤數。
CALL db.labels() YIELD label RETURN count(label) AS numLabels |
1.20.5 在複雜查詢中調用過程並重命名結果
這裏調用內嵌過程db.propertyKeys作爲一部分,計算數據庫中包含每個屬性鍵的節點數。
CALL db.propertyKeys() YIELD propertyKey AS prop MATCH (n) WHERE n[prop] IS NOT NULL RETURN prop, count(n) AS numNodes |