日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Cypher语法

發布時間:2025/7/25 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Cypher语法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

cypher是neo4j官網提供的聲明式查詢語言,非常強大,用它可以完成任意的圖譜里面的查詢過濾,我們知識圖譜的一期項目 基本開發完畢,后面會陸續總結學習一下neo4j相關的知識。今天接著上篇文章來看下neo4j的cpyher查詢的一些基本概念和語法。

一,Node語法
在cypher里面通過用一對小括號()表示一個節點,它在cypher里面查詢形式如下:

1,() 代表匹配任意一個節點

2, (node1) 代表匹配任意一個節點,并給它起了一個別名

3, (:Lable) 代表查詢一個類型的數據

4, (person:Lable) 代表查詢一個類型的數據,并給它起了一個別名

5, (person:Lable {name:"小王"}) 查詢某個類型下,節點屬性滿足某個值的數據

6, (person:Lable {name:"小王",age:23}) 節點的屬性可以同時存在多個,是一個AND的關系

二,關系語法
關系用一對-組成,關系分有方向的進和出,如果是無方向就是進和出都查詢

1,--> 指向一個節點

2,-[role]-> 給關系加個別名

3,-[:acted_in]-> 訪問某一類關系

4,-[role:acted_in]-> 訪問某一類關系,并加了別名

5,-[role:acted_in {roles:["neo","hadoop"]}]->

訪問某一類關系下的某個屬性的關系的數據

三,模式語法
模式語法是節點和關系查詢語法的結合,通過模式語法我們可以進行我們想要的任意復雜的查詢

(p1: Person:Actor {name:"tom"})-[role:acted_in {roles:["neo","actor"]}]-(m1:Movie {title:"water"})
四, 模式變量
為了增加模塊化和減少重復,cypher允許把模式的結果指定在一個變量或者別名中,方便后續使用或操作

path = (: Person)-[:ACTED_IN]->(:Movie)

path是結果集的抽象封裝,有多個函數可以直接從path里面提取數據如:

nodes(path):提取所有的節點

rels(path): 提取所有的關系 和relationships(path)相等

length(path): 獲取路徑長度

五,條件
cypher語句也是由多個關鍵詞組成,像SQL的

select name, count() from talbe where age=24 group by name having count() >2 order by count(*) desc
多個關鍵字組成的語法,cypher也非常類似,每個關鍵詞會執行一個特定的task來處理數據

match: 查詢的主要關鍵詞

create: 類似sql里面的insert

filter,project,sort,page等都有對應的功能語句

通過組合上面的一些語句,我們可以寫出非常強大復雜的語法,來查詢我們想要檢索的內容,cypher會 自動解析語法并優化執行。

一些實際的用法例子:

1,創建
create (:Movie {title:"驢得水",released:2016}) return p;
執行成功,在neo4j的web頁面我們能看到下面的信息

+-------------------+| No data returned. |
+-------------------+Nodes created: 1
Properties set: 2
Labels added: 1
當然cypher也可以一次創建多個數據,并同時添加關系

2,查詢
match (p: Person) return p; 查詢Person類型的所有數據

match (p: Person {name:"sun"}) return p; 查詢名字等于sun的人

match( p1: Person {name:"sun"} )-[rel:friend]->(p2) return p2.name , p2.age 查詢sun的朋友的名字和年齡

match (old) ... create (new) create (old)-[rel:dr]->(new) return new 對已經存在的節點和新建的節點建立關系

3,查詢或更新
merge 語法可以對已經存在的節點不做改變,對變化的部分會合并

MERGE (m:Movie { title:"Cloud Atlas" })ON CREATE SET m.released = 2012RETURN m
merge .... on create set ... return 語法支持合并更新

4,篩選過濾
cypher過濾也是用的和SQL一樣的關鍵詞where

match (p1: Person) where p1.name="sun" return p1;

等同下面的

match (p1: Person {name:"sun"}) return p1

注意where條件里面支持 and , or ,xor,not等boolean運算符,在json串里面都是and

除此之外,where里面查詢還支持正則查詢

match (p1: Person)-[r:friend]->(p2: Person)
where p1.name=~"K.+" or p2.age=24 or "neo" in r.rels
return p1,r,p2
關系過濾匹配使用not

MATCH (p:Person)-[:ACTED_IN]->(m)WHERE NOT (p)-[:DIRECTED]->()RETURN p,m
5,結果集返回
MATCH (p:Person)RETURN p, p.name AS name, upper(p.name), coalesce(p.nickname,"n/a") AS nickname, { name: p.name, label:head(labels(p))} AS person
結果集返回做去重

match (n) return distinct n.name;
6,聚合函數
cypher支持count,sum,avg,min,max

match (: Person) return count(*)

聚合的時候null會被跳過 count 語法 支持 count( distinct role )

MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(director:Person)RETURN actor,director,count() AS collaborations
7,排序和分頁
MATCH (a:Person)-[:ACTED_IN]->(m:Movie)RETURN a,count() AS appearancesORDER BY appearances DESC SKIP 3 LIMIT 10;
8, 收集聚合結果
MATCH (m:Movie)<-[:ACTED_IN]-(a:Person)
RETURN m.title AS movie, collect(a.name) AS cast, count(*) AS actors
9, union 聯合
支持兩個查詢結構集一樣的結果合并

MATCH (actor:Person)-[r:ACTED_IN]->(movie:Movie)
RETURN actor.name AS name, type(r) AS acted_in, movie.title AS title
UNION (ALL)
MATCH (director:Person)-[r:DIRECTED]->(movie:Movie)
RETURN director.name AS name, type(r) AS acted_in, movie.title AS title
10, with
with語句給cypher提供了強大的pipeline能力,可以一個或者query的輸出,或者下一個query的輸入 和return語句非常類似,唯一不同的是,with的每一個結果,必須使用別名標識。

通過這個功能,我們可以輕而易舉的做到在查詢結果里面在繼續嵌套查詢。

MATCH (person:Person)-[:ACTED_IN]->(m:Movie)
WITH person, count(*) AS appearances, collect(m.title) AS movies
WHERE appearances > 1RETURN person.name, appearances, movies
注意在SQL里面,我們想過濾聚合結果,需要使用having語句但是在cypher里面我們可以配合with語句使用 where關鍵詞來完成過濾

11,添加約束或者索引
唯一約束(使用merge來實現) CREATE CONSTRAINT ON (movie:Movie) ASSERT movie.title IS UNIQUE

添加索引(在圖譜遍歷時,快速找到開始節點),大幅提高查詢遍歷性能 CREATE INDEX ON :Actor(name)

添加測試數據:

CREATE (actor:Actor { name:"Tom Hanks" }),(movie:Movie { title:‘Sleepless IN Seattle‘ }),
(actor)-[:ACTED_IN]->(movie);
使用索引查詢:

MATCH (actor:Actor { name: "Tom Hanks" })RETURN actor;

轉載于:https://www.cnblogs.com/zhengshiqiang47/p/8488490.html

總結

以上是生活随笔為你收集整理的Cypher语法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。