圖資料庫基礎知識
圖資料庫以圖這種資料結構為基礎,可以儲存任意種類的資料,以下圖為基礎,簡單介紹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中也有指導教程,在編輯框輸入
便可以開始探索Neo4j Browser了。:play start
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
等。資訊聚合的過程中會跳過NULL值,若隻想聚合唯一資訊,可以使用DISTINCT,比如
max
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")
Neo4j官方文檔 :https://neo4j.com/docs/
本文連結:https://blog.csdn.net/seeing_Liu/article/details/89040389