Neo4j 第三篇:Cypher查詢入門


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

 

我的Neo4j系列的文章收錄在:Neo4j

 

一,easy,熱熱身

和SQL很相似,Cypher語言的關鍵字不區分大小寫,但是屬性值,標簽,關系類型和變量是區分大小寫的。

1,變量(Variable)

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

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

在Cypher查詢中,變量用於引用搜索模式(Pattern),但是變量不是必需的,如果不需要引用,那么可以忽略變量。

2,訪問屬性

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

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

二,創建節點

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

下面的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;

七,跟實體相關的函數

跟實體相關的函數,主要是獲取節點或關系的ID,關系類型,標簽和屬性等函數。

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)

八,模式

模式,用於描述如何搜索數據,模式的格式是:使用()標識節點,使用[]標識關系,為了更有效地使用Cypher查詢,必須深入理解模式。 

1,節點模式

節點具有標簽和屬性,Cypher為了引用節點,需要給節點命名:

  • (n) :該模式用於描述節點,節點的變量名是n;匿名節點是();
  • (n:lable):該模式用於描述節點,節點具有特定的標簽lable;也可以指定多個標簽;
  • (n{name:"Vic"}):該模式用於描述節點,節點具有name屬性,並且name屬性值是“Vic”;也可以指定多個屬性;
  • (n:lablle{name:"Vic"}):該模式用於描述節點,節點具有特定的標簽和name屬性,並且name屬性值是“Vic”;

2,關系模式

在屬性圖中,節點之間存在關系,關系通過[]表示,節點之間的關系通過箭頭()-[]->()表示,例如:

  • [r]:該模式用於描述關系,關系的變量名是r;匿名關系是[]
  • [r:type]:該模式用於描述關系,關系類型是type;每一個關系必須有且僅有一個類型;
  • [r:type{name:"Friend"}]:該模式用於描述關系,關系的類型是type,關系具有屬性name,並且name屬性值是“Friend”;

3,關聯節點模式

節點之間通過關系聯系在一下,由於關系具有方向性,因此,-->表示存在有向的關系,--表示存在關聯,不指定關系的方向,例如:

  • (a)-[r]->(b) :該模式用於描述節點a和b之間存在有向的關系r,
  • (a)-->(b):該模式用於描述a和b之間存在有向關系;

4,變長路徑的模式

從一個節點,通過直接關系,連接到另外一個節點,這個過程叫遍歷,經過的節點和關系的組合叫做路徑(Path),路徑是由節點和關系的有序組合。

  • (a)-->(b):是步長為1的路徑,節點a和b之間有關系直接關聯;
  • (a)-->()-->(b):是步長為2的路徑,從節點a,經過兩個關系和一個節點,到達節點b;

Cypher語言支持變長路徑的模式,變長路徑的表示方式是:[*N..M],N和M表示路徑長度的最小值和最大值。

  • (a)-[*2]->(b):表示路徑長度為2,起始節點是a,終止節點是b;
  • (a)-[*3..5]->(b):表示路徑長度的最小值是3,最大值是5,起始節點是a,終止節點是b;
  • (a)-[*..5]->(b):表示路徑長度的最大值是5,起始節點是a,終止節點是b;
  • (a)-[*3..]->(b):表示路徑長度的最小值是3,起始節點是a,終止節點是b;
  • (a)-[*]->(b):表示不限制路徑長度,起始節點是a,終止節點是b;

5,路徑變量

路徑可以指定(assign)給一個變量,該變量是路徑變量,用於引用查詢路徑。

p = (a)-[*3..5]->(b)

6,示例

以下示例圖有6個節點,每個節點都有一個屬性name,節點之間存在關系,關系類型是KNOWS,如圖:

查詢模式是:查找跟Filipa有關系的人,路徑長度為1或2,查詢的結果是:"Dilshad"和"Anders"

MATCH (me)-[:KNOWS*1..2]-(remote_friend)
WHERE me.name = 'Filipa'
RETURN remote_friend.name

 

參考文檔:

Chapter 3. Cypher

3.3.16. MERGE

3.2.7. Patterns

原文地址:https://www.cnblogs.com/ljhdo/p/5516793.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM