(二)Cypher语言常用方法举例
生活随笔
收集整理的這篇文章主要介紹了
(二)Cypher语言常用方法举例
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、概述
“Cypher”是一個(gè)描述性的類Sql的圖操作語言。相當(dāng)于關(guān)系數(shù)據(jù)庫的Sql,可見其重要性!其語法針對圖的特點(diǎn)而設(shè)計(jì),非常方便和靈活。沒有Join,是一大特點(diǎn)!學(xué)好Cypher是學(xué)好Neo4j的關(guān)鍵,也是核心所在!
2、Neo4j字段類型
Neo4j字段類型3、Neo4j基本操作
3.1 增(create)
CREATE (erzi:Person {id:‘erzi’}), //erzi是別名 (baba:Person {id:'baba'}), (yeye:Person {id:'yeye',name:'zhangsan'}), (nainai:Person {id:'nainai'}), (mama:Person {id:'mama'}), (bozi:Person {id:'bozi'}), (erzi)-[:fathor]->(baba), (baba)-[:fathor]->(yeye), (baba)-[:mother]->(nainai), (erzi)-[:mother]->(mama), (erzi)-[:girlFrend]->(bozi)說明: create (n:Person {id:'20140101',name:'王五',age:30,card:123456}) 相當(dāng)于關(guān)系Sql的: Create table Person(id varchar2,name varchar2,age number,card number ); Insert into Person values(‘20140101’,’王五’,30,123456);3.2 查(match)
Match查詢語法Match 相當(dāng)于selectMATCH (n:Person) RETURN n limit 25 等價(jià)于: Select * from Person limit 25問題1: 如何給已經(jīng)存在的人添加關(guān)系? Match (n:Person {id:'erzi'}),(f:Person {id:'bozi'}) Merge (n)-[:fuqi]->(f)問題2: 兒子和柏之結(jié)婚了,relation如何修改? Match (n:Person ),(f:Person) where n.id='erzi' and f.id='bozi' Merge (n)-[r:fuqi]->(f) # 更Neo4j的一種寫法 Match (n:Person{id:'erzi'}),(f:Person{id:'bozi'}) Merge (n)-[r:fuqi]->(f) 說明:merge用來創(chuàng)建關(guān)系,如果已經(jīng)存在,則可以作為查詢# 查詢和baba這個(gè)節(jié)點(diǎn)是fathor關(guān)系的其它節(jié)點(diǎn),并返回查看這兩個(gè)節(jié)點(diǎn) match (n:Person {id:'baba'})-[:fathor]-(f) return n,f # 查詢和baba這個(gè)節(jié)點(diǎn)的fathor,并返回查看這兩個(gè)節(jié)點(diǎn) match (n:Person {id:'baba'})-[:fathor]->(f) return n,f # 查詢和baba這個(gè)節(jié)點(diǎn)的fathor,只返回baba這個(gè)節(jié)點(diǎn)的fathor match (n:Person {id:'baba'})-[:fathor]-(f) return f3.3、改(set)
Cypher中無Update,用set代替# 更新屬性 Match (n:Person {id:'baba'}) set n.name='張三' return n# 屬性名是寫數(shù)據(jù)時(shí)自動(dòng)創(chuàng)建,無schme特性,這點(diǎn)同no-sql庫;支持非結(jié)構(gòu)化數(shù)據(jù);非結(jié)構(gòu)化:不同行的數(shù)據(jù)可以有不同的列個(gè)數(shù); Match (n:Person {id:'baba'}) set n.name='張三',n.age=50 return n說明:Cypher語言中,任意語法都可以有return3.4 刪(delete,remove)
DELETE和REMOVE主要區(qū)別 : ① DELETE操作用于刪除節(jié)點(diǎn)和relation(針對圖結(jié)構(gòu))。 ② REMOVE操作用于刪除標(biāo)簽label和屬性(針對關(guān)系型結(jié)構(gòu))。說明:Remove label 等同于drop table;兩個(gè)命令都應(yīng)該與MATCH命令一起使用。Match (n:Person {id:'baba'}) remove n.age return n MATCH (s:Teacher)-[r:teach]->(d:Student) delete r,s,d //刪除與該關(guān)系相關(guān)的老師和學(xué)生及l(fā)abel MATCH (n:Test) remove n:Test //刪除label # 如何僅僅刪除一個(gè)relation? Match (a:Person),(b:Person) where a.id='erzi' and b.id='bozi' merge (a)-[r:FUQI]->(b) DELETE r # 或者更Neo4j的寫為 Match (a:Person{id:'erzi'}),(b:Person{id:'bozi'}) merge (a)-[r:FUQI]->(b) DELETE r# 刪除所有記錄 MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r3.5 排序(order by)
# 同關(guān)系sql MATCH (n:Person) RETURN n order by n.id,n.name desc LIMIT 25# 正序 MATCH (n:Person) RETURN n order by n.id LIMIT 253.6 限制顯示(limit)
MATCH (n:Customer) RETURN n LIMIT 253.7 跳過前n條(skip)
MATCH (n:Person) RETURN n order by n.id desc skip 2 LIMIT 253.8 union和union all
# 同關(guān)系sql # Union:把多段Match的return結(jié)果 上線組合成一個(gè)結(jié)果集,會自動(dòng)去掉重復(fù)行; # Union all:作用同union,但不去重; MATCH (n:Person) where n.age>20 RETURN n.id,n.age union all MATCH (n:Person) where n.id='erzi' RETURN n.id,n.age3.9 Null
# Where 屬性 is null,其實(shí)同關(guān)系sql語法,就是把結(jié)果進(jìn)行“并” MATCH (n:Person) where n.age>20 RETURN n.id,n.age union all MATCH (n:Person) where n.id='erzi' and n.age is not null RETURN n.id,n.age3.10 in
# 中括號標(biāo)識某個(gè)字段的范圍 MATCH (n:Person) where n.age>20 RETURN n.id,n.age union all MATCH (n:Person) where n.id in ['erzi','bozi','baba'] RETURN n.id,n.age3.11 內(nèi)置id
每個(gè)節(jié)點(diǎn)或relation都有個(gè)系統(tǒng)分配的id,從0開始遞增,全局唯一! Create (a:Person {id:’123’}) //這里的ID是一個(gè)屬性,和內(nèi)置ID是兩碼事 通過函數(shù)id(node/relation) 可以獲取id值; 不透明,猶如Oracle里的rowid; 用戶可定義id屬性,與內(nèi)置id無關(guān);3.12?Relation 具有方向性
# Create節(jié)點(diǎn)之間關(guān)系時(shí),必須指定方向,否則會報(bào)錯(cuò) # 查詢時(shí)可以不指定方向,意思時(shí)哪個(gè)方向都可以 MATCH (n:Person)-[:FUQI]-(s:Person) RETURN distinct n,s3.13 索引(index)
# 建立索引后前后的復(fù)雜度分別時(shí)O(n),O(1) create index on :Person(id); drop index on :Person(id); 給哪些字段創(chuàng)建索引呢?根據(jù)查詢需要,把查詢多的字段建索引。 create index on :Person(name);1、不需要給索引起名稱,只需要設(shè)置索引字段即可; 2、通過該字段的查詢都走索引whereinsubstring 關(guān)系DB中:索引字段套一層函數(shù)的話,基本不走索引了。3.14?執(zhí)行計(jì)劃(explain)
# 用于跟蹤顯示查詢的過程 explain MATCH p=()-[r:ORDERS]->() RETURN p LIMIT 25 explain?
3.15?屬性唯一約束? CONSTRAINT
# 給屬性建立索引時(shí),同一個(gè)屬性值不能對應(yīng)兩條記錄,其實(shí)就是屬性的唯一性約束要求 # 通過CONSTRAINT可以給屬性設(shè)置、取消唯一性要求 CREATE CONSTRAINT ON (a:Person) ASSERT a.id IS UNIQUE Drop CONSTRAINT ON (a:Person) ASSERT a.id IS UNIQUE3.16 常用函數(shù)
# 即用即查 功能函數(shù) 描述 UPPER 它用于將所有字母更改為大寫字母。 LOWER 它用于將所有字母改為小寫字母。 SUBSTRING 它用于獲取給定String的子字符串。 REPLACE 它用于替換一個(gè)字符串的子字符串。 Match (n:Person) return SUBSTRING(n.id,2,0),n.id聚合函數(shù) 描述 COUNT 它返回由MATCH命令返回的行數(shù)。 MAX 它從MATCH命令返回的一組行返回最大值。 MIN 它返回由MATCH命令返回的一組行的最小值。 SUM 它返回由MATCH命令返回的所有行的求和值。 AVG 它返回由MATCH命令返回的所有行的平均值。# Neo4j無 group by,用以下方式執(zhí)行 Match (n:Person) return count(*) Match (n:Person) return avg(n.age) 只包含age不為空的node3.17?查詢最短路徑(shortestPath)
# 返回所有最短路徑 allShortestPaths # [*..n] 用于表示獲取n層關(guān)系,下面的意思時(shí)獲取奶奶和媽媽之間距離為<=3的最短路徑,兩個(gè)點(diǎn)相連 # 其距離是1,存在多個(gè)最短路徑時(shí),僅隨機(jī)返回1個(gè) match p=shortestPath((n:Person {id:'mama'})-[*..3]-(b:Person {id:'nainai'})) return p# 關(guān)系鏈路越短,代表這兩個(gè)節(jié)點(diǎn)的關(guān)系越密切!?
總結(jié)
以上是生活随笔為你收集整理的(二)Cypher语言常用方法举例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python123查找指定字符输入m_大
- 下一篇: Tensorflow2.0学习-加载和预