Neo4j使用Cypher查詢圖形數據

Neo4j使用Cypher查詢圖形數據,Cypher是描述性的圖形查詢語言,語法簡單,功能強大,因爲Neo4j在圖形數據庫家族中處於絕對領先的地位,擁有衆多的用戶基數,使得Cypher成爲圖形查詢語言的事實上的標準。本文做爲入門級的教程,我不會試圖分析Cypher語言的所有內容,本文的目標是按部就班地使用Cypher語言執行簡單的CRUD操做,爲了便於演示,本文在Neo4j Browser中執行Cypher示例代碼。如下圖形包含三個節點和兩個關係,本文會一步一步講解如何利用Cypher語言建立如下圖形。數據庫

 

 

一,easy,熱熱身函數

和SQL很類似,Cypher語言的關鍵字不區分大小寫,可是屬性值,標籤,關係類型和變量是區分大小寫的。post

1,變量(Variable)spa

變量用於對搜索模式的部分進行命名,並在同一個查詢中引用,在小括號()中命名變量,變量名是區分大小寫的,示例代碼建立了兩個變量:n和b,經過return子句返回變量b;3d

MATCH (n)-->(b)
RETURN b

在Cypher查詢中,變量用於引用搜索模式(Pattern),可是變量不是必需的,若是不須要引用,那麼能夠忽略變量。rest

2,訪問屬性code

在Cypher查詢中,經過逗號來訪問屬性,格式是:Variable.PropertyKey,經過id函數來訪問實體的ID,格式是id(Variable)。blog

match (n)-->(b)
where id(n)=5 and b.age=18
return b;

二,建立節點教程

節點模式的構成:(Variable:Lable1:Lable2{Key1:Value1,Key2,Value2}),實際上,每一個節點都有一個整數ID,在建立新的節點時,Neo4j自動爲節點設置ID值,在整個數據庫中,節點的ID值是遞增的和惟一的。ip

下面的Cypher查詢建立一個節點,標籤是Person,具備兩個屬性name和born,經過RETURN子句,返回新建的節點:

create (n:Person { name: 'Tom Hanks', born: 1956 }) return n;

繼續建立其餘節點:

create (n:Person { name: 'Robert Zemeckis', born: 1951 }) return n;
create (n:Movie { title: 'Forrest Gump', released: 1951 }) return n;

三,查詢節點

經過match子句查詢數據庫,match子句用於指定搜索的模式(Pattern),where子句爲match模式增長謂詞(Predicate),用於對Pattern進行約束;

1,查詢整個圖形數據庫

match(n) return n;

在圖形數據庫中,有三個節點,Person標籤有連個節點,Movie有1個節點

點擊節點,查看節點的屬性,如圖,Neo4j自動爲節點設置ID值,本例中,Forrest Gump節點的ID值是5,

2,查詢born屬性小於1955的節點

match(n) 
where n.born<1955 
return n;

3,查詢具備指定Lable的節點

match(n:Movie) 
return n;

4,查詢具備指定屬性的節點

match(n{name:'Tom Hanks'}) 
return n;

四,建立關係

關係的構成:StartNode - [Variable:RelationshipType{Key1:Value1,Key2:Value2}] -> EndNode,在建立關係時,必須指定關係類型。

1,建立沒有任何屬性的關係

MATCH (a:Person),(b:Movie)
WHERE a.name = 'Robert Zemeckis' AND b.title = 'Forrest Gump'
CREATE (a)-[r:DIRECTED]->(b)
RETURN r;

2,建立關係,並設置關係的屬性

MATCH (a:Person),(b:Movie)
WHERE a.name = 'Tom Hanks' AND b.title = 'Forrest Gump'
CREATE (a)-[r:ACTED_IN { roles:['Forrest'] }]->(b)
RETURN r;

五,查詢關係

在Cypher中,關係分爲三種:符號「--」,表示有關係,忽略關係的類型和方向;符號「-->」和「<--」,表示有方向的關係;

1,查詢整個數據圖形

2,查詢跟指定節點有關係的節點

示例腳本返回跟Movie標籤有關係的全部節點

match(n)--(m:Movie) 
return n;

2,查詢有向關係的節點

MATCH (:Person { name: 'Tom Hanks' })-->(movie)
RETURN movie;

3,爲關係命名,經過[r]爲關係定義一個變量名,經過函數type獲取關係的類型

MATCH (:Person { name: 'Tom Hanks' })-[r]->(movie)
RETURN r,type(r);

4,查詢特定的關係類型,經過[Variable:RelationshipType{Key:Value}]指定關係的類型和屬性

MATCH (:Person { name: 'Tom Hanks' })-[r:ACTED_IN{roles:'Forrest'}]->(movie)
RETURN r,type(r);

六,更新圖形

set子句,用於對更新節點的標籤和實體的屬性;remove子句用於移除實體的屬性和節點的標籤;

1,建立一個完整的Path

因爲Path是由節點和關係構成的,當路徑中的關係或節點不存在時,Neo4j會自動建立;

CREATE p =(vic:Worker:Person{ name:'vic',title:"Developer" })-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael:Worker:Person { name: 'Michael',title:"Manager" })
RETURN p

變量neo表明的節點沒有任何屬性,可是,其有一個ID值,經過ID值爲該節點設置屬性和標籤

2,爲節點增長屬性

經過節點的ID獲取節點,Neo4j推薦經過where子句和ID函數來實現。

match (n)
where id(n)=7
set n.name = 'neo'
return n;

3,爲節點增長標籤

match (n)
where id(n)=7
set n:Company
return n;

4,爲關係增長屬性

match (n)<-[r]-(m)
where id(n)=7 and id(m)=8
set r.team='Azure'
return n;

七,Merge子句

Merge子句的做用有兩個:當模式(Pattern)存在時,匹配該模式;當模式不存在時,建立新的模式,功能是match子句和create的組合。在merge子句以後,能夠顯式指定on creae和on match子句,用於修改綁定的節點或關係的屬性。

經過merge子句,你能夠指定圖形中必須存在一個節點,該節點必須具備特定的標籤,屬性等,若是不存在,那麼merge子句將建立相應的節點。

1,經過merge子句匹配搜索模式

匹配模式是:一個節點有Person標籤,而且具備name屬性;若是數據庫不存在該模式,那麼建立新的節點;若是存在該模式,那麼綁定該節點;

MERGE (michael:Person { name: 'Michael Douglas' })
RETURN michael;

2,在merge子句中指定on create子句

若是須要建立節點,那麼執行on create子句,修改節點的屬性;

ERGE (keanu:Person { name: 'Keanu Reeves' })
ON CREATE SET keanu.created = timestamp()
RETURN keanu.name, keanu.created

3,在merge子句中指定on match子句

若是節點已經存在於數據庫中,那麼執行on match子句,修改節點的屬性;

MERGE (person:Person)
ON MATCH SET person.found = TRUE , person.lastAccessed = timestamp()
RETURN person.name, person.found, person.lastAccessed

4,在merge子句中同時指定on create 和 on match子句

MERGE (keanu:Person { name: 'Keanu Reeves' })
ON CREATE SET keanu.created = timestamp()
ON MATCH SET keanu.lastSeen = timestamp()
RETURN keanu.name, keanu.created, keanu.lastSeen

5,merge子句用於match或create一個關係

MATCH (charlie:Person { name: 'Charlie Sheen' }),(wallStreet:Movie { title: 'Wall Street' })
MERGE (charlie)-[r:ACTED_IN]->(wallStreet)
RETURN charlie.name, type(r), wallStreet.title

6,merge子句用於match或create多個關係

MATCH (oliver:Person { name: 'Oliver Stone' }),(reiner:Person { name: 'Rob Reiner' })
MERGE (oliver)-[:DIRECTED]->(movie:Movie)<-[:ACTED_IN]-(reiner)
RETURN movie

7,merge子句用於子查詢

複製代碼
MATCH (person:Person)
MERGE (city:City { name: person.bornIn })
RETURN person.name, person.bornIn, city;

MATCH (person:Person)
MERGE (person)-[r:HAS_CHAUFFEUR]->(chauffeur:Chauffeur { name: person.chauffeurName })
RETURN person.name, person.chauffeurName, chauffeur;

MATCH (person:Person)
MERGE (city:City { name: person.bornIn })
MERGE (person)-[r:BORN_IN]->(city)
RETURN person.name, person.bornIn, city;
複製代碼

八,跟實體相關的函數

1,經過id函數,返回節點或關係的ID

MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN id(r);

2,經過type函數,查詢關係的類型

MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN type(r);

3,經過lables函數,查詢節點的標籤

MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN lables(movie);

4,經過keys函數,查看節點或關係的屬性鍵

MATCH (a)
WHERE a.name = 'Alice'
RETURN keys(a)

5,經過properties()函數,查看節點或關係的屬性

CREATE (p:Person { name: 'Stefan', city: 'Berlin' })
RETURN properties(p)

    

 

 

參考文檔:

Chapter 3. Cypher

3.3.16. MERGE

相關文章
相關標籤/搜索