Cypher是Neo4j專門用于圖資料庫的查詢語言,類似于Oracle資料庫的SQL語言,是一種聲明式查詢語言,隻需要使用者描述需要執行什麼動作(match、insert等),而不需要描述具體怎麼做,需要注意的是,隻有在商業版中,Cypher的查詢語句編譯器才會生成高性能的查詢動作. 同時Cypher項目中又建立了一個支援Spark的項目,Cypher for Apache Spark
Neo4j裡面提供了多種不同的通路方式,包括
- 通過一個HTTP API執行Cypher查詢,并擷取JSON格式的結果;
- 一種“非托管擴充”機制,允許你為Neo4j資料庫編寫自己的終結點;
- 通過一個高層Java API指定節點與關系的周遊;
- 通過一個低層的批量加載API處理海量初始資料的擷取;
- 通過一個核心Java API直接通路節點與關系,以獲得最大的性能;
首先需要介紹,Neo4j能夠存儲的圖資料的類别,其中包括
- 節點名稱(node-name) 和 節點标簽名稱(label-name)
- 節點的屬性和屬性值{properties-list}
- 聯系名稱(relationship-name) 和 聯系标簽(relationship-label-name)
- 聯系的屬性和屬性值{properties-list}
節點是圖中的實體,它可以儲存任意數量的屬性(鍵值對),同時通過标簽進行标記,來表示在建構的具體領域中的不同角色. 聯系提供了兩個實體節點之間的,具名有向邊,兩個節點之間可以擁有任意數量的關聯聯系.
模式
同時在Cypher裡面有一個很重要的概念,就是模式. 節點和關聯關系組成特定的圖結構模型,模式的描述形式可以是連續,也可以通過逗号間隔,在Neo4j裡提供一下例子:
朋友的朋友: (user)-[:KNOWS]-(friend)-[:KNOWS]-(foaf)
查詢最短距離: path = shortestPath( (user)-[:KNOWS*..]-(other) )
協同過濾 (user)-[:PURCHASED]->(product)<-[:PURCHASED]-()-[:PURCHASED]->(otherProduct)
樹查詢 (root)<-[:PARENT*]-(leaf:Category)-[:ITEM]->(data:Product
以上的模式描述可以被用到MATCH和CREATE語句裡,用于比對傳回特定模式的資料
Node
表示為:
(<node1-name>:<node1-label-name>{<define-properties-list>})
Eg:
(video1:YoutubeVideo1{title:"Action Movie1",updated_by:"Abc",uploaded_date:"10/10/2010"})
聯系
表示為:
[<relationship-label-name>:<relationship-name>{<define-properties-list>}]
Eg:

上圖所示的,兩個實體以及兩個實體之間的聯系以以下形式模組化:
(video1:YoutubeVideo1{title:"Action Movie1",updated_by:"Abc",uploaded_date:"10/10/2010"})
-[movie:ACTION_MOVIES{rating:1}]->
(video2:YoutubeVideo2{title:"Action Movie2",updated_by:"Xyz",uploaded_date:"12/12/2012"})
關聯關系的方向性通過 -[relation]-> 表示.
以下主要介紹Cypher中的一些主要語句
MARCH RETURN
- MATCH: 比對相應的模式
- RETURN:傳回資料
MATCH (john {name: 'John'})-[:friend]->()-[:friend]->(fof)
RETURN john.name, fof.name
以上比對的模式就是節點名稱為“john”的朋友的朋友是節點名稱為“fof”,傳回john和fof節點的name屬性
CREATE、DELETE
CREATE
- 建立沒有屬性的節點
- 使用屬性建立節點
- 在沒有屬性的節點之間建立關系
- 使用屬性建立節點之間的關系
- 為節點或關系建立單個或多個标簽
- 直接建立節點
CREATE (you:Person {name:"You"})
RETURN you
- 通過比對模式建立節點
MATCH (you:Person {name:"You"})
CREATE (you)-[like:LIKE]->(neo:Database {name:"Neo4j" })
RETURN you,like,neo
MATCH (you:Person {name:"You"})
FOREACH (name in ["Johan","Rajesh","Anna","Julia","Andrew"] |
CREATE (you)-[:FRIEND]->(:Person {name:name}))
DELETE
待續…..
資料來源:
neo4j.com