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

下載本文檔

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

文檔簡介

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

2、式匹配實現(xiàn)實用Scalaprogramminglanguage語言。Cypher是一個申明式的語言。對比命令式語言如Java和腳本語言如Gremlin和JRuby,它的焦點在于從圖中如何找回(whattoretrieve),而不是怎么去做。這使得在不對用戶公布的實現(xiàn)細節(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ù)學,相等和關(guān)系。數(shù)學操作符有+,-,*,/和%。當然只

4、有+對字符有作用。等于操作符有=,=。因為Neo4j是一個模式少的圖形數(shù)據(jù)庫,Cypher有兩個特殊的操作符和!。有些是用在屬性上,有些事用于處理缺少值。對于一個不存在的屬性做比較會導致錯誤。為替代與其他什么做比較時總是檢查屬性是否存在,在缺失屬性時問號將使得比較總是返回true,感嘆號使得比較總是返回false。=foo這個斷言在屬性缺失情況下將評估為true。!=foo這個斷言在屬性缺失情況下將評估為false。警告:在同一個比較中混合使用兩個符號將導致不可預(yù)料的結(jié)果。Cypher支持帶參數(shù)的查詢。這允許開發(fā)者不需要必須構(gòu)建一個string的查詢,并且使得Cypher的查詢計劃的緩存更容易

5、。參數(shù)可以在where子句,start子句的索引key或索引值,索引查詢中作為節(jié)點/關(guān)系id的引用。以下是幾個在java中使用參數(shù)的示例:節(jié)點id參Mapparams=newHashMap();(id,0);ExecutionResultresult=(startn=node(id),params);節(jié)點對象參Mapparams=newHashMap();(node,andreasNode);ExecutionResultresult=(startn=node(node),params);多節(jié)點id參Mapparams=newHashMap();(id,(0,1,2);ExecutionRes

6、ultresult=(startn=node(id),params);字符串參Mapparams=newHashMap();(name,Johan);ExecutionResultresult=(startn=node(0,1,2)=namereturnn,params);索引鍵值參Mapparams=newHashMap();(key,name);(value,Michaela);ExecutionResultresult=(startn=node:people(key=value)returnn,params);Mapparams=newHashMap();(query,name:Andr

7、eas);ExecutionResultresult=(startn=node:people(query)returnn,params);SKIP與LIMIT*的數(shù)字參數(shù)Mapparams=newHashMap();(s,1);(l,1);ExecutionResultresult=(startn=node(0,1,2)slimitl,params);正則表達式參數(shù)Mapparams=newHashMap();(regex,.*h.*);ExecutionResultresult=(startn=node(0,1,2)=regex,params);標識符當你參考部分的模式時,需要通過命名完成。

8、定義的不同的命名部分就被稱為標識符。如下例中:STARTn=node(1)MATCHn-bRETURNb標識符為n和b。標識符可以是大寫或小些,可以包含下劃線。當需要其他字符時可以使用符號。對于屬性名的規(guī)則也是一樣。注解可以在查詢語句中使用雙斜杠來添加注解。如:STARTn=node(1)RETURNb結(jié)果:定向關(guān)系和標識符如果需要關(guān)系的標識符,為了過濾關(guān)系的屬性或為了返回關(guān)系,可如下例使用標識符。查詢:STARTn=node(3)MATCH(n)-r-()RETURNr所有從節(jié)點A接出的關(guān)系將被返回。結(jié)果:通過關(guān)系類型匹配當已知關(guān)系類型并想通過關(guān)系類型匹配時,可以通過冒號詳細描述。查詢:ST

9、ARTn=node(3)MATCH(n)-:BLOCKS-(x)RETURNx返回A接出關(guān)系類型為BLOCKS的節(jié)點。結(jié)果:通過關(guān)系類型匹配和使用標識符如果既想獲得關(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=node(3)MATCH(n)-r:TYPEWITHSPACEINIT-()RETURNr返回類型有空格的關(guān)系。結(jié)果:多重關(guān)系關(guān)系可以通過使用在(

10、)()多個語句來表達,或可以串在一起。如下:查詢: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)系中存在路徑,將返回開始點和結(jié)束點。結(jié)果:在可變長度關(guān)系的關(guān)系標識符當連接兩個節(jié)點的長度是可變的不確定的時,可以使用一個關(guān)系標識符遍歷所有關(guān)系查詢:STARTa=node(3),x=node(2,

11、4)MATCHa-r:KNOWS*1.3-xRETURNr如果在1到3的關(guān)系中存在路徑,將返回開始點和結(jié)束點。結(jié)果:零長度路徑當使用可變長度路徑,可能其路徑長度為0,這也就是說兩個標識符指向的為同一個節(jié)點。如果兩點間的距離為0,可以確定這是同一個節(jié)點。查詢:STARTa=node(3)MATCHp1=a-:KNOWS*0.1-b,p2=b-:BLOCKS*0.1-cRETURNa,b,c,length(p1),length(p2)這個查詢將返回四個路徑,其中有些路徑長度為0.結(jié)果:可選關(guān)系如果關(guān)系為可選的,可以使用問號表示。與SQL的外連接類似。如果關(guān)系存在,將被返回。如果不存在在其位置將以n

12、ull代替。查詢:STARTa=node(2)MATCHa-xRETURNa,x返回一個節(jié)點和一個null,因為這個節(jié)點沒有關(guān)系。結(jié)果:可選類型和命名關(guān)系通過一個正常的關(guān)系,可以決定哪個標識符可以進入,那些關(guān)系類型是需要的。查詢:STARTa=node(3)MATCHa-r:LOVES-()RETURNa,r返回一個節(jié)點和一個null,因為這個節(jié)點沒有關(guān)系。結(jié)果:可選元素的屬性返回可選元素上的屬性,null值將返回null。查詢:STARTa=node(2)MATCHa-xRETURNx,元素x在查詢中為null,所有其屬性name為null。結(jié)果:復雜匹配在Cypher中,可喲通過更多復雜模

13、式來匹配,像一個鉆石形狀模式。查詢: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),e=node(2)MATCHp=shortestPath(d-*.15-e)RETURNp這意味著:找出兩點間的一條最短路徑,最大關(guān)系長度為15.圓括號內(nèi)是一個簡單的路徑連接,開始節(jié)點,連接關(guān)系和結(jié)束節(jié)點。關(guān)系的字符描述像關(guān)系類型,最大數(shù)和方向在尋找最短路

14、徑中都將被用到也可以標識路徑為可選。結(jié)果:所有最但路徑找出兩節(jié)點節(jié)點所有的最短路徑。查詢:STARTd=node(1),e=node(2)MATCHp=allShortestPaths(d-*.15-e)RETURNp這將在節(jié)點d與e中找到兩條有方向的路徑。結(jié)果:命名路徑如果想在模式圖上的路徑進行過濾或者返回此路徑,可以使用命名路徑(namedpath)。查詢:STARTa=node(3)MATCHp=a-bRETURNp開始節(jié)點的兩個路徑。結(jié)果:結(jié)果:在綁定關(guān)系上的匹配當模式中包含一個綁定關(guān)系時,此關(guān)系模式?jīng)]有明確的方向,Cypher將嘗試著切換連接節(jié)點的邊匹配關(guān)系。查詢:STARTa=no

15、de(3),b=node(2)MATCHa-:KNOWS-x-:KNOWS-bRETURNx將返回兩個連接節(jié)點,一次為開始節(jié)點,一次為結(jié)束節(jié)點。結(jié)果:Where如果需要從查找的數(shù)據(jù)的圖中過濾,可以在查詢語句中添加where子句。圖:Boolean操作類型可以使用boolean操作符and和or或者也可以使用not()函數(shù)。查詢:STARTn=node(3,1)WHERE=Tobias)ornot=Tobias)RETURNn返回節(jié)點。結(jié)果:節(jié)點屬性上的過濾查詢:STARTn=node(3,1)()WHEREtype(r)=/K.*/RETURNr關(guān)系整個以K開始的類型名都將返回。結(jié)果:屬性存在

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

17、=node(1),b=node(3,2)MATCHa-r-bWHERErisnullRETURNbTobias節(jié)點沒有鏈接上。結(jié)果:關(guān)系過濾為過濾兩點間基于關(guān)系的子圖,在match子句中使用限制部分??梢悦枋鰩Х较虻年P(guān)系和可能的類型。這些都是有效的表達:WHEREa-fbWHEREaj-bWHEREa:KNOWS-bWHEREa-:KNOWS-b查詢:STARTa=node(1),b=node(3,2)WHEREa(c)RETURNr結(jié)果:返回屬性查詢:STARTn=node(1)結(jié)果:帶特殊字符的標識符使用不在英語字符表中的字符,可以使用單引號。查詢:STARTThisisntacommon

18、identifier=node(1)RETURNThisisntacommonidentifier.vv!_結(jié)果:列的別名可以給展示出來的列名起別名。查詢:STARTa=node(1)返回節(jié)點的age屬性,但重命名列名。結(jié)果:可選屬性屬性在節(jié)點上可能存在也可能不存在,可以使用問號來標識標識符即可查詢:STARTn=node(1,2)如果存在age屬性,則返回,不存在則返回null。結(jié)果:特別的結(jié)果DISTINCT僅檢索特別的行,基于選擇輸出的列。查詢:STARTa=node(1)MATCH(a)-(b)RETURNdistinctb返回name為B的節(jié)點,但僅為一次結(jié)果:neo4j聚合函數(shù)目錄

19、聚合Aggregation計數(shù)計算節(jié)點數(shù)分組計算關(guān)系類型計算實體數(shù)計算非空可以值數(shù)求和sum平均值avg最大值max最小值min聚類COLLECT相異DISTINCT聚合(Aggregation)為集合計算數(shù)據(jù),Cypher提供聚類功能,與SQL的groupby類似。在return語句中發(fā)現(xiàn)的任何聚類函數(shù),所有沒有聚類函數(shù)的列將作為聚合key使用。圖:計數(shù)(count)使用來計算行數(shù)。Count有兩種使用方法。Count(*)計算匹配的行的行數(shù),count(標識符)計算標識符中非空值數(shù)。計算鏈接到一個節(jié)點的節(jié)點數(shù),可以使用count(*)。查詢:STARTn=node(2)MATCH(n)-(

20、x)RETURNn,count(*)返回開始節(jié)點和相關(guān)節(jié)點節(jié)點數(shù)。結(jié)果:分組計算關(guān)系類型計算分組了得關(guān)系類型,返回關(guān)系類型并使用count(*)計算。查詢:STARTn=node(2)MATCH(n)-r-()RETURNtype(r),count(*)返回關(guān)系類型和其分組數(shù)。結(jié)果:計算實體數(shù)相比使用count(*),可能計算標識符更實在查詢:STARTn=node(2)MATCH(n)-(x)RETURNcount(x)返回鏈接到開始節(jié)點上的節(jié)點數(shù)結(jié)果:計算非空可以值數(shù)查詢:(OAAE)EnsNMrLLwH(寸小7)upouhuhvvhs-削-soagasusM(Ums)號(umooNHnH

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

22、URNn結(jié)果:通過多節(jié)點屬性排序節(jié)點在orderby子句中可以通過多個屬性來排序每個標識符。Cypher首先將通過第一個標識符排序,如果第個標識符或?qū)傩韵嗟?,則在orderby中檢查下一個屬性,依次類推。查詢:STARTn=node(3,1,2)RETURNn首先通過age排序,然后再通過name排序。結(jié)果:倒序排列節(jié)點可以在標識符后添加desc或asc來進行倒序排列或丿I順序排列。查詢:STARTn=node(3,1,2)RETURNn結(jié)果:空值排序當排列結(jié)果集時,在丿I順序排列中null將永遠放在最后,而在倒序排列中放最前面。查詢:STARTn=node(3,1,2),n結(jié)果:SkipSk

23、ip允許返回總結(jié)果集中的一個子集。此不保證排序,除非使用了orderby子句。圖:跳過前三個返回結(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é)果:(Functions)在Cypher中有一組函數(shù),可分為三類不同類型:

24、判斷、標量函數(shù)和聚類函數(shù)。圖:判斷判斷為boolean函數(shù),對給出的輸入集合做判斷并返回true或者false。常用在where子句中過濾子集。All迭代測試集合中所有元素的判斷。在迭代器中沒有元素判斷將返回true。在迭代器中沒有元素判斷將返回true。語法:All(標識符initerablewhere判斷)參數(shù):iterable:個集合屬性,或者可迭代的元素,或一個迭代函數(shù)。標識符:可用于判斷比較的標識符。判斷:一個測試所有迭代器中元素的判斷。查詢:STARTa=node(3),b=node(1)MATCHp=a-*1.3-bWHEREall(xinnodes(p)30)RETURNp過濾

25、包含age30的節(jié)點的路徑,返回符合條件路徑中所有節(jié)點。結(jié)果:Any語法:ANY(identifieriniterableWHEREpredicate)參數(shù):Iterable(迭代器):一個集合屬性,或者可迭代的元素,或一個迭代函數(shù)。Identifier(標識符):可用于判斷比較的標識符。Predicate(判斷):一個測試所有迭代器中元素的判斷。查詢:STARTa=node(2)WHEREany=one)RETURNa結(jié)果:None語法:NONE(identifieriniterableWHEREpredicate)Iterable(迭代器):一個集合屬性,或者可迭代的元素,或一個迭代函數(shù)。

26、Identifier(標識符):可用于判斷比較的標識符。Predicate(判斷):一個測試所有迭代器中元素的判斷。查詢:STARTn=node(3)MATCHp=n-*1.3-bWHERENONE(xinnodes(p)=25)RETURNp結(jié)果:Single如果迭代器中僅有一個元素則返回true。語法:SINGLE(identifieriniterableWHEREpredicate)參數(shù):Iterable(迭代器):一個集合屬性,或者可迭代的元素,或一個迭代函數(shù)。Identifier(標識符):可用于判斷比較的標識符。Predicate(判斷):一個測試所有迭代器中元素的判斷。查詢:STARTn=node(3)MATCHp=n-bWHERESINGLE(varinnodes(p)=blue)RETURNp結(jié)果:Scalar函數(shù)標量函數(shù)返回單個值。標量函數(shù)返回單個值。Length使用詳細的length屬性,返回或過濾路徑的長度。語法:LENGTH(iterable)參數(shù):Iterable(迭代器):一個集合屬性,或者可迭代的元素,或一個迭代函數(shù)。查詢:STARTa=node(3)MATCHp=a-b-cRETURNlength(p)返回路徑的長度。結(jié)果:Type返回關(guān)系類型的字符串值。語法:TYPE(relat

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論