一、基本概念
Cypher是一個圖形查詢語言,用於在Neo4j圖形資料庫中進行查詢。它的語法格式類似於SQL,但是它的查詢對象是節點和關係。一個Cypher查詢由多個子句構成,每個子句都以關鍵字開頭。
在Cypher中,節點由圓括弧表示,關係用中括弧表示,節點和關係都可以具有屬性。
// 查詢id為1的節點及其所有關係和屬性 MATCH(n {id:1}) RETURN n
二、MATCH子句
MATCH子句用於從圖形資料庫中檢索數據。在MATCH後面,可以指定要檢索的節點和關係的模式,以及它們的屬性和標籤。
可以在一個MATCH子句中指定多個模式,它們之間互相連接,形成一個完整的模式鏈。
// 查詢通過產品類型為「手機」連接的所有訂單 MATCH (p:Product {type:'手機'})<-[:CONTAINS]-(o:Order) RETURN o
三、WHERE子句
WHERE子句用於過濾MATCH子句返回的結果。在WHERE子句中可以指定多個過濾條件,它們之間用AND或OR連接。
// 查詢出品時間在2020年之前的所有產品 MATCH (p:Product) WHERE p.produce_date.year<2020 RETURN p
四、RETURN子句
RETURN子句用於返回查詢結果。可以在RETURN後面指定要返回的節點或關係的屬性、標籤、或者一些計算結果。
// 查詢所有年齡大於30歲的用戶的郵箱地址 MATCH (u:User) WHERE u.age>30 RETURN u.email
五、CREATE子句
CREATE子句用於創建節點或關係。可以在CREATE子句中指定節點或關係的標籤、屬性和連接方式。
// 創建一個名為「張三」的用戶節點 CREATE (u:User {name:'張三'})
六、MERGE子句
MERGE子句用於創建或者更新節點或關係。如果資料庫中不存在與MERGE指定的模式相匹配的節點或關係,則創建它們;如果存在,則更新它們的屬性。
// 如果不存在id為1的節點,則創建它;否則更新它的name屬性 MERGE (n {id:1}) SET n.name='張三'
七、DELETE子句
DELETE子句用於刪除節點或關係,如果在刪除節點的同時會刪除與之相關的所有關係。
// 刪除id為1的節點及與之相關的所有關係 MATCH (n {id:1}) DETACH DELETE n
八、ORDER BY子句
ORDER BY子句用於按照指定的屬性或者表達式對查詢結果進行排序。可以指定升序或降序。
// 查詢價格最高的前10個產品 MATCH (p:Product) RETURN p ORDER BY p.price DESC LIMIT 10
九、UNION子句
UNION子句用於對兩個或多個查詢結果進行合併。要求每個查詢結果的列數和列名必須相同。
// 查詢產品類型為「手機」或「電腦」的所有訂單 MATCH (p1:Product {type:'手機'})<-[:CONTAINS]-(o1:Order) RETURN o1 UNION MATCH (p2:Product {type:'電腦'})<-[:CONTAINS]-(o2:Order) RETURN o2
十、WITH子句
WITH子句用於在查詢中創建中間結果。可以在WITH後面指定要返回的列和一些計算結果,然後將中間結果傳遞給下一個子句。
// 按照用戶的購買金額排名查詢前10名用戶 MATCH (u:User)(p:Product) WITH u, SUM(p.price) AS totalPrice RETURN u ORDER BY totalPrice DESC LIMIT 10
十一、CALL子句
CALL子句用於調用Neo4j內置的一些過程或者Java方法。可以在CALL後面指定要調用的函數和參數。
// 執行Jaccard相似度演算法 MATCH (p1:Product)-[:CONTAINS]->()<-[:CONTAINS]-(p2:Product) WITH p1, p2, COUNT(*) AS intersection CALL algo.similarity.jaccard.stream(p1, p2, {write:true, topK:10, similarityCutoff:0.01}) YIELD item1, item2, similarity RETURN item1.name, item2.name, intersection, similarity
十二、FOREACH子句
FOREACH子句用於循環遍歷一個給定的列表,對其中的每個元素都執行一系列操作。
// 對訂單中的所有產品計算總價,並添加「total_price」屬性到訂單中 MATCH (o:Order)-[:CONTAINS]->(p:Product) WITH o, SUM(p.price) AS totalPrice FOREACH(ignoreMe IN CASE WHEN o.total_price IS NOT NULL THEN [1] ELSE [] END | SET o.total_price = totalPrice)
原創文章,作者:KGAIC,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/332800.html