Neo4j 第八篇:投射和過濾

投射子句用於定義如何返回數據集,並能夠對返回的表達式設置別名,而過濾子句用於對查詢的結果集按照條件進行過濾正則表達式

一,Return子句

使用return子句返回節點,關係和關係。函數

1,返回節點spa

MATCH (n { name: 'B' })
RETURN n

2,返回關係code

MATCH (n { name: 'A' })-[r:KNOWS]->(c)
RETURN r

3,返回屬性regexp

MATCH (n { name: 'A' })
RETURN n.name

4,返回全部元素blog

MATCH p =(a { name: 'A' })-[r]->(b)
RETURN *

5,爲屬性設置別名排序

MATCH (a { name: 'A' })
RETURN a.age AS SomethingTotallyDifferent

6,返回謂詞(predicate),文本(literal)或模式(pattern)文檔

MATCH (a { name: 'A' })
RETURN a.age > 30, "I'm a literal",(a)-->()

7,使用distinct關鍵字返回不重複值字符串

MATCH (a { name: 'A' })-->(b)
RETURN DISTINCT b

二,with 子句

一個查詢(Query)語句有不少查詢子句,每個查詢子句按照特定的順序執行,每個子句是查詢的一部分(Part)。with子句的做用是把上一個查詢的結果進行處理,做爲下一個查詢的數據源,也就是說,在上一個查詢的結果輸出到客戶端以前,把結果傳遞到後續的子句中去。get

1,對聚合的結果進行過濾

聚合的結果必須經過with子句才能被過濾,例如,with子句保留otherPerson,並新增聚合查詢count(*),經過where子句過濾,返回查詢結果:Anders。

MATCH (david { name: 'David' })--(otherPerson)-->()
WITH otherPerson, count(*) AS foaf
WHERE foaf > 1
RETURN otherPerson.name

2,限制返回的結果

MATCH (n { name: 'Anders' })--(m)
WITH m
ORDER BY m.name DESC LIMIT 1
MATCH (m)--(o)
RETURN o.name

三,unwind子句

unwind子句用於把list格式的字符串拆開爲行的序列

1,拆開列表

UNWIND [1, 2, 3, NULL ] AS x
RETURN x, 'val' AS y

2,拆開嵌套列表

WITH [[1, 2],[3, 4], 5] AS nested
UNWIND nested AS x
UNWIND x AS y
RETURN y

3,Collect函數

collect函數用於把值組裝成列表

WITH [1, 1, 2, 2] AS coll
UNWIND coll AS x
WITH DISTINCT x
RETURN collect(x) AS setOfVals

四,Where子句

 使用Where子句對查詢的結果進行過濾

1,按照邏輯表達式來過濾

MATCH (n)
WHERE n.name = 'Peter' XOR (n.age < 30 AND n.name = 'Tobias') OR NOT (n.name = 'Tobias' OR n.name = 'Peter')
RETURN n.name, n.age

2,按照節點的標籤來過濾

MATCH (n)
WHERE n:Swedish
RETURN n.name, n.age

3,按照節點的屬性來過濾

MATCH (n)
WHERE n.age < 30
RETURN n.name, n.age

4,按照關係的屬性來過濾

MATCH (n)-[k:KNOWS]->(f)
WHERE k.since < 2000
RETURN f.name, f.age, f.email

5,按照動態計算的屬性來計算

WITH 'AGE' AS propname
MATCH (n)
WHERE n[toLower(propname)]< 30
RETURN n.name, n.age

6,是否存在屬性

MATCH (n)
WHERE exists(n.belt)
RETURN n.name, n.belt

7,字符串匹配

對字符串進行匹配:starts with、ends with,contains

MATCH (n)
WHERE n.name STARTS WITH 'Pet'
RETURN n.name, n.age

MATCH (n)
WHERE n.name ENDS WITH 'ter'
RETURN n.name, n.age

MATCH (n)
WHERE n.name CONTAINS 'ete'
RETURN n.name, n.age

8,正則匹配

使用 =~ 'regexp' 匹配正則 ,若是正則表達式以(?i)開頭,表示整個正則是大小寫敏感的。

MATCH (n)
WHERE n.name =~ 'Tob.*'
RETURN n.name, n.age

MATCH (n)
WHERE n.name =~ '(?i)ANDR.*'
RETURN n.name, n.age

9,匹配路徑模式

MATCH (tobias { name: 'Tobias' }),(others)
WHERE others.name IN ['Andres', 'Peter'] AND (tobias)<--(others)
RETURN others.name, others.age

使用not來排除路徑模式:

MATCH (persons),(peter { name: 'Peter' })
WHERE NOT (persons)-->(peter)
RETURN persons.name, persons.age

使用屬性來匹配路徑:

MATCH (n)
WHERE (n)-[:KNOWS]-({ name: 'Tobias' })
RETURN n.name, n.age

使用關係類型來匹配路徑:

MATCH (n)-[r]->()
WHERE n.name='Andres' AND type(r)=~ 'K.*'
RETURN type(r), r.since

10,列表

使用IN操做符表示匹配列表中的元素

MATCH (a)
WHERE a.name IN ['Peter', 'Tobias']
RETURN a.name, a.age

11,缺失值

若是屬性值缺失,那麼屬性值默認值是null,null和任何值比較都是false;能夠使用is not null 或 is null來判斷是否爲null

MATCH (person)
WHERE person.name = 'Peter' AND person.belt IS NULL 
RETURN person.name, person.age, person.belt

五,排序

使用order by對查詢的結果進行排序,默認是升序,使用關鍵字desc使Cypher按照降序進行排序。

1,按照節點的屬性進行升序排序

MATCH (n)
RETURN n.name, n.age
ORDER BY n.name

2,按照節點的屬性值進行降序排序

MATCH (n)
RETURN n.name, n.age
ORDER BY n.name DESC

六,SKIP和LIMIT

 SKIP是跳過前N行,LIMIT是限制返回的數量

1,跳過前3行

MATCH (n)
RETURN n.name
ORDER BY n.name
SKIP 3

2,跳過前3行,返回第4和5行

MATCH (n)
RETURN n.name
ORDER BY n.name
SKIP 3
LIMIT 2

 

 

 

參考文檔:

Cypher Clauses

相關文章
相關標籤/搜索