Neo4jCypher查詢語言詳解_第1頁
Neo4jCypher查詢語言詳解_第2頁
Neo4jCypher查詢語言詳解_第3頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Neo4jCypher查詢語言詳解Cypher介紹“Cypher個描述性的圖形查詢語言,允許不必編寫圖形結(jié)構(gòu)的遍歷代碼對圖形存儲有表現(xiàn)力和效率的查詢。Cypher還在繼續(xù)發(fā)展和成熟,這也就意味著有可能會出現(xiàn)語法的變化。同時也意味著作為組件沒有經(jīng)歷嚴(yán)格的性能測試。Cypher設(shè)計的目的是一個人類查詢語言,適合于開發(fā)者和在數(shù)據(jù)庫上做點對點模式(ad-hoc)查詢的專業(yè)操作人員(我認(rèn)為這個很重要)。它的構(gòu)念是基于英語單詞和靈巧的圖解。Cyper通過一系列不同的方法和建立于確定的實踐為表達(dá)查詢而激發(fā)的。許多關(guān)鍵字如like和orderby是受SQL的啟發(fā)。模式匹配的表達(dá)式來自于SPARQLo正則表達(dá)式

2、匹配實現(xiàn)實用Scalaprogramminglanguage語言。Cypher是一個申明式的語言。對比命令式語言如Java和腳本語言如Gremlin和JRuby,它的焦點在于從圖中如何找回(whattoretrieve),而不是怎么去做。這使得在不對用戶公布的實現(xiàn)細(xì)節(jié)里關(guān)心的是怎么優(yōu)化查詢。這個查詢語言包含以下幾個明顯的部分:?START:在圖中的開始點,通過元素的ID或所以查找獲得。?MATCH:圖形的匹配模式,束縛于開始點。?WHERE:過濾條件。?RETURN:返回所需要的。在下例中看三個關(guān)鍵字示例圖片如下:如:這個有個查詢,通過遍歷圖找到索引里一個叫John的朋友的朋友(不是他的直接朋

3、友),返回John和找到的朋友的朋友。STARTjohn=node:node_auto_index(name='John')MATCHjohn-:friend->()-:friend->fofRETURNjohn,fof返回結(jié)果:下一步添加過濾:在下一個例子中,列出一組用戶的id并遍歷圖查找這些用戶接出friend關(guān)系線,返回有屬性name并且其值是以S開始的用戶。STARTuser=node(5,4,1,2,3)MATCHuser-:friend->follower二/S.*/RETURNuser,返回結(jié)果:操作符Cypher中的操作符有三個不同種類:數(shù)學(xué),

4、相等和關(guān)系。數(shù)學(xué)操作符有+,-,*,/和。當(dāng)然只有+對字符有作用。等于操作符有=,<>,<,>,<=,>=。因為Neo4j是一個模式少的圖形數(shù)據(jù)庫,Cypher有兩個特殊的操作符和!。有些是用在屬性上,有些事用于處理缺少值。對于一個不存在的屬性做比較會導(dǎo)致錯誤。為替代與其他什么做比較時總是檢查屬性是否存在,在缺失屬性時問號將使得比較總是返回true,感嘆號使得比較總是返回false。="foo"這個斷言在屬性缺失情況下將評估為true。!="foo”這個斷言在屬性缺失情況下將評估為false。警告:在同一個比較中混合使用兩個符號

5、將導(dǎo)致不可預(yù)料的結(jié)果。參數(shù)Cypher支持帶參數(shù)的查詢。這允許開發(fā)者不需要必須構(gòu)建一個string的查詢,并且使得Cypher的查詢計劃的緩存更容易。參數(shù)可以在where子句,start子句的索引key或索引值,索引查詢中作為節(jié)點/關(guān)系id的引用。以下是幾個在java中使用參數(shù)的示例:節(jié)點id參數(shù)Map<String,Object>params=newHashMap<String,Object>();("id",0);ExecutionResultresult=("startn=node(id)”,params);節(jié)點對象參數(shù)Map<

6、String,Object>params=newHashMap<String,Object>();("node”,andreasNode);ExecutionResultresult=("startn=node(node)",params);多節(jié)點id參數(shù)Map<String,Object>params=newHashMap<String,Object>();("id",(0,1,2);ExecutionResultresult=("startn=node(id)",params);

7、字符串參數(shù)Map<String,Object>params=newHashMap<String,Object>();("name","Johan");ExecutionResultresult=("startn=node(0,1,2)=namereturnn”,params);索引鍵值參數(shù)Map<String,Object>params=newHashMap<String,Object>();("key","name");("value"

8、,"Michaela");ExecutionResultresult=("startn=node:people(key=value)returnn",params);索引查詢參數(shù)Map<String,Object>params=newHashMap<String,Object>();("query”,"name:Andreas");ExecutionResultresult=("startn=node:people(query)returnn”,params);?SKIP與LIMIT*的數(shù)字

9、參數(shù)Map<String,Object>params=newHashMap<String,Object>();("s",1);(T,1);ExecutionResultresult=("startn=node(0,1,2)slimitl”,params);?正則表達(dá)式參數(shù)Map<String,Object>params=newHashMap<String,Object>();("regex",".*h.*");ExecutionResultresult=("start

10、n=node(0,1,2)=regex",params);標(biāo)識符當(dāng)你參考部分的模式時,需要通過命名完成。定義的不同的命名部分就被稱為標(biāo)識符。如下例中:STARTn=node(1)MATCHn->bRETURNb標(biāo)識符為n和bo標(biāo)識符可以是大寫或小些,可以包含下劃線。當(dāng)需要其他字符時可以使用符號。對于屬性名的規(guī)則也是一樣。注解可以在查詢語句中使用雙斜杠來添加注解。如:STARTn=node(1)RETURNb結(jié)果:定向關(guān)系和標(biāo)識符如果需要關(guān)系的標(biāo)識符,為了過濾關(guān)系的屬性或為了返回關(guān)系,可如下例使用標(biāo)識符。查詢:STARTn=node(3)MATCH(n)-r->()RETU

11、RNr所有從節(jié)點A接出的關(guān)系將被返回。結(jié)果:通過關(guān)系類型匹配當(dāng)已知關(guān)系類型并想通過關(guān)系類型匹配時,可以通過冒號詳細(xì)描述。查詢:STARTn=node(3)MATCH(n)-:BLOCKS->(x)RETURNx返回A接出關(guān)系類型為BLOCKS的節(jié)點。結(jié)果:通過關(guān)系類型匹配和使用標(biāo)識符如果既想獲得關(guān)系又要通過已知的關(guān)系類型,那就都添加上,如:查詢:STARTn=node(3)MATCH(n)-r:BLOCKS->()RETURNr所有從A接出的關(guān)系為BLOCKS的關(guān)系都被返回。結(jié)果:帶有特殊字符的關(guān)系類型有時候數(shù)據(jù)庫中有非字母字符類型,或有空格在內(nèi)時,使用單引號。查詢:STARTn=

12、node(3)MATCH(n)-r:TYPEWITHSPACEINIT->()RETURNr返回類型有空格的關(guān)系。結(jié)果:多重關(guān)系關(guān)系可以通過使用在()-()多個語句來表達(dá),或可以串在一起。如下:查詢:STARTa=node(3)MATCH(a)-:KNOWS->(b)-:KNOWS->(c)RETURNa,b,c路徑中的三個節(jié)點。結(jié)果:可變長度的關(guān)系可變數(shù)量的關(guān)系->節(jié)點可以使用-:TYPE*minHops.maxHops->。查詢:STARTa=node(3),x=node(2,4)MATCHa-:KNOWS*1.3->xRETURNa,x如果在1到3的關(guān)

13、系中存在路徑,將返回開始點和結(jié)束點。結(jié)果:在可變長度關(guān)系的關(guān)系標(biāo)識符當(dāng)連接兩個節(jié)點的長度是可變的不確定的時,可以使用一個關(guān)系標(biāo)識符遍歷所有關(guān)系查詢:STARTa=node(3),x=node(2,4)MATCHa-r:KNOWS*1.3->xRETURNr如果在1到3的關(guān)系中存在路徑,將返回開始點和結(jié)束點。結(jié)果:零長度路徑當(dāng)使用可變長度路徑,可能其路徑長度為0,這也就是說兩個標(biāo)識符指向的為同一個節(jié)點。如果兩點間的距離為0,可以確定這是同一個節(jié)點。查詢:STARTa=node(3)MATCHp1=a-:KNOWS*0.1->b,p2=b-:BLOCKS*0.1->cRETURN

14、a,b,c,length(p1),length(p2)這個查詢將返回四個路徑,其中有些路徑長度為0.結(jié)果:可選關(guān)系如果關(guān)系為可選的,可以使用問號表示。與SQL的外連接類似。如果關(guān)系存在,將被返回。如果不存在在其位置將以null代替。查詢:STARTa=node(2)MATCHa->xRETURNa,x返回一個節(jié)點和一個null,因為這個節(jié)點沒有關(guān)系。結(jié)果:可選類型和命名關(guān)系通過一個正常的關(guān)系,可以決定哪個標(biāo)識符可以進(jìn)入,那些關(guān)系類型是需要的。查詢:STARTa=node(3)MATCHa-r:LOVES->()RETURNa,r返回一個節(jié)點和一個null,因為這個節(jié)點沒有關(guān)系。結(jié)果

15、:可選元素的屬性返回可選元素上的屬性,null值將返回null。查詢:STARTa=node(2)MATCHa->xRETURNx,元素x在查詢中為null,所有其屬性name為null結(jié)果:復(fù)雜匹配在Cypher中,可喲通過更多復(fù)雜模式來匹配,像一個鉆石形狀模式。查詢:STARTa=node(3)MATCH(a)-:KNOWS->(b)-:KNOWS->(c),(a)-:BLOCKS-(d)-:KNOWS-(c)RETURNa,b,c,d路徑中的四個節(jié)點。結(jié)果:最短路徑使用shortestPath函數(shù)可以找出一條兩個節(jié)點間的最短路徑,如下。查詢:STARTd=node(1)

16、,e=node(2)MATCHp=shortestPath(d-*.15->e)RETURNp這意味著:找出兩點間的一條最短路徑,最大關(guān)系長度為15.圓括號內(nèi)是一個簡單的路徑連接,開始節(jié)點,連接關(guān)系和結(jié)束節(jié)點。關(guān)系的字符描述像關(guān)系類型,最大數(shù)和方向在尋找最短路徑中都將被用到。也可以標(biāo)識路徑為可選。結(jié)果:所有最但路徑找出兩節(jié)點節(jié)點所有的最短路徑。查詢:STARTd=node(1),e=node(2)MATCHp=allShortestPaths(d-*.15->e)RETURNp這將在節(jié)點d與e中找到兩條有方向的路徑。結(jié)果:命名路徑如果想在模式圖上的路徑進(jìn)行過濾或者返回此路徑,可以使

17、用命名路徑(namedpath)。查詢:STARTa=node(3)MATCHp=a->bRETURNp開始節(jié)點的兩個路徑。結(jié)果:在綁定關(guān)系上的匹配當(dāng)模式中包含一個綁定關(guān)系時,此關(guān)系模式?jīng)]有明確的方向,Cypher將嘗試著切換連接節(jié)點的邊匹配關(guān)系。查詢:STARTa=node(3),b=node(2)MATCHa-:KNOWS-x-:KNOWS-bRETURNx將返回兩個連接節(jié)點,一次為開始節(jié)點,一次為結(jié)束節(jié)點。結(jié)果:Where如果需要從查找的數(shù)據(jù)的圖中過濾,可以在查詢語句中添加where子句。圖:Boolean操作類型可以使用boolean操作符and和or或者也可以使用not()函數(shù)

18、。查詢:STARTn=node(3,1)WHERE<="Tobias")ornot="Tobias")RETURNn返回節(jié)點。結(jié)果:節(jié)點屆性上的過濾查詢:STARTn=node(3,1)<30RETURNn結(jié)果:正則表達(dá)式可以通過使用=/regexp/來匹配正在表達(dá)式。如下:查詢:STARTn=node(3,1)二/Tob.*/RETURNn返回名叫Tobias的節(jié)點。結(jié)果:轉(zhuǎn)義正則表達(dá)式如果在正則表達(dá)式中需要有斜杠時可以通過轉(zhuǎn)義實現(xiàn)。查詢:STARTn=node(3,1)=/SomeVthing/RETURNn沒有匹配的節(jié)點返回。結(jié)果:不分

19、大小些正則表達(dá)式在正則表達(dá)式前加上i,整個正則表達(dá)式將會忽略大小寫。查詢:STARTn=node(3,1)二/(i)ANDR.*/RETURNn屬性name為Andres的節(jié)點將返回結(jié)果:關(guān)系類型上的過濾可以match模式中通過添加具體的關(guān)系類型,但有時需要針對類型的更加高級的過濾??梢允褂妹鞔_的type屬性來對比,查詢對關(guān)系類型名作一個正則比較。查詢:STARTn=node(3)MATCH(n)-r->()WHEREtype(r)=/K.*/RETURNr關(guān)系整個以K開始的類型名都將返回。結(jié)果:屆性存在性查詢:STARTn=node(3,1)RETURNn結(jié)果:如果缺失屆性默認(rèn)為tru

20、e僅當(dāng)屬性存在時,比較一個圖的元素的此屬性,使用允許空屬性的語法。查詢:STARTn=node(3,1)='white'RETURNn所有節(jié)點即使沒有belt屬性的都將返回。此類比較返回為true。結(jié)果:如果缺失屆性默認(rèn)為false需要在缺失屬性時為false,即不想返回此屬性不存在的節(jié)點時。使用感嘆號。查詢:STARTn=node(3,1)!='white'RETURNn結(jié)果:空置null過濾有時候需要測試值或者標(biāo)識符是否為null。與sql類似使用isnull或not(isnullx)也能起作用。查詢:STARTa=node(1),b=node(3,2)MA

21、TCHa<-r-bWHERErisnullRETURNbTobias節(jié)點沒有鏈接上。結(jié)果:關(guān)系過濾為過濾兩點間基于關(guān)系的子圖,在match子句中使用限制部分??梢悦枋鰩Х较虻年P(guān)系和可能的類型這些都是有效的表達(dá):WHEREa-bWHEREa-bWHEREa:KNOWS-bWHEREa-:KNOWS-b查詢:STARTa=node(1),b=node(3,2)WHEREa<-bRETURNbTobias節(jié)點沒有鏈接結(jié)果:neo4j綜合1. 目錄返回節(jié)點返回關(guān)系返回屬性帶特殊字符的標(biāo)識符列的別名可選屬性特別的結(jié)果查詢中的返回部分,返回途中定義的感興趣的部分??梢詾楣?jié)點、關(guān)系或其上的屬性。

22、圖返回節(jié)點返回一個節(jié)點,在返回語句中列出即可。查詢:STARTn=node(2)RETURNn結(jié)果:返回關(guān)系查詢:STARTn=node(1)MATCH(n)-r:KNOWS->(c)RETURNr結(jié)果:返回屬性STARTn=node(1)結(jié)果:帶特殊字符的標(biāo)識符使用不在英語字符表中的字符,可以使用單引號。查詢:STARTThisisn'tacommonidentifier=node(1)RETURNThisisn'tacommonidentifier.<<!_>>'結(jié)果:列的別名可以給展示出來的列名起別名。查詢:STARTa=node(1

23、)返回節(jié)點的age屬性,但重命名列名。結(jié)果:可選屬性屬性在節(jié)點上可能存在也可能不存在,可以使用問號來標(biāo)識標(biāo)識符即可查詢:STARTn=node(1,2)如果存在age屬性,則返回,不存在則返回null。結(jié)果:特別的結(jié)果DISTINCT僅檢索特別的行,基于選擇輸出的列。MATCH(a)->(b)RETURNdistinctb返回name為B的節(jié)點,但僅為一次。結(jié)果:neo4j聚合函數(shù)目錄聚合Aggregation計數(shù)計算節(jié)點數(shù)分組計算關(guān)系類型計算實體數(shù)計算非空可以值數(shù)求和sum平均值avg最大值max最小值min聚類COLLECT相異DISTINCT聚合(Aggregation)為集合計算

24、數(shù)據(jù),Cypher提供聚類功能,與SQL的groupby類似。在return語句中發(fā)現(xiàn)的任何聚類函數(shù),所有沒有聚類函數(shù)的列將作為聚合key使用。圖:計數(shù)計數(shù)(count)使用來計算行數(shù)。Count有兩種使用方法。Count(*)計算匹配的行的行數(shù),count(<標(biāo)識符>)計算標(biāo)識符中非空值數(shù)。計算節(jié)點數(shù)計算鏈接到一個節(jié)點的節(jié)點數(shù),可以使用count(*)o查詢:STARTn=node(2)MATCH(n)->(x)RETURNn,count(*)返回開始節(jié)點和相關(guān)節(jié)點節(jié)點數(shù)。結(jié)果:分組計算關(guān)系類型計算分組了得關(guān)系類型,返回關(guān)系類型并使用count(*)計算查詢:STARTn=

25、node(2)MATCH(n)-r->()RETURNtype(r),count(*)返回關(guān)系類型和其分組數(shù)。結(jié)果:計算實體數(shù)相比使用count(*),可能計算標(biāo)識符更實在。查詢:STARTn=node(2)MATCH(n)->(x)RETURNcount(x)返回鏈接到開始節(jié)點上的節(jié)點數(shù)結(jié)果:計算非空可以值數(shù)STARTn=node(2,3,4,1)RETURNcount)結(jié)果:求和(sum)Sum集合簡單計算數(shù)值類型的值。Null值將自動去掉。如下:查詢:STARTn=node(2,3,4)RETURNsum計算所有節(jié)點屬性值之和。結(jié)果:平均值(avg)Avg計算數(shù)量列的平均值查

26、詢:STARTn=node(2,3,4)RETURNavg結(jié)果:最大值(max)Max查找數(shù)字列中的最大值。查詢:STARTn=node(2,3,4)RETURNmax結(jié)果:最小值(min)Min使用數(shù)字屬性作為輸入,并返回在列中最小的值。RETURNmin結(jié)果:聚類(COLLECT)Collect將所有值收集到一個集合list中。查詢:STARTn=node(2,3,4)RETURNcollect返回一個帶有所有屬性值的簡單列。結(jié)果:相異(DISTINCT)聚合函數(shù)中使用distinct來去掉值中重復(fù)的數(shù)據(jù)。查詢:STARTa=node(2)MATCHa->bRETURNcount結(jié)果

27、:neo4j高級篇1. 目錄排序Orderby通過節(jié)點屬性排序節(jié)點通過多節(jié)點屬性排序節(jié)點倒序排列節(jié)點空值排序Skip跳過前三個返回中間兩個Limit1.返回第一部分函數(shù)Functions判斷AllAnyNoneSingleScalar函數(shù)LengthTypeIdCoalesce11.Iterable函數(shù)NodesRelationshipsExtract排序(Orderby)輸出結(jié)果排序可以使用orderby子句。注意,不能使用節(jié)點或者關(guān)系排序,僅僅只針對其屬性有效。圖:通過節(jié)點屬性排序節(jié)點查詢:STARTn=node(3,1,2)RETURNn結(jié)果:通過多節(jié)點屬性排序節(jié)點在orderby子句中

28、可以通過多個屬性來排序每個標(biāo)識符。Cypher首先將通過第一個標(biāo)識符排序,如果第一個標(biāo)識符或?qū)傩韵嗟?,則在orderby中檢查下一個屬性,依次類推。查詢:STARTn=node(3,1,2)RETURNn,首先通過age排序,然后再通過name排序。結(jié)果:倒序排列節(jié)點可以在標(biāo)識符后添加desc或asc來進(jìn)行倒序排列或順序排列。查詢:STARTn=node(3,1,2)RETURNn結(jié)果:空值排序當(dāng)排列結(jié)果集時,在順序排列中null將永遠(yuǎn)放在最后,而在倒序排列中放最前面。查詢:STARTn=node(3,1,2),n結(jié)果:SkipSkip允許返回總結(jié)果集中的一個子集。此不保證排序,除非使用了or

29、derby子句。圖:跳過前三個返回結(jié)果中一個子集,從第三個結(jié)果開始,語法如下:查詢:STARTn=node(3,4,5,1,2)RETURNnSKIP3前三個節(jié)點將略過,最后兩個節(jié)點將被返回。結(jié)果:返回中間兩個查詢:STARTn=node(3,4,5,1,2)RETURNnSKIP1LIMIT2中間兩個節(jié)點將被返回。結(jié)果:LimitLimit允許返回結(jié)果集中的一個子集。圖:返回第一部分查詢:STARTn=node(3,4,5,1,2)RETURNnLIMIT3結(jié)果:函數(shù)(Functions)在Cypher中有一組函數(shù),可分為三類不同類型:判斷、標(biāo)量函數(shù)和聚類函數(shù)。圖:判斷判斷為boolean函

30、數(shù),對給出的輸入集合做判斷并返回true或者false。常用在where子句中過濾子集。All迭代測試集合中所有元素的判斷。語法:All(標(biāo)識符initerablewhere判斷)參數(shù):iterable:一個集合屬性,或者可迭代的元素,或一個迭代函數(shù)。標(biāo)識符:可用于判斷比較的標(biāo)識符。判斷:一個測試所有迭代器中元素的判斷。查詢:STARTa=node(3),b=node(1)MATCHp=a-*1.3->bWHEREall(xinnodes(p)>30)RETURNp過濾包含age30的節(jié)點的路徑,返回符合條件路徑中所有節(jié)點。結(jié)果:Any語法:ANY(identifieriniter

31、ableWHEREpredicate)參數(shù):Iterable(迭代器):一個集合屬性,或者可迭代的元素,或一個迭代函數(shù)Identifier(標(biāo)識符):可用于判斷比較的標(biāo)識符。Predicate(判斷):一個測試所有迭代器中元素的判斷。查詢:STARTa=node(2)WHEREany="one")RETURNa結(jié)果:None在迭代器中沒有元素判斷將返回true。語法:NONE(identifieriniterableWHEREpredicate)Iterable(迭代器):一個集合屬性,或者可迭代的元素,或一個迭代函數(shù)Identifier(標(biāo)識符):可用于判斷比較的標(biāo)識符。

32、Predicate(判斷):一個測試所有迭代器中元素的判斷。查詢:STARTn=node(3)MATCHp=n-*1.3->bWHERENONE(xinnodes(p)=25)RETURNp結(jié)果:Single如果迭代器中僅有一個元素則返回true。語法:SINGLE(identifieriniterableWHEREpredicate)參數(shù):Iterable(迭代器):一個集合屬性,或者可迭代的元素,或一個迭代函數(shù)Identifier(標(biāo)識符):可用于判斷比較的標(biāo)識符。Predicate(判斷):一個測試所有迭代器中元素的判斷。查詢:STARTn=node(3)MATCHp=n->bWHERESINGLE(varinnodes(p)="blue")RETURNp結(jié)果:Scalar函數(shù)標(biāo)量函數(shù)返回單個值。Length使用詳細(xì)的length屬性,返回或過濾路徑

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論