neo4j學習總結--第五課 Cypher(CQL)命令三

這裏主要學習:with、forearch、聚合函數、unwind、union

目錄

一、WITH

1.1、過濾聚合函數結果

1.2、在collect前對結果排序

1.3、限制路徑搜索的分支

二、FOREACH

三、Aggregation 聚合

3.1、Count

3.2、統計

3.2.1、sum 所有值之和

3.2.2、avg 平均值

3.2.3、percentileDisc

3.2.3、percentileCont

3.2.4、stdev 標準偏差

3.2.5、stdevp

3.2.6、max

3.2.7、min

3.2.8、collect

3.2.9、DISTINCT

四、UNION

4.1、UNION ALL

4.2 、UNION

五、UNWIND(行轉列)

六、CALL(調用存儲過程)


一、WITH

     WITH語句將分段的查詢部分連接在一起,查詢結果從一部分以管道形式傳遞給另外一部分作爲開始點。

      使用WITH可以在將結果傳遞到後續查詢之前對結果進行操作。操作可以是改變結果的形式或者數量。WITH的一個常見用法就是限制傳遞給其他MATCH語句的結果數。通過結合ORDER BY和LIMIT,可獲取排在前面的X個結果。

另一個用法就是在聚合值上過濾。

1.1、過濾聚合函數結果

聚合的結果必須要通過WITH語句傳遞才能進行過濾。

MATCH (david { name: 'Tom Hanks' })--()--(otherPerson)

WITH otherPerson, count(*) AS foaf

WHERE foaf > 1

RETURN otherPerson

1.2、在collect前對結果排序

可以在將結果傳遞給collect函數之前對結果進行排序,這樣就可以返回排過序的列表。

match(n:Person) with n order by n.name desc limit 3 return collect(n.name)

列表中的人名以倒序排列,並且數量限制爲3。

1.3、限制路徑搜索的分支

可以限制匹配路徑的數量,然後以這些路徑爲基礎再做任何類似的有限制條件的搜索。

MATCH (n { name: 'Tom Hanks' })--(m)

WITH m

ORDER BY m.name DESC LIMIT 1

MATCH (m)--(o)

RETURN o.name

二、FOREACH

FOREACH語句用於循環遍歷結果集列表,然後做一些操作。

列表(lists)和路徑(paths)是Cypher中的關鍵概念。可以使用FOREACH來更新其中的數據。它可以在路徑或者聚合的列表的每個元素上執行更新命令。FOREACH括號中的變量是與外部分開的,這意味着FOREACH中創建的變量不能用於該語句之外

在FOREACH括號內,可以執行任何的更新命令,包括CREATE,CREATE UNIQUE,DELETE和FOREACH。如果希望對列表中的每個元素執行額外的MATCH命令,使用UNWIND命令更合適。

標記路徑上的所有節點

這個查詢將設置路徑上所有節點的marked屬性爲true值。

MATCH p = (root { name: 'root' })-[r]-(A)

FOREACH (n IN nodes(p)| SET n.marked = TRUE )

從列表中創建朋友

下面的查詢將列表中的人全部加爲'A'的朋友。

MATCH (a {name: 'root' })

FOREACH (name IN ["Mike", "Carl", "Bruce"] |

CREATE (a)-[:FRIEND]->(:Person {name: name}))

三、Aggregation 聚合

Cypher支持使用聚合(Aggregation)來計算聚在一起的數據,類似SQL中的group by。聚合函數有多個輸入值,然後基於它們計算出一個聚合值

RETURN n, count(*)

3.1、Count

count用於計算行的數量。

計算節點

MATCH (n :Person)

RETURN  count(*)

返回了開始節點及與之相連節點的數量。

按組計算關係類型的數量

計算關係類型組中的數量,返回類型和數量。

MATCH (n { name: 'Tom Hanks' })-[r]->()

RETURN type(r), count(*)

返回關係類型和關係組中的關係數量。

計算非空值的數量

可以通過count(expression)來計算非空值的數量。

MATCH (n)

RETURN count(n.title)

返回了title屬性非空的所有節點。

3.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

 

3.2.1、sum 所有值之和

聚合函數sum簡單地計算所有值之和。計算的時候,空值將被丟棄。

MATCH (n:Person)

RETURN sum(n.property)

返回包含Person標籤的所有節點的property屬性值的和。

3.2.2、avg 平均值

avg計算數值列的平均值。

MATCH (n:Person)

RETURN avg(n.property)

返回property屬性值的平均值。

3.2.3、percentileDisc

   percentileDisc計算給定值在一個組中的百分位,取值從0.0到1.0。它使用舍入法,返回最接近百分位的值。對於插值法,請參考percentileCont小節。

MATCH (n:Person)

RETURN percentileDisc(n.property, 0.5)

3.2.3、percentileCont

percentileCont計算給定值在一個組中的百分位,百分位的值從0.0到1.0。

MATCH (n:Person)

RETURN percentileCont(n.property, 0.4)

3.2.4、stdev 標準偏差

stddev計算給定值在一個組中的標準偏差。

MATCH (n)

WHERE n.name IN ['A', 'B', 'C']

RETURN stdev(n.property)

3.2.5、stdevp

stdevp計算給定值在一個組中的標準偏差。與stdev類似,區別如上所述。

MATCH (n)

WHERE n.name IN ['A', 'B', 'C']

RETURN stdevp(n.property)

3.2.6、max

max查找數值列中的最大值。

MATCH (n:Person)

RETURN max(n.property)

返回了property屬性中的最大值。

3.2.7、min

min查找數值列中的最小值。

MATCH (n:Person)

RETURN min(n.property)

返回了property屬性中的最小值。

3.2.8、collect

collect將所有的值收集起來放入一個列表。空值null將被忽略。

MATCH (n:Person)

RETURN collect(n.property)

以列表的形式返回收集到的值。

3.2.9、DISTINCT

所有的聚合函數都可以帶有DISTINCT修飾符,它將去掉其中的重複值。因此,計算節點中不重複眼睛顏色數量的查詢可以這樣寫:

MATCH (b)

RETURN count(DISTINCT b.eyes)

四、UNION

UNION語句用於將多個查詢結果組合起來。

4.1、UNION ALL

組合兩個查詢 ,用UNION ALL將兩個查詢的結果組合在一起。返回了組合的結果,包含重複行。

MATCH (n:Actor)

RETURN n.name AS name

UNION ALL

MATCH (n:Movie)

RETURN n.title AS name

4.2 、UNION

組合兩個查詢並移除重複值

在UNION中不使用ALL時,組合的結果集中會去掉重複值。

MATCH (n:Actor)

RETURN n.name AS name

UNION

MATCH (n:Movie)

RETURN n.title AS name

五、UNWIND(行轉列)

UNWIND將一個列表展開爲一個行的序列(行轉列)。

UNIND列表

將一個常量列表轉爲名爲x的行並返回。

UNWIND [1, 2, 3] AS x

RETURN x

創建唯一列表

使用DISTINCT將一個重複值列表轉爲一個集合。

WITH [1, 1, 2, 2] AS coll

UNWIND coll AS x

WITH DISTINCT x

RETURN collect(x) AS SET

原列表中的每個值被展開,然後經過DISTINCT之後創建了一個唯一列表。

六、CALL(調用存儲過程)

CALL語句用於調用數據庫中的過程(procedure)。

使用命名空間和名字調用過程

本例調用數據庫內嵌的過程db.labels,它可列出數據庫中的所有標籤。

CALL `db`.`labels`

調用過程

本例調用數據庫內嵌的過程db.labels,它可列出數據庫中的所有標籤。

CALL db.labels

使用字面值參數調用過程

下面使用字面值參數調用了例子中的過程org.neo4j.procedure.example.addNodeToIndex,如參數直接寫在語句中。

CALL org.neo4j.procedure.example.addNodeToIndex('users', 0, 'name')

因爲例子中的過程不返回任何結果,因此結果返回空。

在複雜查詢中調用過程

這裏調用數據庫內嵌的過程db.labels計算數據庫中的總標籤數。

CALL db.labels() YIELD label

RETURN count(label) AS numLabels

在複雜查詢中調用過程並重命名結果

這裏調用內嵌過程db.propertyKeys作爲一部分,計算數據庫中包含每個屬性鍵的節點數。

CALL db.propertyKeys() YIELD propertyKey AS prop

MATCH (n)

WHERE n[prop] IS NOT NULL

RETURN prop, count(n) AS numNodes

 

 

 

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