###好好好#####Cypher 語句入門到上天

簡介>Cypher語言的關鍵字不區分大小寫,但是屬性值,標籤,關係類型和變量是區分大小寫的。在數據查詢中,節點一般用小括號(),關聯用中括號[]。

下載和安裝

Neo4j windows 桌面版- 環境設置
https://www.w3cschool.cn/neo4j/neo4j_exe_environment_setup.html
Neo4j - 解壓版環境設置
https://www.w3cschool.cn/neo4j/neo4j_zip_environment_setup.html

Cypher語言的關鍵字不區分大小寫,但是屬性值,標籤,關係類型和變量是區分大小寫的。
Neo4j中不存在表的概念,只有標籤(labels),節點(Node),關聯(Relation),路徑(path),標籤裏存的節點,節點和關聯可以簡單理解爲圖裏面的點和邊,路徑是用節點和關聯表示的如:(a)-[r]->(b),表示一條從節點a經關聯r到節點b的路徑。
在數據查詢中,節點一般用小括號(),關聯用中括號[]。

1.創建節點

創建Person 標籤,劉德華等若干節點,各自有name,birthday ,born,englishname等屬性


 
  1. match(a),(b) where a.uuid=5110 and b.uuid=12110 create (a)-[r:父親 {name:"父親",properties:{relationID:521,time:"1997-05-12"},relationID:521}]->(b)
  2. create (n:Person { name: '朱麗倩', birthday:'1966年4月6日',born: 1966 ,englishname:'Carol'}) ;
  3. create (n:Person { name: '劉向蕙', birthday:'2012年5月9日',born: 2012 ,englishname:'Hanna'}) ;
  4. create (n:Person { name: '任賢齊', birthday:'1966年6月23日',born: 1966 ,englishname:'Richie Jen'}) ;
  5. create (n:Person { name: '金城武', birthday:'1973年10月11日',born: 1973,englishname:'Takeshi Kaneshiro'}) ;
  6. create (n:Person { name: '林志玲', birthday:'1974年11月29日',born: 1974,englishname:'zhilin'}) ;
  7. 創建Movie 標籤,彩雲曲等若干節點,各自有title,released 等屬性
  8. create (n:Movie { title: '彩雲曲',released: 1981})
  9. create (n:Movie { title: '神鵰俠侶',released: 1983})
  10. create (n:Movie { title: '暗戰',released: 2000})
  11. create (n:Movie { title: '拆彈專家',released: 2017})

2.查詢節點

2.1 查詢整個圖形數據庫:

點擊節點,查看節點的屬性,如圖,Neo4j自動爲節點設置ID值
match(n) return n;

2.2 查詢具有指定標籤的節點

查詢Movie標籤下的節點
match(n:Movie) return n;

2.3 where 謂詞查詢

查詢名稱爲林志玲的節點
match (n:Person) where n.name='林志玲' return n

(查詢具有指定屬性的節點)結果相同
match(n{name:'林志玲'}) return n;

查詢born屬性小於1967的節點
match(n) where n.born<1967 return n;

3.創建關係

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

3.1 創建沒有任何屬性的關係


 
  1. MATCH (a:Person),(b:Movie)
  2. WHERE a.name = '劉德華' AND b.title = '暗戰'
  3. CREATE (a)-[r:DIRECTED]->(b)
  4. RETURN r;

3.2 創建關係,並設置關係的屬性


 
  1. MATCH (a:Person),(b:Movie)
  2. WHERE a.name = '劉德華' AND b.title = '神鵰俠侶'
  3. CREATE (a)-[r:出演 { roles:['楊過'] }]->(b)
  4. RETURN r;

3.3 創建雙向關係

劉德華的女是劉向蕙,劉向蕙的父親是劉德華


 
  1. MATCH (a:Person),(c:Person)
  2. WHERE a.name = '劉德華' AND c.name = '劉向蕙'
  3. CREATE (a)-[r:父親 { nickname:'甜心' }]->(c),
  4. (c)-[d:女兒 { nickname:'爹地' }]->(a)
  5. RETURN r;


關係建錯了 刪除關係 (見5.2 )
重新創建


 
  1. MATCH (a:Person),(c:Person)
  2. WHERE a.name = '劉德華' AND c.name = '劉向蕙'
  3. CREATE (a)-[d:女兒 { nickname:'甜心' }]->(c),
  4. (c)-[r:父親 { nickname:'爹地' }]->(a)
  5. RETURN r;


 
  1. MATCH (a:Person),(c:Movie)
  2. WHERE a.name = '劉德華' AND c.title = '彩雲曲'
  3. CREATE (a)-[r:出演 { partner:'張國榮' }]->(c),
  4. (c)-[d:演員 { rolename:'阿華哥' }]->(a)
  5. RETURN r;
  6. MATCH (a:Person),(c:Movie)
  7. WHERE a.name = '劉德華' AND c.title = '拆彈專家'
  8. CREATE (a)-[r:出演 { partner:'趙薇,高圓圓' }]->(c),
  9. (c)-[d:演員 { rolename:'華仔' }]->(a)
  10. RETURN r;
  11. MATCH (a:Person),(c:Movie)
  12. WHERE a.name = '劉德華' AND c.title = '神鵰俠侶'
  13. CREATE (a)-[r:出演 { partner:'劉亦菲' }]->(c),
  14. (c)-[d:演員 { rolename:'楊過' }]->(a)
  15. RETURN r;


 
  1. 繼續新增關係 劉德華和林志玲,金城武,任賢齊
  2. MATCH (a:Person),(c:Person)
  3. WHERE a.name = '劉德華' AND c.name = '任賢齊'
  4. CREATE (a)-[d:朋友 { sex:'男' }]->(c)
  5. RETURN d;
  6.  
  7. MATCH (a:Person),(c:Person)
  8. WHERE a.name = '劉德華' AND c.name = '金城武'
  9. CREATE (a)-[d:朋友 { sex:'男' }]->(c)
  10. RETURN d;
  11. 這裏沒有給關係設置屬性sex
  12. MATCH (a:Person),(c:Person)
  13. WHERE a.name = '劉德華' AND c.name = '林志玲'
  14. CREATE (a)-[d:朋友]->(c)
  15. RETURN d;
  16.  
  17. 查詢Person表關係
  18. MATCH (n:Person) RETURN n

4 查詢關係

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

4.1 查詢整個數據圖形

match(n) return n;

4.2 查詢跟指定節點有關係的節點

查詢跟Movie標籤有關係的所有節點

4.3,查詢有向關係的節點

查詢和劉德華有關係的電影
MATCH (:Person { name: '劉德華' })-->(movie)RETURN movie;

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


 
  1. MATCH (:Person { name: '劉德華' })-[r]->(movie) RETURN r,type(r);

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

MATCH (:Person { name: '劉德華' })-[r:出演{partner:'張國榮'}]->(Movie) RETURN r,type(r);


查詢和劉德華和張國榮合作過的電影
MATCH (:Person { name: '劉德華' })-[r:出演{partner:'張國榮'}]->(m:Movie) RETURN m;


查詢被劉德華稱呼爲甜心的女兒
MATCH (:Person { name: '劉德華' })-[r:女兒{nickname:'甜心'}]->(m:Person) return m
查詢劉德華的老婆是誰
Match (n:Person{name: '劉德華'})-[:wife]->(a:Person) return a


劉德華出演過的電影

5 刪除

5.1刪除節點


 
  1. create (n:City { name: '北京'})
  2. Match (n:City{name:'北京'}) delete n

5.2 刪除關係


 
  1. Match (a:Person{name:'劉德華'})-[r:父親]->(b:Person{name:'劉向蕙'}) delete r
  2. Match (a:Person{name:'劉向蕙'})-[r:女兒]->(b:Person{name:'劉德華'}) delete r

5.3 強制刪除節點和關係


 
  1. Match (n:`美國軍事基地`) where n.name ='掛載' detach delete n

6 常用查詢關鍵詞

6.1 count

查詢Person 一共有多少人
Match (n:Person ) return count(n)


查詢標籤(Person)中born=1966的一共有多少節點(人):
三種寫法(第三種不能用似乎):
1. Match (n:Person) where n.born=1966 return count(n)

  1. Match (n:Person{born:1966}) return count(n)//特別注意類型,如果存的類似是數字類型,使用字符串就查不出來,如下:

6.2 Limit

Match (n:Person) return n limit 3

6.3 Distinct

Match (n:Person) return distinct(n.born)

6.4 Order by


 
  1. Match(n:Person) return n order by n.born (默認升序)
  2. Match(n:Person) return n order by n.born asc (升序)
  3. Match(n:Person) return n order by n.born desc (降序)

6.5 根據id查找

match (n) where id(n)=548 return n

6.6 In的用法


 
  1. Match (n) where ID(n) IN[353,145,547] return n
  2. Match (n) where ID(n) IN[145,175,353,547,548] return n

6.7 Exists

節點存在 name這個屬性的記錄:
Match (n) where exists(n.title) return n

6.8 With

查詢name以‘劉’開頭的節點:
Match (n) where n.name starts with '劉' return n

6.9 Contains

查詢title中含有 ‘俠侶’的節點
Match (n:Movie) where n.title Contains '俠侶' return n

6.10 Union all (Union)

求並集,不去重(去重用Union, as 取別名):


 
  1. Match(n:Person) where n.born=1966 return n.name as name
  2. Union all
  3. Match(n:Movie) where n.released=1983 return n.title as name

7. 更新

7.1 創建一個完整的Path


 
  1. CREATE p =(m:Person{ name:'劉亦菲',title:"演員" })-[:簽約]->(neo)<-[:簽約]-(n:Person { name: '趙薇',title:"投資人" })
  2. RETURN p

7.2 爲節點增加一個屬性

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


 
  1. match (n)
  2. where id(n)=358
  3. set n.name = '華誼兄弟'
  4. return n;

爲節點移除屬性
MATCH (n:農業) where id(n)=17816137 remove n.sortcode,n.targettable,n.unit,n.uuid

7.3 爲節點增加標籤


 
  1. match (n)
  2. where id(n)=358
  3. set n:公司
  4. return n;

7.4 爲關係增加屬性


 
  1. match (n)-[r]->(m)
  2. where id(n)=357 and id(m)=358
  3. set r.經紀人='程晨'
  4. return n;


此時圖譜效果成


接着讓劉德華也和華誼兄弟簽約


 
  1. MATCH (a:Person),(c:公司)
  2. WHERE a.name = '劉德華' AND c.name = '華誼兄弟'
  3. CREATE (a)-[d:簽約 { 經紀人:'劉得得' }]->(c)
  4. RETURN d;

7.5 MERGE

Merge子句的作用有兩個:當模式(Pattern)存在時,匹配該模式;當模式不存在時,創建新的模式,功能是match子句和create的組合。在merge子句之後,可以顯式指定on creae和on match子句,用於修改綁定的節點或關係的屬性。
通過merge子句,你可以指定圖形中必須存在一個節點,該節點必須具有特定的標籤,屬性等,如果不存在,那麼merge子句將創建相應的節點。
通過merge子句匹配搜索模式
匹配模式是:一個節點有Person標籤,並且具有name屬性;如果數據庫不存在該模式,那麼創建新的節點;如果存在該模式,那麼綁定該節點;


 
  1. MERGE (m:Person { name: '邁克爾·傑克遜' }) RETURN m;


在merge子句中指定on create子句
如果需要創建節點,那麼執行on create子句,修改節點的屬性;


 
  1. MERGE (m:Person { name: '傑森·斯坦森' })
  2. ON CREATE SET m.registertime = timestamp()
  3. RETURN m.name, m.registertime


在merge子句中指定on match子句
如果節點已經存在於數據庫中,那麼執行on match子句,修改節點的屬性;節點屬性不存在則新增


 
  1. MERGE (m:Person)
  2. ON MATCH SET m.registertime = timestamp()
  3. RETURN m.name, m.registertime


在merge子句中同時指定on create 和 on match子句(沒有對應屬性則修改不成功,不會新增屬性)


 
  1. MERGE (m:Person{ name: '李連杰' })
  2. ON CREATE SET m.registertime = timestamp()
  3. ON MATCH SET m.offtime = timestamp()
  4. RETURN m.name, m.registertime,m.offtime


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


 
  1. MATCH (m:Person { name: '劉德華' }),(n:Movie { title: '神鵰俠侶' })
  2. MERGE (m)-[r:導演]->(n)
  3. RETURN m.name, type(r), n.title


merge子句用於match或create多個關係
趙薇既是神鵰俠侶的導演,也是神鵰俠侶的演員


 
  1. MATCH (m:Person { name: '趙薇' }),(n:Movie { title: '神鵰俠侶' })
  2. MERGE (m)-[r:導演]->(n)<-[r2:出演]-(m)
  3. RETURN m.name, type(r),type(r2), n.title


merge子句用於子查詢
先添加基礎數據
創建城市節點


 
  1. create (n:City { name: '北京',othername:'帝都'})
  2. create (n:City { name: '香港',othername:'HongKong'})
  3. create (n:City { name: '臺灣',othername:'灣灣'})

爲Person標籤的每個節點都增加一個屬性 bornin


 
  1. match (n:Person)
  2. set n.bornin = ''
  3. return n;


match (n)
where id(n)=175
set n.bornin = ‘香港’
return n;


 
  1. match (n)
  2. where n.name='金城武'
  3. set n.bornin = '臺灣'
  4. return n;


需求:查找劉德華和金城武的信息和所在地的othername(相當於mysql 連表查詢)


 
  1. MATCH (p:Person)
  2. where p.name='劉德華' or p.name='金城武'
  3. MERGE (c:City { name: p.bornin })
  4. RETURN p.name,p.born,p.bornin , c.othername;


創建劉德華出生地是香港這條關係


 
  1. MATCH (a:Person),(c:City)
  2. WHERE a.name = '劉德華' AND c.name = '香港'
  3. CREATE (a)-[r:出生地]->(c)
  4. RETURN r;


需求:給Person中每個節點都創建一個出生地的關係,沒有則返回null


 
  1. MATCH (p:Person)
  2. MERGE (c:City { name: p.bornin })
  3. MERGE (p)-[r:出生地]->(c)
  4. RETURN p.name, p.bornin, c.othername;


刪除這些關係


 
  1. Match (a:Person)-[r:出生地]->(c:City{name:''}) delete r
  2. Match (a:City)-[r:出生地]->(c:Person) delete r


查詢Person標籤中不存在name屬性的節點


 
  1. Match (n:Person) where not exists(n.name) return n
  2. Match (n:Person) where not exists(n.name) delete n


create (n:Prize { name: ‘金馬獎’});
create (n:Prize { name: ‘奧斯卡金獎’});
create (n:Prize { name: ‘金雞獎’});
create (n:Prize { name: ‘香港電影金像獎’});

7.6 跟實體相關的函數

通過id函數,返回節點或關係的ID
查詢Person標籤中和劉德華有關係的 id(節點和關係)

MATCH (:Person { name: '劉德華' })-[r]->(movie) RETURN id(r);

通過type函數,查詢關係的類型
查詢Person標籤中和劉德華相關的關係(以下三種結果相同)


 
  1. MATCH (:Person { name: '劉德華' })-[r]->(a)
  2. MATCH (:Person { name: '劉德華' })-[r]->(b)
  3. MATCH (:Person { name: '劉德華' })-[r]->()
  4. RETURN type(r);


通過lables函數,查詢節點的標籤
查詢和劉德華有關係的節點


 
  1. MATCH (:Person { name: '劉德華' })-[r]->(p) RETURN p;


查詢和劉德華有關係的標籤(去重)


 
  1. MATCH (:Person { name: '劉德華' })-[r]->(p)
  2. RETURN distinct(labels(p))


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


 
  1. MATCH (a)
  2. WHERE a.name = '劉德華'
  3. RETURN keys(a)


MATCH (:Person { name: '劉德華' })-[r]->(p) RETURN distinct(keys(r))


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


 
  1. MATCH (a)
  2. WHERE a.name = '劉德華'
  3. RETURN properties(a)


MATCH (:Person { name: '劉德華' })-[r]->(p) RETURN properties(r)

8.跟索引相關的函數

8.1創建索引

創建單一屬性索引


 
  1. CREATE INDEX ON :Lable(property)
  2. Query:
  3. CREATE INDEX ON :Person(name)
  4. 給數據庫的:Person標籤的name屬性創建索引
  5. Result:
  6. No data returned, and nothing was changed
  7. 創建複合屬性索引
  8. CREATE INDEX ON :Label(prop1,...,propN)
  9. Query:
  10. CREATE INDEX ON :Person(age,country)
  11. Result:
  12. No data returned.
  13. Indexes added:1

8.2查詢索引

CALL db.Indexes

8.3刪除索引


 
  1. DROP INDEX ON :LABEL(property)
  2. Query:
  3. DROP INDEX ON :Person(firstname)
  4. Result:
  5. No data returned
  6. Indexes removed:1
  7.  
  8. DROP INDEX ON :LABEL(prop1,...,propN)
  9. Query:
  10. DROP INDEX ON :Person(age,country)
  11. Result:
  12. No data returned
  13. Indexes removed:1

8.4 備份與導入

備份/導出
要以管理員身份運行
neo4j-admin dump --database=graph.db --to=E:\neo4jdata


導入
neo4j-admin load --from=E:\neo4jdata\graph.db.dump --database=graph.db --force

導入csv


 
  1. USING PERIODIC COMMIT 500 LOAD CSV FROM "file:///D:\\test.csv" AS line MERGE (:`頂頂頂` {name:line[0]})
  2. LOAD CSV WITH HEADERS FROM "file:///C:\\Program Files\\Java\\neo4j-community-3.4.7\\import\\stock_concept.csv"
  3. AS line
  4. return line.n


USING PERIODIC COMMIT 10
LOAD CSV FROM “file:///node.csv” AS line
create (a:Node{name:line[0]})


USING PERIODIC COMMIT
LOAD CSV FROM ‘file:///concept.csv’ AS row
CREATE (n:概念{name:row[1],uuid:row[0]})

csv 不帶header方式
USING PERIODIC COMMIT
LOAD CSV FROM “file:///executive_stock.csv” AS row
MATCH (n:高管 {uuid: row[0]})
MATCH (m:企業 {uuid: row[1]})
MERGE (n)-[:RE{name:row[2]}]->(m)

帶header方式
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM ‘file:///industry.csv’ AS row
CREATE (:行業{name:row.name,uuid:row.uuid})

關於neo4j查詢多深度關係節點

1.使用with關鍵字


 
  1. 查詢三層級關係節點如下:with可以將前面查詢結果作爲後面查詢條件
  2. match (na:company)-[re]->(nb:company) where na.id = '12399145' WITH na,re,nb match (nb:company)-[re2]->(nc:company) return na,re,nb,re2,nc

2.直接拼接關係節點查詢

match (na:company{id:'12399145'})-[re]->(nb:company)-[re2]->(nc:company) return na,re,nb,re2,nc

3.爲了方便,可以將查詢結果賦給變量,然後返回

match data=(na:company{id:'12399145'})-[re]->(nb:company)-[re2]->(nc:company) return data

4.使用深度運算符

當實現多深度關係節點查詢時,顯然使用以上方式比較繁瑣。
可變數量的關係->節點可以使用-[:TYPEminHops..maxHops]->。
查詢:
如果在1到3的關係中存在路徑,將返回開始點和結束點。
`match data=(na:company{id:’12399145’})-[
1..3]->(nb:company) return data`

使用APOC庫

https://neo4j-contrib.github.io/neo4j-apoc-procedures/
導入導出的幾種方式
https://neo4j-contrib.github.io/neo4j-apoc-procedures/#export-import

合併重複節點

安裝apoc

過程如下
https://blog.csdn.net/graphway/article/details/78957415
安裝完成 執行 return apoc.version() 查看下版本

MATCH (n:國家電網)
WITH n.name AS name, COLLECT(n) AS nodelist, COUNT(*) AS count
WHERE count > 1
CALL apoc.refactor.mergeNodes(nodelist) YIELD node
RETURN node

查詢某個節點有關係的3級及以內的路徑
MATCH (n:貴州) WHERE n.name=’交通事件’
CALL apoc.path.spanningTree(n, {maxLevel:3}) YIELD path
RETURN path;

複製領域


 
  1. match(n:菊花) MERGE (:大薩達{name:n.name})
  2. match(n:菊花)-[r]->(q:菊花)
  3. with n, r, q
  4. match (o:大薩達{name:n.name}), (m:大薩達{name:q.name})
  5. MERGE (o)-[:RE{name:r.name}]->(m)

keys函數


 
  1. match(n) where any(x in keys(n) where n[x] > 0) return n 查詢某個屬性大於0 的節點
  2. match(n) where all(x.uuid in keys(n) where n[x.uuid] > 0) return n 查詢所有屬性大於0的節點

例如:x在any中是一個變量,並不是屬性
match(n) where any(uuid in keys(n) where n[uuid] > 0) return n uuid大於0
match(n) where all(uuid in keys(n) where n[uuid] > 0) return n 所有uuid都大於0
match(n) where any(querytype in keys(n) where n[querytype] = 0) return n

修改密碼:

進入neo4j提供的可視化界面broswer 輸入: :server change-password
鍵入原密碼及新密碼,即可修改

關於Neo4j和Cypher批量更新和批量插入優化的5個建議

https://blog.csdn.net/hwz2311245/article/details/60963383

Neo4j之Cypher學習總結

https://www.jianshu.com/p/2bb98c81d8ee

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章