Neo4j Cypher查詢語言詳解


Cypher

返回節點

返回一個節點,在返回語句中列出即可。

查詢:

START n=node(2)

RETURN n

 結果:

Cypher

返回關系

查詢:

START n=node(1)

MATCH (n)-[r:KNOWS]->(c)

RETURN r

結果:

Cypher

返回屬性

查詢:

START n=node(1)

RETURN n.name

結果:

Cypher

帶特殊字符的標識符

使用不在英語字符表中的字符,可以使用’單引號。

查詢:

START This isn't a commonidentifier=node(1)

RETURN This isn't a commonidentifier.<<!!__??>>`

結果:

Cypher

列的別名

可以給展示出來的列名起別名。

查詢:

START a=node(1)

RETURN a.age AS SomethingTotallyDifferent

 返回節點的age屬性,但重命名列名。

結果:

Cypher

可選屬性

屬性在節點上可能存在也可能不存在,可以使用問號來標識標識符即可。

查詢:

START n=node(1, 2)

RETURN n.age?

如果存在age屬性,則返回,不存在則返回null。

結果:

Cypher

特別的結果

DISTINCT 僅檢索特別的行,基於選擇輸出的列。

查詢:

START a=node(1)

MATCH (a)-->(b)

RETURN distinct b

返回name為B的節點,但僅為一次。

結果:

Cypher

neo4j 聚合函數

目錄

  1. 聚合Aggregation
    1. 計數
    2. 計算節點數
    3. 分組計算關系類型
    4. 計算實體數
    5. 計算非空可以值數
    6. 求和sum
    7. 平均值avg
    8. 最大值max
    9. 最小值min
    10. 聚類COLLECT
    11. 相異DISTINCT

聚合(Aggregation)

為集合計算數據,Cypher提供聚類功能,與SQL的group by類似。在return語句中發現的任何聚類函數,所有沒有聚類函數的列將作為聚合key使用。圖:

Cypher

計數

計數(count)使用來計算行數。Count有兩種使用方法。Count(*)計算匹配的行的行數,count(<標識符>)計算標識符中非空值數。

計算節點數

計算鏈接到一個節點的節點數,可以使用count(*)。

查詢:

START n=node(2)

MATCH (n)-->(x)

RETURN n, count(*)

 返回開始節點和相關節點節點數。

結果:

Cypher

分組計算關系類型

計算分組了得關系類型,返回關系類型並使用count(*)計算。

查詢:

START n=node(2)

MATCH (n)-[r]->()

RETURN type(r), count(*)

 返回關系類型和其分組數。

結果:

Cypher

計算實體數

相比使用count(*),可能計算標識符更實在。

查詢:

START n=node(2)

MATCH (n)-->(x)

RETURN count(x)

 返回鏈接到開始節點上的節點數

結果:

Cypher

計算非空可以值數

查詢:

START n=node(2,3,4,1)

RETURN count(n.property?)

 結果:

Cypher

求和(sum)

Sum集合簡單計算數值類型的值。Null值將自動去掉。如下:

查詢:

START n=node(2,3,4)

RETURN sum(n.property)

 計算所有節點屬性值之和。

結果:

Cypher

平均值(avg)

Avg計算數量列的平均值

查詢:

START n=node(2,3,4)

RETURN avg(n.property)

 結果:

Cypher

最大值(max)

Max查找數字列中的最大值。

查詢:

START n=node(2,3,4)

RETURN max(n.property)

 結果:

Cypher

最小值(min)

Min使用數字屬性作為輸入,並返回在列中最小的值。

查詢:

START n=node(2,3,4)

RETURN min(n.property)

 結果:

Cypher

聚類(COLLECT)

Collect將所有值收集到一個集合list中。

查詢:

START n=node(2,3,4)

RETURN collect(n.property)

 返回一個帶有所有屬性值的簡單列。

結果:

Cypher

相異(DISTINCT)

聚合函數中使用distinct來去掉值中重復的數據。

查詢:

START a=node(2)

MATCH a-->b

RETURN count(distinct b.eyes)

 結果:

Cypher

neo4j 高級篇

目錄

  1. 排序Order by
    1. 通過節點屬性排序節點
    2. 通過多節點屬性排序節點
    3. 倒序排列節點
    4. 空值排序
  2. Skip
    1. 跳過前三個
    2. 返回中間兩個
  3. Limit
    1. 返回第一部分
  4. 函數Functions
    1. 判斷
    2. All
    3. Any
    4. None
    5. Single
    6. Scalar函數
    7. Length
    8. Type
    9. Id
    10. Coalesce
    11. Iterable函數
    12. Nodes
    13. Relationships
    14. Extract

排序(Order by)

輸出結果排序可以使用order by 子句。注意,不能使用節點或者關系排序,僅僅只針對其屬性有效。圖:

Cypher

通過節點屬性排序節點

查詢:

START n=node(3,1,2)

RETURN n

ORDER BY n.name

 結果:

Cypher

通過多節點屬性排序節點

在order by子句中可以通過多個屬性來排序每個標識符。Cypher首先將通過第一個標識符排序,如果第一個標識符或屬性相等,則在order by中檢查下一個屬性,依次類推。

查詢:

START n=node(3,1,2)

RETURN n

ORDER BY n.age, n.name

 首先通過age排序,然后再通過name排序。

結果:

Cypher

倒序排列節點

可以在標識符后添加desc或asc來進行倒序排列或順序排列。

查詢:

START n=node(3,1,2)

RETURN n

ORDER BY n.name DESC

 結果:

Cypher

 

空值排序

當排列結果集時,在順序排列中null將永遠放在最后,而在倒序排列中放最前面。

查詢:

START n=node(3,1,2)

RETURN n.length?, n

ORDER BY n.length?

 結果:

 Cypher

Skip

Skip允許返回總結果集中的一個子集。此不保證排序,除非使用了order by’子句。 圖:

Cypher

跳過前三個

返回結果中一個子集,從第三個結果開始,語法如下:

查詢:

START n=node(3, 4, 5, 1, 2)

RETURN n

ORDER BY n.name

SKIP 3

 前三個節點將略過,最后兩個節點將被返回。

結果:

Cypher

 

返回中間兩個

查詢:

START n=node(3, 4, 5, 1, 2)

RETURN n

ORDER BY n.name

SKIP 1

LIMIT 2

 中間兩個節點將被返回。

結果:

 Cypher

Limit

Limit允許返回結果集中的一個子集。圖:

Cypher

返回第一部分

查詢:

START n=node(3, 4, 5, 1, 2)

RETURN n

LIMIT 3

 結果:

Cypher

函數(Functions)

在Cypher中有一組函數,可分為三類不同類型:判斷、標量函數和聚類函數。圖:

Cypher

判斷

判斷為boolean函數,對給出的輸入集合做判斷並返回true或者false。常用在where子句中過濾子集。

All

迭代測試集合中所有元素的判斷。

語法:

All(標識符 in iterable where 判斷)

參數:

Ø  iterable :一個集合屬性,或者可迭代的元素,或一個迭代函數。

Ø  標識符:可用於判斷比較的標識符。

Ø  判斷:一個測試所有迭代器中元素的判斷。

查詢:

START a=node(3), b=node(1)

MATCH p=a-[*1..3]->b

WHERE all(x in nodes(p) WHERE x.age > 30)

RETURN p

過濾包含age〈30的節點的路徑,返回符合條件路徑中所有節點。

結果:

Cypher

Any

語法:ANY(identifierin iterable WHERE predicate)

參數:

Ø  Iterable(迭代器):一個集合屬性,或者可迭代的元素,或一個迭代函數。

Ø  Identifier(標識符):可用於判斷比較的標識符。

Ø  Predicate(判斷):一個測試所有迭代器中元素的判斷。

查詢:

START a=node(2)

WHERE any(x in a.array WHERE x = "one")

RETURN a

結果:

Cypher

None

在迭代器中沒有元素判斷將返回true。

語法:NONE(identifierin iterable WHERE predicate)

Ø  Iterable(迭代器):一個集合屬性,或者可迭代的元素,或一個迭代函數。

Ø  Identifier(標識符):可用於判斷比較的標識符。

Ø  Predicate(判斷):一個測試所有迭代器中元素的判斷。

查詢:

START n=node(3)

MATCH p=n-[*1..3]->b

WHERE NONE(x in nodes(p) WHERE x.age = 25)

RETURN p

 結果:

Cypher

Single

如果迭代器中僅有一個元素則返回true。

語法:SINGLE(identifierin iterable WHERE predicate)

參數:

Ø  Iterable(迭代器):一個集合屬性,或者可迭代的元素,或一個迭代函數。

Ø Identifier(標識符):可用於判斷比較的標識符。

Ø Predicate(判斷):一個測試所有迭代器中元素的判斷。

查詢:

START n=node(3)

MATCH p=n-->b

WHERE SINGLE(var in nodes(p) WHERE var.eyes = "blue")

RETURN p

結果:

Cypher

Scalar函數

標量函數返回單個值。

Length

使用詳細的length屬性,返回或過濾路徑的長度。

語法:LENGTH(iterable )

參數:

Ø  Iterable(迭代器):一個集合屬性,或者可迭代的元素,或一個迭代函數。

查詢:

START a=node(3)

MATCH p=a-->b-->c

RETURN length(p)

返回路徑的長度。

結果:

Cypher

Type

返回關系類型的字符串值。

語法:TYPE(relationship )

參數:

Ø  Relationship:一條關系。

查詢:

START n=node(3)

MATCH (n)-[r]->()

RETURN type(r)

返回關系r的類型。

結果:

Cypher

Id

返回關系或者節點的id

語法:ID(property-container )

參數:

Ø  Property-container:一個節點或者一條關系。

查詢:

START a=node(3, 4, 5)

RETURN ID(a)

返回這三個節點的id。

結果:

Cypher

Coalesce

返回表達式中第一個非空值。

語法:COALESCE(expression [, expression]* )

參數:

Ø  Expression:可能返回null的表達式。

查詢:

START a=node(3)

RETURN coalesce(a.hairColour?,a.eyes?)

結果:

Cypher

Iterable函數

迭代器函數返回一個事物的迭代器---在路徑中的節點等等。

Nodes

返回一個路徑中的所有節點。

語法:NODES(path )

參數:

Ø  Path:路徑

查詢:

START a=node(3), c=node(2)

MATCH p=a-->b-->c

RETURN NODES(p)

結果:

Cypher

Relationships

返回一條路徑中的所有關系。

語法:RELATIONSHIPS(path )

參數:

Ø  Path:路徑

查詢:

START a=node(3), c=node(2)

MATCH p=a-->b-->c

RETURN RELATIONSHIPS(p)

結果:

Cypher

Extract

可以使用extract單個屬性,或從關系或節點集合迭代一個函數的值。將遍歷迭代器中所有的節點並運行表達式返回結果。

語法:EXTRACT(identifier in iterable : expression )

Ø  Iterable(迭代器):一個集合屬性,或者可迭代的元素,或一個迭代函數。

Ø  Identifier(標識符):閉包中表述內容的標識符,這決定哪個標識符將用到。

Ø  expression(表達式):這個表達式將對於迭代器中每個值運行一次,並生成一個結果迭代器。

查詢:

START a=node(3), b=node(4),c=node(1)

MATCH p=a-->b-->c

RETURN extract(n in nodes(p) : n.age)

返回路徑中所有age屬性值。

結果:

Cypher

原文地址:http://www.ttlsa.com/nosql/how-to-neo4j-cypher-query-language/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM