目錄
一.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 |
返回結果去掉重名。
後面命令下面文檔中介紹
文檔出自:龐國明 老師課程教學