圖數據庫基礎知識
圖數據庫以圖這種數據結構為基礎,可以保存任意種類的數據,以下圖為基礎,簡單介紹Neo4j中的幾個簡單概念:
1.節點(Nodes)
表示圖數據庫的實體(entities),代表圖數據庫中的數據記錄。上圖中的圓角矩形即代表圖數據庫中的一個節點。
2.關系(Relationships)
描述節點之間的關系,關系總是有方向並且有一個類型的,一個節點也可以和自己有關系。上圖中的箭頭便代表關系,ACTED_IN和DIRECTED表示關系的類型。
3.屬性(Properties)
用來保存數據,表示方法為name/value對,屬性值可以有多種數據類型,比如數字、字符串和布爾值。節點和關系都可以有自己的屬性,比如name='Tom Hanks’是一個節點的屬性,roles=[‘Forrest’]是一個關系的屬性。
4.標簽(Labels)
用來關聯一系列相關的節點,表示一組相關節點的域,沒有屬性。比如表示人的節點可以使用標簽:Person
,表示關系的類型為出演也使用標簽:ACTED_IN
。在執行圖數據庫操作時可以在限定的標簽域上進行。
5.模式(Schema)
Neo4j中的模式指的是索引(indexes)和約束(constraints)。不過Neo4j中的模式是可選的,即創建索引和約束不是必須的。索引可以提高性能,約束可以確保數據遵守領域規則。
6.Neo4j命名規則
Neo4j官方給出了推薦的命名規則,注意Neo4j中的命名是大小寫敏感的:
- 節點標簽(Node label):推薦首字母大寫的駝峰命名,如VehicleOwner
- 關系類型(Relationshio type):大寫字母結合下划線,如OWNS_VEHICLE
- 屬性(Property):首字母小寫的駝峰命名,如firstName
Neo4j Browser
Neo4j Browser是一個命令驅動的客戶機,適合運行即時的圖查詢語句。下載Neo4j Desktop之后,啟動工程后,在瀏覽器輸入http://localhost:7474/browser/ 便可以使用。在Neo4j Browser中:
- 開發人員只需要注重使用Cypher編寫和運行圖查詢語句
- 任何查詢結果可以導出為表格
- 查詢結果可以使用包含節點和關系的可視化圖形展示
- Cypher語句編輯框在瀏覽器上部,起始符為$。若想多行輸入,以< shift+enter > 換行,使用< ctrl+enter >運行查詢。
Neo4j Browser中也有指導教程,在編輯框輸入:play start
便可以開始探索Neo4j Browser了。
Neo4j基礎語法
1.節點語法(Node Syntax)
Neo4j中使用
()
代表一個節點
() # 一個匿名無特征地節點
(matrix) # 擁有變量名matrix的節點,其他地方可以通過變量名使用
(:Movie) # 聲明節點標簽為Movie,限制了匹配的模式
(matrix:Movie) # 既賦變量名又聲明標簽的節點
# {}表示節點屬性,用來存儲信息或限制模式
(matrix:Movie{title:"the matrix"})
(matrix:Movie{title:"the matrix",released:1997})
2.關系語法(Relationship Syntax)
Neo4j中使用一對虛線
--
表示無向關系,有向關系在尾部會有箭頭,比如<--
和-->
。中括號表達式[...]
用來為關系添加詳細信息,比如變量名、類型和屬性。
-->
-[role]-> #定義關系的變量名為role,其他地方可以使用
-[:ACTED_IN]-> # 定義關系的類型為ACTED_IN
-[role:ACTED_IN]-> # 同時定義關系的變量名和類型
-[role:ACTED_IN {roles:["Neo"]}]-> # 定義關系的屬性
3.模式語法(Pattern Syntax)
結合節點語法和關系語法可以表示模式。
# 以下是一個模式的實例
(keanu:Person {name:"Keanu Reeves"})
-[role:ACTED_IN {roles:["Neo"]}]->
(matrix:Movie {title:"The Matrix"})
# 表示指定姓名的人在指定電影中擔當指定角色的模式
圖數據庫Neo4j的查詢語言——Cypher
Cypher是一種聲明式的查詢語言,使用它可以描述需要查找的東西。
1.CREATE (create a node)
CREATE (ee:Person {name:"Emil",from:"Sweden"})
# CREATE從句可以用來生成數據
# CREATE ()表示生成一個node
# ee:Person表示變量ee和標簽Person,ee可以指示此節點
# {}中的鍵值對是節點內的屬性
CREATE (js:Person{name:"John",from:"Sweden"}),
(ir:Person{name:"Ian",from:"England"}),
(js)-[:KNOWS{since:2001}]->(ir)
# 若想同時生成多個數據需要使用','分隔
# ()-[]->()格式用來生成關系,()中寫的是節點變量名,[]中的:后為關系的標簽名,關系也可以使用{}生成關系的屬性
2.MATCH (find nodes)
MATCH (ee:Person) WHERE ee.name="Emil" RETURN ee
# MATCH從句用來指定節點和關系的模式
# (ee:Person)表示標簽為Person的節點,並將這類節點的變量命名為ee
# WHERE從句用來約束結果
# ee.name="Emil"比較了name屬性值與"Emil"的相等關系
# RETURN從句用於返回特定的結果
# 比如上句的含義為返回所有屬於Person的節點中name屬性值為"Emil"的所有節點
MATCH (ee:Person)-[:KNOWS]->(friends) WHERE ee.name="Emil" RETURN ee,friends
# MATCH從句描述了從已知節點到待尋找節點的模式
# -[:KNOWS]->匹配了可以是任意方向的關系KNOWS
# 上句的含義是查找Emil的朋友(假設存在KNOWS關系即為朋友)
3.MERGE(complete patterns)
無論何時,我們從外部系統獲取數據時,都無法確定某些信息是否在圖中已經存在。這時可以使用MERGE語句,它的工作方式類似於MATCH和CREATE的結合。MERGE語句在增加數據時會首先檢查數據是否存在,如果存在則進行匹配,否則便會創建新的數據。MERGE子句后可以顯式指定ON CREATE或ON MATCH子句,通過MERGE子句可以指定圖形中必須存在一個節點且必須具有特定的標簽和屬性等,如果不存在則會創建相應的節點。但是MERGE語句會增加執行時間,因為其需要首先檢查存在性,所以在確定不會新增重復數據時,建議使用CREATE。
# 若我們不知道電影是否存在,且需要為它添加新屬性,則可以使用MERGE
# 如果需要創建節點,則執行ON CREATE子句,更新節點數據
# 如果節點已存在,則執行ON MATCH子句,修改節點數據
MERGE (m:Movie {title:"Cloud Atlas"})
ON CREATE SET m.released=2012
ON MATCH SET n.counter = coalesce(n.counter,0)+1
RETURN m
# 在兩個節點之間查找或新建一個關系
MATCH (a:Person {name:"Jack"}),(b:Person {name"Rose"})
MERGE (a)-[:LOVES]->(b)
# 如果只傳入一個節點,MERGE會查找匹配該模式的另一節點或增加一個節點
CREATE (y:Year {year:2014})
MERGE (y)<-[:IN_YEAR]-(m10:Month {month:10})
MERGE (y)<-[:IN_YEAR]-(m11:Month {month:11})
RETURN y,m10,m11
4.PROFILE (use the visual query plan)
Neo4j Browser中使用PROFILE從句可以查看查詢的具體流程計划。
PROFILE MATCH (ee:Person) WHERE ee.name="Emil" RETURN ee
# 運行這句話之后,在Neo4j瀏覽器中便可以看到該語句具體的執行流程
- 1
- 2
5.WHERE (filterin results)
如果想要過濾結果並返回我們感興趣的數據,可以使用WHERE子句,WHERE子句中可以使用布爾表達式、謂詞以及AND,OR,XOR,NOT的結合,WHERE子句也可以使用數值比較、正則匹配和存在性檢查。
# 使用等號過濾
MATCH (m:Movie) WHERE m.ttle="The Matrix" RETURN m
# 上述語句等價於在模式中指定條件:
MATCH (m:Movie {title:"The Matrix"}) RETURN m
6.RETURN (return results)
RETURN子句可以返回任意數量的表達式,最簡單的表達式可以是數字、字符串、數組(arrays)和映射(maps)。節點和關系的屬性值都可以使用
.
來獲取,比如n.name
。數組中的值或切片可以通過下標來索引,比如names[0]
和movies[1..-1]
。表達式也可以是一些函數,比如length(array)
,toInteger("12")
,substring("2014-07-01",0,4)
和coalesce(p.nickname,"n/a")
。
# 默認表達式使用標簽作為列名,可以使用expression AS alias對列名重命名
MATCH (p:Person)
RETURN p,p.name AS name,toUpper(p.name),coalesce(p.nickname,"n/a") AS nickname,
{name:p.name,label:head(labels(p))} AS person
# 若希望展示不重復的結果,可以在RETURN子句中使用DISTINCT關鍵字
MATCH (n) RETURN DISTINCT labels(n) AS labels
7.Aggregating Information
在Cypher中,信息聚合主要出現在RETURN子句中,支持許多常見的聚合函數,比如
count
,sum
,avg
,min
,max
等。信息聚合的過程中會跳過NULL值,若只想聚合唯一信息,可以使用DISTINCT,比如count(DISTNICT role)
。
# 統計數據庫中的總人數
MATCH (:Person) RETURN count(*) AS people
# 統計演員和導演的合作次數
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(director:Person)
RETURN actor,director,count(*) AS collaborations
8.WITH
在Cypher中可以將語句片段鏈接在一起,在子查詢語句中可以獲得在
WITH
中聲明的列。WITH
子句用於組合各個部分,並聲明哪些數據從一個部分流向另一個部分。在WITH
子句中要注意所有的列名都要重命名。
# 選擇演過電影的演員,然后過濾只演過一部電影的演員
MATCH (person:Person)-[:ACTED_IN]->(m:Movie)
WITH person,count(*) AS appearances,collect(m.title) AS movies
WHERE appearances > 1
RETURN person.name, appearances,movies
9.LOAD CSV(import data)
# 使用LOAD CSV可以從外部導入CSV文件,支持FTP,HTTP等
LOAD CSV WITH HEADERS FROM "http://data.neo4j.com/northwind/products.csv" AS row
CREATE (n:Product)
SET n = row,
n.unitPrice = toFloat(row.unitPrice),
n.unitsInStock = toInteger(row.unitsInStock),
n.unitsOnOrder = toInteger(row.unitsOnOrder),
n.reorderLevel = toInteger(row.reorderLevel),
n.discontinued = (row.discontinued <> "0")
本文鏈接:https://blog.csdn.net/seeing_Liu/article/details/89040389Neo4j官方文檔 :https://neo4j.com/docs/