Neo4j 第八篇:投射和過濾


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

一,Return子句

使用return子句返回節點,關系和關系。

1,返回節點

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

2,返回關系

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

3,返回屬性

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

4,返回所有元素

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子句的作用是把上一個查詢的結果進行處理,作為下一個查詢的數據源,也就是說,在上一個查詢的結果輸出到客戶端之前,把結果傳遞到后續的子句中去。

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


免責聲明!

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



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