Neo4j 第十一篇:Cypher函數

Cypher函數是對圖進行查詢和操做的重要工具。 node

一,謂詞函數

謂詞函數返回true或者false,主要用於檢查是否存在或知足特定的條件。express

1,Exists函數

若是指定的模式存在於圖中,或者特定的屬性存在於節點、關係或Map中,那麼函數返回True工具

例如,節點具備name屬性,並check圖中是否存在特定的模式:spa

MATCH (n)
WHERE exists(n.name)
RETURN n.name AS name, exists((n)-[:MARRIED]->()) AS is_married

2,檢查集合元素code

all()表示全部的元素都知足條件,any()表示至少一個元素知足條件,none()函數表示沒有一個元素知足條件,single()表示只有一個元素知足條件對象

例如,ALL謂詞表示,在路徑中,全部節點都必須具備age屬性,而且age屬性值都必須大於30:blog

MATCH p =(a)-[*1..3]->(b)
WHERE a.name = 'Alice' AND b.name = 'Daniel' AND ALL (x IN nodes(p) WHERE x.age > 30)
RETURN p

ANY謂詞表示,節點的array屬性中至少有一個元素值是one:ip

MATCH (a)
WHERE a.name = 'Eskil' AND ANY (x IN a.array WHERE x = 'one')
RETURN a.name, a.array

NONE謂詞表示,在路徑中,沒有節點的age屬性等於25ci

MATCH p =(n)-[*1..3]->(b)
WHERE n.name = 'Alice' AND NONE (x IN nodes(p) WHERE x.age = 25)
RETURN p

SINGLE謂詞表示,在路徑中,只有一個節點的eyes屬性是blue:

MATCH p =(n)-->(b)
WHERE n.name = 'Alice' AND SINGLE (var IN nodes(p) WHERE var.eyes = 'blue')
RETURN p

二,標量函數

變量函數返回標量值

1,得到節點和關係的ID和屬性

  • id():返回節點或關係的ID
  • properties():返回節點或關係的屬性(Map)
CREATE (p:Person { name: 'Stefan', city: 'Berlin' })
RETURN id(p), properties(p)

2,關係

關係是由開始節點,結束節點和邊構成的:

  • endNode(relationship):返回關係的結束節點
  • startNode(relationship):返回關係的開始節點
  • type(relationship):返回關係的類型
MATCH (n)-[r]->()
WHERE n.name = 'Alice'
RETURN type(r), startNode(r), endNode(r)

3,列表相關

列表是元素的有序序列,Cypher使用List來表示列表類型,應用於列表的函數有:

  • coalesce():返回列表中第一個非NULL的元素
  • head():返回列表中的第一個元素
  • last():返回列表中的最有一個元素
  • size():返回列表中元素的數量

例如,節點的array屬性,

MATCH (a)
WHERE a.name = 'Eskil'
RETURN a.array, head(a.array), last(a.array), size(a.array)

4,size()和length()函數

求長度的函數:

  • size(string):表示字符串中字符的數量,能夠把字符串看成是字符的列表。
  • size(list):返回列表中元素的數量。
  • size(pattern_expression):也是統計列表中元素的數量,可是不是直接傳入列表,而是提供模式表達式(pattern_expression),用於在匹配查詢(Match query)中提供一組新的結果,這些結果是路徑列表,size()函數用於統計路徑列表中元素(即路徑)的數量。
  • length(path):返回路徑的長度,即路徑中關係的數量

例如,統計路徑列表中的元素數量:

MATCH (a)
WHERE a.name = 'Alice'
RETURN size((a)-->()-->()) AS fof

三,聚合函數

聚合函數用於對查詢的結果進行統計:

  • avg():計算均值
  • count(exp):用於計算非null值(value)的數量,使用 count(distinct exp)進行無重複非null值的計數,使用count(*):計算值或記錄的總數量,包括null值
  • max(),min():求最大值和最小值,在計算極值時,null被排除在外,min(null)或max(null)返回null
  • sum():求和,在求和時,null被排除在外,sum(null)的結果是0
  • collect():把返回的多個值或記錄組裝成一個列表,collect(null)返回一個空的列表

在聚合計算中,能夠引用分組鍵來對查詢的結果進行分組聚合,例如,在return子句中,若是表達式不是聚合函數,那麼該表達式是分組key,下面的表達式是按照type(r)分組,計算每一個分組中記錄的數量。

RETURN type(r), count(*)

四,列表函數

列表是Cypher中的一個重要的複合類型,對列表進行操做的函數主要是生成列表、獲取列表對象、抽取特定的列表元素、過濾列表元素和對列表元素進行迭代計算。

1,抽取元素構成列表

extract函數的做用是從列表中抽取值,

extract(variable IN list | expression)

根據抽取的值組裝成一個列表,返回一個列表:

MATCH p =(a)-->(b)-->(c)
WHERE a.name = 'Alice' AND b.name = 'Bob' AND c.name = 'Daniel'
RETURN extract(n IN nodes(p)| n.age) AS extracted

2,過濾列表元素

filter函數用於對列表中的元素進行過濾,

filter(variable IN list WHERE predicate)

把過濾後的元素組成一個了表,返回該列表:

MATCH (a)
WHERE a.name = 'Eskil'
RETURN a.array, filter(x IN a.array WHERE size(x)= 3)

3,得到列表

  • keys(node):從節點的屬性中抽取屬性鍵
  • labels(node):節點標籤的列表
  • nodes(path):從路徑中獲取全部節點的列表
  • relationships(path):從路徑中得到全部的關係
MATCH (a)
WHERE a.name = 'Alice'
RETURN labels(a),keys(a)

MATCH p =(a)-->(b)-->(c)
WHERE a.name = 'Alice' AND c.name = 'Eskil'
RETURN nodes(p), relationships(p)

4,序列的生成和倒置

range()函數,用於生成一個有序的序列,reverse()函數把原始列表的元素進行倒置

range(start, end [, step])
reverse(list)

5,迭代計算列表

reduce()函數應用在列表上,對列表中的每一個元素e進行迭代計算,在元素e上運行表達式(expression),把當前的結果存儲在累加器中,進行迭代計算,並返回最終計算的標量結果:

reduce(accumulator = initial, e IN list | expression)

例如,初始的age值是0,對路徑p中的全部節點,計算各個節點的age值的和:

MATCH p =(a)-->(b)-->(c)
WHERE a.name = 'Alice' AND b.name = 'Bob' AND c.name = 'Daniel'
RETURN reduce(totalAge = 0, n IN nodes(p)| totalAge + n.age) AS reduction

 

 

參考文檔:

Cypher Functions

相關文章
相關標籤/搜索