neo4j--Cypher語法練習(WITH、 FOREACH、Aggregation、UNWIND、UNION、CALL)

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)

excel中標準差公式stdev與stdevp的區別

(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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章