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

目錄

 

一.CQL簡介

二.Neo4j CQL命令/條款

三、命令

3.1 、CREATE命令

3.1.1 創建節點

3.1.2 創建關係

3.1.3、創建一個完整路徑

3.1.4、創建索引

3.2 MATCH 命令

3.2.1、查詢節點

3.2.2 、查找關係

3.2.3  查詢路徑

3.2.4、單條最短路徑

3.2.5 通過id查詢節點或關係

四、OPTIONAL MATCH

五、WHERE子句

Neo4j CQL中的布爾運算符

Neo4j CQL中的比較運算符

5.1 、基本使用

5.1.1 布爾運算

5.1.2 、字符串匹配

5.1.3、正則表達式 =~ 'regexp'

5.1.4 在WHERE中使用路徑模式

5.1.5 列表

六、RETURN返回

6.1、返回節點

6.2、返回關係

6.3、返回屬性

6.4、返回所有元素

6.5、變量中的特殊字符

6.6、列別名

6.7、其他表達式

6.8 唯一性結果


一.CQL簡介

CQL代表Cypher查詢語言。 像Oracle數據庫具有查詢語言SQL,Neo4j具有CQL作爲查詢語言。

Neo4j CQL -

  • 它是Neo4j圖形數據庫的查詢語言。
  • 它是一種聲明性模式匹配語言
  • 它遵循SQL語法。
  • 它的語法是非常簡單且人性化、可讀的格式。

如Oracle SQL -

  • Neo4j CQL 已命令來執行數據庫操作。
  • Neo4j CQL 支持多個子句像在哪裏,順序等,以非常簡單的方式編寫非常複雜的查詢。
  • NNeo4j CQL 支持一些功能,如字符串,Aggregation.In 加入他們,它還支持一些關係功能。

二.Neo4j CQL命令/條款

常用的Neo4j CQL命令/條款如下:

S.No.

CQL命令/條

用法

1。

CREATE 創建

創建節點,關係和屬性

2。

MATCH 匹配

檢索有關節點,關係和屬性數據

3。

RETURN 返回

返回查詢結果

4。

WHERE 哪裏

提供條件過濾檢索數據

5。

DELETE 刪除

刪除節點和關係

6。

REMOVE 移除

刪除節點和關係的屬性

7。

ORDER BY以…排序

排序檢索數據

8。

SET 組

添加或更新標籤

三、命令

3.1 、CREATE命令

Neo4j使用CQL“CREATE”命令

  • 創建節點

  • 使用關係

  • 創建一個完整路徑

  • 創建索引

3.1.1 創建節點

Neo4j CQL創建一個沒有屬性的節點

CREATE (<node-name>:<label-name>)

語法說明

規範說法是節點標籤名稱,其實相當於Mysql數據庫中的表名,而是節點名稱,其實代指創建的此行數據。

示例

CREATE (emp:Employee) return emp 或者 CREATE (:Employee)

Neo4j CQL創建具有屬性的節點

Neo4j CQL“CREATE”命令用於創建帶有屬性的節點。 它創建一個具有一些屬性(鍵值對)的節點來存儲數據。

CREATE (<node-name>:<label-name>  {<key>:<Value>,...<n-key>:<n-Value>})

示例

CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" })

創建帶有多個標籤的節點

CREATE (n:Person:Swedish)

返回創建的節點

CREATE (a { name: 'Andres' }) RETURN a

3.1.2 創建關係

  注意:關係必須有箭頭指向

創建兩個節點之間的關係。

//先創建2個節點

CREATE (n:Person {name: 'Node A'}),(m:Person {name: 'Node B'})

//查詢節點併爲其創建關係

MATCH (a:Person),(b:Person)

WHERE a.name = 'Node A' AND b.name = 'Node B'

CREATE (a)-[r:RELTYPE]->(b)

RETURN r

創建關係併爲關係設置屬性

Match (a:Person {name:'Node A'}),(b:Person {name:'Node B'})

CREATE (a)-[r:RELTYPE { name: 'abc' }]->(b)

RETURN r

3.1.3、創建一個完整路徑

當使用CREATE和模式時,模式中所有還不存在的部分都會被創建。

create p = (m:Andres {name:'南京'})-[r:SHUYU]->(jiangsu:Andres {name:'江蘇省'})<-[s:SHUYU]-(andres:Andres {name:'徐州'}) return p

3.1.4、創建索引

CREATE INDEX ON :Person(name)

3.2 MATCH 命令

 MATCH命令用於 -

  • 從數據庫獲取有關節點和屬性的數據
  • 從數據庫獲取有關節點,關係和屬性的數據

3.2.1、查詢節點

查詢所有節點

通過指定一個不帶標籤的節點的模式,圖中的所有節點將返回。

MATCH (n)

RETURN n

        

返回數據庫中的所有節點。

查詢帶有某個標籤的所有節點

通過指定帶有一個標籤的節點的模式,可以獲取滿足該標籤的所有節點。

查詢

MATCH (movie:Movie)

RETURN movie.title

返回數據庫中的所有電影。

查詢關聯節點

符號——意爲相關的,這個關係不帶有類型和方向。

MATCH ({ name: 'Lilly Wachowski' })--(movie)

RETURN movie.title

返回’Lilly Wachowski’相關的所有電影。

匹配標籤

可以爲查詢的節點增加標籤約束。如下

MATCH (:Person { name: 'Lilly Wachowski' })--(movie:Movie)

RETURN movie.title

返回與Person 'Oliver'相連的帶有Movie標籤的所有節點。

3.2.2 、查找關係

外向關係

關係的方向通過-->或者<--來表示。如:

MATCH (:Person { name: 'Lilly Wachowski' })-->(movie)

RETURN movie.title

返回與Person 'Lilly Wachowski'外向連接的所有節點,也就是Person 'Lilly Wachowski 所有指向的關係。

有向關係和變量

當需要過濾關係中的屬性,或者返回關係的時候,變量就很有必要了。

MATCH (:Person { name: 'Lilly Wachowski' })-[r]->(movie)

RETURN type(r)

返回'Oliver'的外向關係的類型。

匹配關係類型

當已知要匹配關係的類型時,可通過冒號後面緊跟關係類型。

MATCH (wallstreet:Movie { title: 'The Matrix' })<-[:ACTED_IN]-(actor)

RETURN actor.name

返回'The Matrix'中的所有演員。

匹配多種關係類型

當需要匹配多種關係中的一種時,可以通過豎線|將多個關係連接在一起。

MATCH (wallstreet { title: 'The Matrix' })<-[:ACTED_IN|:DIRECTED]-(person)

RETURN person.name

返回與'The Matrix'節點關係爲ACTED_IN或者DIRECTED的所有節點。

匹配關係類型和使用關係變量

如果想通過變量來引用關係和指定關係類型,可以將它們放在一起。如:

MATCH (wallstreet { title: 'The Matrix' })<-[r:ACTED_IN]-(actor)

RETURN r.role

返回'The Matrix'中所有演員的角色。

多個關係

關係可以多語句以 ()--()的形式來表達,或者它們相互連接在一起。如:

MATCH (tom { name: 'Tom Hanks' })-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director)

RETURN tom,movie, director

返回' Tom Hanks '演的電影和該電影的導演。

  

可變長關係

可變長關係和節點的語法如下:

-[:TYPE*minHops..maxHops]->

minHops和maxHops都是可選的,默認值分別爲1和無窮大。當沒有邊界值的時候,點也可以省略。當只設置了一個邊界的時候,如果點省略了就意味着是一個固定長度的模式。

MATCH (martin { name: 'Tom Hanks' })-[:ACTED_IN*1..3]-(movie:Movie)

RETURN movie.title

返回與' Tom Hanks '關係爲1跳(hop)到3跳的所有電影。

變長關係的關係變量

當連接兩個節點之間的長度是變長的,那麼關係變量返回的將可能是一個關係列表。

MATCH (actor { name: 'Tom Hanks' })-[r:ACTED_IN*2]-(co_actor)

RETURN r

返回一個關係列表。

3.2.3  查詢路徑

查詢路徑

如果想返回或者需要對路徑進行過濾,可以將路徑賦值給一個變量。

MATCH p =(tom { name: 'Tom Hanks' })-->()

RETURN p

查詢Tom Hanks 所指向的路徑

最短路徑

3.2.4、單條最短路徑

通過使用shortestPath函數很容易找到兩個節點之間的最短路徑。如下所示:

MATCH  p =shortestPath((tom { name: 'Tom Hanks' })-[*..15]-( Steve {name:'Steve Zahn'}))

RETURN p

上面查詢的含義爲:找到兩個節點之間的最短路徑,路徑最大長度爲15。在搜索最短路徑的時候,還可以使用關係類型、最大跳數和方向等約束條件。如果用到了WHERE語句,相關的斷言會被包含到shortestPath中去。如果路徑的關係元素中用到了none()或者all()斷言,那麼這些將用於在檢索時提高性能。

3.2.5 通過id查詢節點或關係

通過id查詢節點

可以在斷言中使用id()函數來根據id查詢節點。

查詢

MATCH (n)

WHERE id(n)= 0

RETURN n

節點id爲0的節點將返回。

通過id查詢關係

通過id查詢關係與節點類似。但這在實踐中不推薦這麼做。如下:

查詢

MATCH ()-[r]->()

WHERE id(r)= 0

RETURN r

關係id爲0的節點將返回。

通過id查詢多個節點

通過id查詢多個節點的時候,可以將id放到IN語句中。

查詢

MATCH (n)

WHERE id(n) IN [0, 3, 5]

RETURN n

這個查詢返回了IN語句中列出的所有節點。

四、OPTIONAL MATCH

OPTINAL MATCH語句用於搜索模式中描述的匹配項,對於找不到的項用null代替。

關係

如果某個關係是可選的,可使用OPTINAL MATCH。這很類似SQL中outer join的工作方式。如果關係存在就返回,否則在相應的地方返回null。

MATCH (a:Movie { title: 'The Matrix' })

OPTIONAL MATCH (a)-->(x)

RETURN x

返回了null,因爲這個節點沒有外向關係。

可選元素的屬性

如果可選的元素爲null,那麼該元素的屬性也返回null。

MATCH (a:Movie { title: 'The Matrix' })

OPTIONAL MATCH (a)-->(x)

RETURN x, x.name

返回了x元素(查詢中爲null),它的name屬性也爲null。

可選關係類型

可在查詢中指定可選的關係類型。

MATCH (a:Movie { title: 'The Matrix' })

OPTIONAL MATCH (a)<-[r: ACTED_IN]-()

RETURN r

五、WHERE子句

像SQL一樣,Neo4j CQL在CQL MATCH命令中提供了WHERE子句來過濾MATCH查詢的結果。

WHERE <property-name> <comparison-operator> <value>

語法說明:

S.No. 語法元素 描述
1 WHERE 它是一個Neo4j CQL關鍵字。
2 <property-name>
<屬性名稱>
它是節點或關係的屬性名稱。
3 <comparison-operator>
<比較運算符>
它是Neo4j CQL比較運算符之一。請參考下一節查看Neo4j CQL中可用的比較運算符。
4 <value>
<值>
它是一個字面值,如數字文字,字符串文字等。

Neo4j CQL中的布爾運算符

Neo4j支持以下布爾運算符在Neo4j CQL WHERE子句中使用以支持多個條件。

S.No. 布爾運算符 描述
1 AND 它是一個支持AND操作的Neo4j CQL關鍵字。
2 OR 它是一個Neo4j CQL關鍵字來支持OR操作。
3 NOT 它是一個Neo4j CQL關鍵字支持NOT操作。 
4 XOR 它是一個支持XOR操作的Neo4j CQL關鍵字。 

Neo4j CQL中的比較運算符

Neo4j 支持以下的比較運算符,在 Neo4j CQL WHERE 子句中使用來支持條件。

S.No. 布爾運算符 描述
1. = 它是Neo4j CQL“等於”運算符。
2. <> 它是一個Neo4j CQL“不等於”運算符。
3. < 它是一個Neo4j CQL“小於”運算符。
4. > 它是一個Neo4j CQL“大於”運算符。
5. <= 它是一個Neo4j CQL“小於或等於”運算符。
6. >= 它是一個Neo4j CQL“大於或等於”運算符。

5.1 、基本使用

5.1.1 布爾運算

可以在WHERE中使用布爾運算符,如AND和OR,以及布爾函數NOT。

查找1990年到2000年發行的電影的名稱

MATCH (nineties:Movie)

WHERE nineties.released > 1990 AND nineties.released < 2000

RETURN nineties.title

關係屬性的過濾

要對關係的屬性進行過濾,可在WHERE中添加如下關鍵詞:

MATCH (n)-[:ACTED_IN]->(m)

WHERE m.released > 1990

RETURN n

返回了參演過1990年後發佈的電影的演員。

屬性存在性檢查

使用exists()只能檢查節點或者關係的某個屬性是否存在

MATCH (n)

WHERE exists(n.title)

RETURN n

返回了電影節點,因爲只有他有title屬性。

5.1.2 、字符串匹配

匹配字符串的開始 

STARTS WITH用於以大小寫敏感的方式匹配字符串的開始。

MATCH (n)

WHERE n.name STARTS WITH 'Tom'

RETURN n

匹配字符串的結尾

ENDS WITH用於以大小寫敏感的方式匹配字符串的結尾。

MATCH (n)

WHERE n.name ENDS WITH 'Hanks'

RETURN n

返回了姓名以'Hanks'結尾的人。

字符串包含

CONTAINS用於檢查字符串中是否包含某個字符串,它是大小寫敏感的,且不關心匹配部分在字符串中的位置。

MATCH (n)

WHERE n.name CONTAINS 'bin'

RETURN n

字符串反向匹配

使用NOT關鍵詞可以返回不滿足給定字符串匹配要求的結果。如:

MATCH (n)

WHERE NOT n.name ENDS WITH 's'

RETURN n

返回了姓名不以"s"結尾的人

5.1.3、正則表達式 =~ 'regexp'

Cypher支持正則表達式過濾。正則表達式的語法繼承來自Java正則表達式。

正則表達式

可以使用=~ 'regexp'來進行正則表達式的匹配。如下:

MATCH (n)

WHERE n.name =~ 'Tom.*'

RETURN n

5.1.4 在WHERE中使用路徑模式

模式過濾

MATCH (n { name:'Kevin Bacon'}),(m)

WHERE (n)-[:ACTED_IN]-(m)

RETURN n,m

返回了Kevin Bacon參演過的電影。

模式中的NOT過濾

NOT功能可用於排除某個模式。

MATCH (n { name:'Kevin Bacon'}),(m:Movie)

WHERE NOT (n)-[:ACTED_IN]-(m)

RETURN m

返回了Kevin Bacon沒有參演過的電影。

模式中的屬性過濾

可以在模式中添加屬性來過濾結果。

MATCH (n)

WHERE (n)-[: ACTED_IN]-({ title: 'Apollo 13' })

RETURN n

返回參演Apollo 13電影的所有演員

關係類型過濾

    可以在MATCH模式中添加關係類型,但有時候希望在類型過濾上具有豐富的功能。這時,可以將類型與其他進行比較。例如,下面的例子將關係類型與一個正在表達式進行比較。

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

WHERE type(r)=~ 'DIRE.*'

RETURN n , m

返回所有導演。

5.1.5 列表

IN運算符

檢查列表中是否存在某個元素,可以使用IN運算符。

MATCH (a)

WHERE a.name IN ['Keanu Reeves', 'Lana Wachowski','Hugo Weaving']

RETURN a

返回三個人的節點。

六、RETURN返回

Neo4j CQL RETURN子句用於返回

  • 檢索節點的某些屬性
  • 檢索節點的所有屬性
  • 檢索節點和關聯關係的某些屬性
  • 檢索節點和關聯關係的所有屬性

6.1、返回節點

返回匹配到的節點,如下所示:

MATCH (n { name: 'Steve Zahn' })

RETURN n

本例中返回包含name屬性值爲'Steve Zahn'的節點。

6.2、返回關係

返回匹配的關係,如下所示:

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

RETURN r

本例中返回了關係。

6.3、返回屬性

返回屬性可以用點來引用屬性。如下所示:

MATCH (n { name: 'Steve Zahn' })

RETURN n.name

本例中返回了name屬性的值。

6.4、返回所有元素

當希望返回查詢中找到的所有節點,關係和路徑時,可以使用星號*表示。如下所示:

MATCH p =(a { name: 'Steve Zahn' })-[r]->(b)

RETURN *

本例中返回了所有節點、關係。

6.5、變量中的特殊字符

如果想使用空格等特殊字符,可以用反引號`將其括起來。如下所示:

MATCH (`This isn't a common variable`)

WHERE `This isn't a common variable`.name = 'Steve Zahn'

RETURN `This isn't a common variable`.happy

返回name屬性值爲'Steve Zahn'的節點。

6.6、列別名

如果希望列名不同於表達式中使用的名字,可以使用AS<new name>對其重命名。

MATCH (a { name: 'Steve Zahn' })

RETURN a.born AS bornYear

6.7、其他表達式

任何表達式都可以作爲返回項。如字面值,斷言,屬性,函數和任何其他表達式。

MATCH (a { name: 'Steve Zahn' })

RETURN a.born > 1960, "I'm a literal",(a)-->()

本例中返回了斷言,字符串和帶模式表達參數的函數調用。

6.8 唯一性結果

DISTINCT用於僅僅 獲取結果集中所依賴列的唯一行。

MATCH (a)

RETURN DISTINCT a.name

返回結果去掉重名。

後面命令下面文檔中介紹

文檔出自:龐國明 老師課程教學

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