Neo4j Browser(圖數據庫)學習筆記——Cypher小結

 

一、創建節點及關係:

/*創建一個節點*/
CREATE (sanlang:People{name:'三浪',age:36,gender:'man'});
/*創建三個節點,以及節點之間的關係*/
CREATE (ashiliu:People{name:'阿十六',age:15,gender:'girl'}),
(basong:People{name:'霸宋',age:18,gender:'boy'}),
(balong:People{name:'霸龍',age:18,gender:'boy'}),
(basong)-[rel1:LIKES{since:'2017'}]->(ashiliu),
(balong)-[rel2:LIKES{since:'2017'}]->(ashiliu);

CREATE:創建關鍵字,用於創建新節點,可以一個個創建,也可一次創建多個

():定義節點內容

sanlang:用於存儲創建節點的變量

People:創建節點的標籤(類別)

{}:定義節點屬性,內容爲鍵值對,值可以爲字符串、數值、布爾值

-[]->:創建兩個節點之間的關係(>說明關係方向是由左向右)

二、查詢節點:

/*查詢名字爲霸龍、年齡超過14歲、標籤(類別)爲People的節點並返回*/
MATCH (somebody:People{name:'霸龍'}) WHERE somebody.age > 14 RETURN somebody;
/*查詢關係爲LIKES且關係屬性since爲2017的節點及關係並返回*/
MATCH (peo1:People)-[rel:LIKES{since:'2017'}]->(peo2:People) RETURN peo1,rel,peo2;
/*查詢所有標籤(類別)爲People的節點並返回上限25*/
MATCH (peo:People) RETURN peo LIMIT 25;

MATCH:查詢關鍵字,用於匹配節點或關係(關鍵詞與節點信息之間需要加空格)

():定義查詢節點條件

somebody:用於存儲查詢結果的變量

People:查詢節點條件——節點標籤(類別),可爲零個或多個

{}:查詢節點條件——屬性限制

WHERE:查詢節點條件限制關鍵字——屬性限制

RETURN:返回關鍵字,用於返回查詢結果

LIMIT:限制返回查詢結果

根據id查找節點:

MATCH (ashiliu:People) WHERE id(ashiliu)=206 RETURN ashiliu;

字符串首尾可以使用STARTS WITH和ENDS WITH去匹配定位字符串,還可以使用CONTAINS匹配字符串中包含的字符串,在前面添加NOT就是字符串排除匹配:

/*查詢name中以'霸'開頭的字符串節點*/
MATCH (peo) where peo.name STARTS WITH '霸' return peo;
/*查詢name中以'龍'結尾的字符串節點*/
MATCH (peo) where peo.name ENDS WITH '龍' return peo;
/*查詢name中含有'十'的字符串節點*/
MATCH (peo) where peo.name CONTAINS '十' return peo;
/*查詢name中不含有'霸'的字符串節點*/
MATCH (peo) where NOT peo.name CONTAINS '霸' return peo;

字符串正則表達式匹配,正則表達式使用的解析符號是=~:

/*查找name屬性中含有'霸'的節點,類似於mysql中的 like '%霸%'*/
MATCH (peo:People) WHERE peo.name =~ '.*霸.*' RETURN peo;

/*不區分大小寫正則匹配,name屬性中以'ANNY'開頭的節點*/
MATCH (peo:People) WHERE peo.name =~ '(?!)ANNY.*' RETURN peo;

WHERE句子中使用路徑匹配進行過濾:

/*在圖中匹配name屬性爲'霸儒','霸龍'的節點*/
MATCH (peo:People) WHERE peo.name IN ['霸儒','霸龍'] RETURN peo;
/*使用NOT匹配與'阿十六'無關的人*/
MATCH (ashiliu:People{name:'阿十六'}),(peo) WHERE NOT (peo)-[]-(ashiliu) RETURN peo;
/*在圖中匹配阿十六節點和與阿十六節點關係類型以L開頭的所有關係*/
MATCH (ashiliu:People{name:'阿十六'})-[r]-(peo) WHERE type(r)=~'L.*' RETURN peo;

使用“或”邏輯匹配關係:

/*返回關係爲LIKES和Friend的所有節點關係*/
MATCH p=(n)-[:LIKES|:Friend]-(m) RETURN p;

關係深度匹配(具體效果不明···運行的時候neo4j瀏覽器直接黑屏了···):

/*匹配從n到m,任意關係、深度1到5的節點*/
MATCH p=(n)-[*1..5]-(m) RETURN p;
/*匹配從n到m,任意關係、任意深度的節點*/
MATCH p=(n)-[*]-(m) RETURN p;

SKIP LIMIT匹配分頁返回:

/*匹配標籤(分類)爲People的節點,2個節點之後的5個節點(類似於每5個節點做爲一頁,2個節點後的第一頁)*/
MATCH (peo) where labels(peo)="People" RETURN peo SKIP 2 LIMIT 5;

DISTINCT去重:

MATCH (peo) where labels(peo)="People" RETURN DISTINCT peo;

ORDER BY排序,DESC 倒序:

MATCH (peo) where labels(peo)="People" RETURN peo ORDER BY peo.gender DESC;

AS使用別名返回節點屬性:

MATCH (peo) WHERE labels(peo)="People" RETURN peo.name AS nickname;

WITH將第一部分匹配的輸出作爲下一部分匹配的輸入,若在WITH語句中沒有聲明第一部分的變量,那麼在下一部分匹配時就無法使用此變量:

    1.查找喜愛者少於10個的阿姓節點:

MATCH (ashiliu:People)-[:LIKES]-(liker)
WHERE ashiliu.name =~ '阿.*'
/*若下句未聲明liker,哪怕聲明瞭count(liker),下面也無法獲取到liker*/
WITH ashiliu,liker,count(liker) as likers    
WHERE likers<10
RETURN liker

    2.WITH中使用排序和分頁

MATCH (peo:People)-[:Friend]-(friend)
WITH peo,friend,count(friend) as friends
ORDER BY friends DESC
SKIP 1 LIMIT 3
RETURN friend

UNION合併求並集:

    1.使用UNION結果去重求並集

MATCH (a:People)-[:Friend]->(b)
RETURN a.name AS name
UNION
MATCH (a:People)-[:LIKES]->(b)
RETURN b.name AS name

    2.使用UNION ALL結果不去重求和集

MATCH (a:People)-[:Friend]->(b)
RETURN a.name AS name
UNION ALL
MATCH (a:People)-[:LIKES]->(b)
RETURN b.name AS name

START語句匹配節點信息:

    1.匹配所有節點

STRAT n=node(*) RETURN n

    2.根據節點的具體id匹配

START n=node(1) RETURN n

三、查詢創建結合

MATCH (boy:People) WHERE boy.gender='boy' 
CREATE (bai:People:xiuzhen{name:'白',age:26,gender:'man'}),
(boy)-[:Friend]->(bai),(bai)-[:Friend]->(boy);
MATCH (bai:People{name:'白'}),(ashiliu:People{name:'阿十六'}),(peo:People)-[:LIKES]-(ashiliu)
CREATE (bai)-[:Friend]->(peo),(peo)-[:Friend]->(bai),(bai)-[:Friend]->(ashiliu),(ashiliu)-[:Friend]->(bai);

使用MATCH查詢後直接換行(或空格間隔)就可以繼續CREATE創建了,不需要用,或;分隔

四、查詢創建合一關鍵字——MERGE

MERGE (yurouzi:People{name:'羽柔子',age:19,gender:'girl'})-[:Friend]->(bai:People{name:'白'});
MATCH (yurouzi:People{name:'羽柔子'}),(balong:People{name:'霸龍'})
MERGE (yurouzi)-[:Friend]->(balong);

MERGE:此關鍵字表示若節點/關係不存在就創建新節點/關係,否則不做操作;用此關鍵字同時進行匹配創建時需要注意模式要完全匹配,否則就會創建新的模式,如下就會創建新的節點和關係:

MERGE (ashiliu:People{name:'阿十六'})-[l:LIKES]->(balong:People{name:'霸龍'}) RETURN ashiliu;

在MERGE子句之後,可以顯式指定on creae和on match子句,用於修改綁定的節點或關係的屬性:

/*根據name屬性爲'阿十六'且標籤爲'People'查找到對應節點,將該節點的hobby屬性設置爲'渡劫'*/
MERGE (ashiliu:People{name:'阿十六'}) on MATCH SET ashiliu.hobby='渡劫' return ashiliu;
/*創建霸儒節點,並將該節點的hobby屬性設置爲'組團渡劫'*/
MERGE (baru:People{name:'霸儒',age:18,gender:'boy'}) on CREATE SET baru.hobby='組團渡劫' return baru;
/*同時指定on create和 on match,當節點不存在時僅執行 on create否則僅執行 on match*/
MERGE (bamo:People{name:'霸魔',age:18,gender:'boy'}) 
ON CREATE SET bamo.hobby = '懟大佬'
ON MATCH SET bamo.nickname = '書山壓力大'
RETURN bamo;

其他MERGE的運用,匹配時不同於MATCH的地方是MERGE匹配多個節點時不能直接用','間隔:

MERGE (ashiliu:People{name:'阿十六'}) 
MERGE (baru:People{name:'霸儒'}) 
MERGE (baru)-[l:LIKES]->(ashiliu) return l
MERGE (baru)<-[l:LIKES]-(ashiliu) return l;
/*上面的等同於下面的*/
MATCH (ashiliu:People{name:'阿十六'}),(baru:People{name:'霸儒'})
MERGE (baru)-[l:LIKES]->(ashiliu) return l
MERGE (baru)<-[l:LIKES]-(ashiliu) return l;

MERGE上使用唯一性約束,添加約束後便可通過該屬性獲取到(若沒有則創建)唯一的節點:

/*將name屬性做爲唯一性約束*/
CREATE CONSTRAINT ON (n:People) ASSERT n.name IS UNIQUE;
MERGE (ashiliu:People{name:'阿十六'}) RETURN ashiliu;

添加唯一性約束後再使用下面的腳本便會報錯Neo.ClientError.Schema.ConstraintValidationFailed: Node(208) already exists with label `People` and property `name` = '霸龍':

MERGE (ashiliu:People{name:'阿十六'})
MERGE (ashiliu)-[:LIKES]->(balong:People{name:'霸龍'})
RETURN ashiliu;

報錯是因爲阿十六喜歡霸龍的關係是不存在的,所以需要創建此關係,然而霸龍是存在的,所以無法再次創建霸龍節點。

所以解決此錯誤有三種方案:

  1. 上策:在match的時候直接把霸龍節點一起找到,在merge創建阿十六和霸龍之間的關係時直接使用找到的變量
  2. 中策:修改現有霸龍節點name屬性或新建霸龍節點的name屬性
  3. 下策:刪掉現有的霸龍節點,然後直接創建霸龍節點和阿十六與霸龍之間的關係

五、特殊函數

1.獲取節點或關係的id

​MATCH (bai:People{name:'白'})-[r]->(ashiliu:People{name:'阿十六'}) RETURN id(bai),id(r),id(ashiliu)

2.獲取節點類型

MATCH (bai:People{name:'白'})-[r]->(ashiliu:People{name:'阿十六'}) RETURN type(r)

3.獲取節點標籤(類別)

MATCH (bai:People{name:'白'})-[r]->(ashiliu) RETURN labels(ashiliu)

4.獲取節點或關係的屬性鍵值

MATCH (bai:People{name:'白'})-[r]->(ashiliu:People{name:'阿十六'}) RETURN keys(bai),keys(r)

5.獲取節點或關係的屬性

MATCH (bai:People{name:'白'})-[r]->(ashiliu:People{name:'阿十六'}) RETURN properties(bai),properties(r)

六、節點更新和刪除

1.更新和添加一個屬性

MATCH (n:People{name:'霸龍'})
SET n.name='霸霸龍'           //修改name屬性值爲'霸霸龍'
SET n.hobby='享受疼痛'        //添加一個屬性hobby='享受疼痛'
RETURN n

2.修改節點信息,覆蓋節點屬性(=)

//刪除原有屬性,新增nickName屬性
MATCH (peo:People{name:'白'})
SET peo={nickName:'白尊者'}
RETURN peo

3.刪除節點屬性

MATCH (peo{nickName:'白尊者'}) REMOVE peo.nickName RETURN peo

4.修改節點信息,新增節點屬性(+=)

MATCH (peo:People{name:'白'})
SET peo+={nickName:'白尊者'}
RETURN peo

5.爲節點添加新標籤

//添加一個標籤
MATCH (peo:People{name:'白'}) SET peo:ZunZhe RETURN peo
//添加多個標籤
MATCH (peo:People{name:'白'}) SET peo:ZunZhe:XuanSheng RETURN peo

6.刪除節點標籤

MATCH (peo:People{name:'白'}) REMOVE peo:XuanSheng RETURN peo

7.刪除節點和關係(帶關係的節點刪除的時候需要先刪除關係,否則會報錯)

MATCH (a)-[r:Friend]->(b) DELETE r,b

8.級聯刪除(刪除“白”節點之後,將與白節點簡歷關係也刪除掉)

MATCH (peo:People{name:'白'}) DETACH DELETE peo

七、索引和約束

1.創建索引:不可以爲已經創建節點屬性唯一約束的屬性創建索引

//爲“People”標籤的name屬性創建索引
CREATE INDEX ON : People(name)

2.刪除索引

//刪除“People”標籤的name屬性的索引
DROP INDEX ON: People(name)

3.匹配條件中使用索引

MATCH (peo:People) WHERE peo.name = '白' RETURN n

4.創建節點屬性唯一約束:創建一個唯一約束保證圖數據庫中同一個標籤內的節點的屬性值不重複,不過不可以爲已經創建索引的屬性創建唯一約束

CREATE CONSTRAINT ON (peo:People) ASSERT peo.name IS UNIQUE

5.刪除節點屬性唯一性約束

DROP CONSTRAINT ON (peo:People) ASSERT peo.name is UNIQUE

 

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