版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Neo4jCypher查询语言详解Cypher介绍“Cypher是一个描述性的图形查询语言允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询。Cypher还在继续发展和成熟,这也就意味着有可能会出现语法的变化。同时也意味着作为组件没有经历严格的性能测试。Cypher设计的目的是一个人类查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询的专业操作人员(我认为这个很重要)。它的构念是基于英语单词和灵巧的图解。Cyper通过一系列不同的方法和建立于确定的实践为表达查询而激发的。许多关键字如like和orderby是受SQL的启发。模式匹配的表达式来自于SPARQL。正则表达
2、式匹配实现实用Scalaprogramminglanguage语言。Cypher是一个申明式的语言。对比命令式语言如Java和脚本语言如Gremlin和JRuby,它的焦点在于从图中如何找回(whattoretrieve),而不是怎么去做。这使得在不对用户公布的实现细节里关心的是怎么优化查询。这个查询语言包含以下几个明显的部分:START:在图中的开始点,通过元素的ID或所以查找获得。MATCH:图形的匹配模式,束缚于开始点。WHERE:过滤条件。RETURN:返回所需要的。在下例中看三个关键字示例图片如下:如:这个有个查询,通过遍历图找到索引里一个叫John的朋友的朋友(不是他的直接朋友),
3、返回John和找到的朋友的朋友。STARTjohn=node:node_auto_index(name=John)MATCHjohn-:friend-()-:friend-fofRETURNjohn,fof返回结果:下一步添加过滤:在下一个例子中,列出一组用户的id并遍历图查找这些用户接出friend关系线,返回有属性name并且其值是以S开始的用户。STARTuser=node(5,4,1,2,3)MATCHuser-:friend-follower=/S.*/RETURNuser,返回结果:操作符Cypher中的操作符有三个不同种类:数学,相等和关系。数学操作符有+,-,*,/和%。当然只
4、有+对字符有作用。等于操作符有=,=。因为Neo4j是一个模式少的图形数据库,Cypher有两个特殊的操作符和!。有些是用在属性上,有些事用于处理缺少值。对于一个不存在的属性做比较会导致错误。为替代与其他什么做比较时总是检查属性是否存在,在缺失属性时问号将使得比较总是返回true,感叹号使得比较总是返回false。=foo这个断言在属性缺失情况下将评估为true。!=foo这个断言在属性缺失情况下将评估为false。警告:在同一个比较中混合使用两个符号将导致不可预料的结果。Cypher支持带参数的查询。这允许开发者不需要必须构建一个string的查询,并且使得Cypher的查询计划的缓存更容易
5、。参数可以在where子句,start子句的索引key或索引值,索引查询中作为节点/关系id的引用。以下是几个在java中使用参数的示例:节点id参Mapparams=newHashMap();(id,0);ExecutionResultresult=(startn=node(id),params);节点对象参Mapparams=newHashMap();(node,andreasNode);ExecutionResultresult=(startn=node(node),params);多节点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*的数字参数Mapparams=newHashMap();(s,1);(l,1);ExecutionResultresult=(startn=node(0,1,2)slimitl,params);正则表达式参数Mapparams=newHashMap();(regex,.*h.*);ExecutionResultresult=(startn=node(0,1,2)=regex,params);标识符当你参考部分的模式时,需要通过命名完成。
8、定义的不同的命名部分就被称为标识符。如下例中:STARTn=node(1)MATCHn-bRETURNb标识符为n和b。标识符可以是大写或小些,可以包含下划线。当需要其他字符时可以使用符号。对于属性名的规则也是一样。注解可以在查询语句中使用双斜杠来添加注解。如:STARTn=node(1)RETURNb结果:定向关系和标识符如果需要关系的标识符,为了过滤关系的属性或为了返回关系,可如下例使用标识符。查询:STARTn=node(3)MATCH(n)-r-()RETURNr所有从节点A接出的关系将被返回。结果:通过关系类型匹配当已知关系类型并想通过关系类型匹配时,可以通过冒号详细描述。查询:ST
9、ARTn=node(3)MATCH(n)-:BLOCKS-(x)RETURNx返回A接出关系类型为BLOCKS的节点。结果:通过关系类型匹配和使用标识符如果既想获得关系又要通过已知的关系类型,那就都添加上,如:查询:STARTn=node(3)MATCH(n)-r:BLOCKS-()RETURNr所有从A接出的关系为BLOCKS的关系都被返回。结果:带有特殊字符的关系类型有时候数据库中有非字母字符类型,或有空格在内时,使用单引号。查询:STARTn=node(3)MATCH(n)-r:TYPEWITHSPACEINIT-()RETURNr返回类型有空格的关系。结果:多重关系关系可以通过使用在(
10、)()多个语句来表达,或可以串在一起。如下:查询:STARTa=node(3)MATCH(a)-:KNOWS-(b)-:KNOWS-(c)RETURNa,b,c路径中的三个节点。结果:可变长度的关系可变数量的关系-节点可以使用-:TYPE*minHops.maxHops-。查询:STARTa=node(3),x=node(2,4)MATCHa-:KNOWS*1.3-xRETURNa,x如果在1到3的关系中存在路径,将返回开始点和结束点。结果:在可变长度关系的关系标识符当连接两个节点的长度是可变的不确定的时,可以使用一个关系标识符遍历所有关系查询:STARTa=node(3),x=node(2,
11、4)MATCHa-r:KNOWS*1.3-xRETURNr如果在1到3的关系中存在路径,将返回开始点和结束点。结果:零长度路径当使用可变长度路径,可能其路径长度为0,这也就是说两个标识符指向的为同一个节点。如果两点间的距离为0,可以确定这是同一个节点。查询:STARTa=node(3)MATCHp1=a-:KNOWS*0.1-b,p2=b-:BLOCKS*0.1-cRETURNa,b,c,length(p1),length(p2)这个查询将返回四个路径,其中有些路径长度为0.结果:可选关系如果关系为可选的,可以使用问号表示。与SQL的外连接类似。如果关系存在,将被返回。如果不存在在其位置将以n
12、ull代替。查询:STARTa=node(2)MATCHa-xRETURNa,x返回一个节点和一个null,因为这个节点没有关系。结果:可选类型和命名关系通过一个正常的关系,可以决定哪个标识符可以进入,那些关系类型是需要的。查询:STARTa=node(3)MATCHa-r:LOVES-()RETURNa,r返回一个节点和一个null,因为这个节点没有关系。结果:可选元素的属性返回可选元素上的属性,null值将返回null。查询:STARTa=node(2)MATCHa-xRETURNx,元素x在查询中为null,所有其属性name为null。结果:复杂匹配在Cypher中,可哟通过更多复杂模
13、式来匹配,像一个钻石形状模式。查询:STARTa=node(3)MATCH(a)-:KNOWS-(b)-:KNOWS-(c),(a)-:BLOCKS-(d)-:KNOWS-(c)RETURNa,b,c,d路径中的四个节点。结果:最短路径使用shortestPath函数可以找出一条两个节点间的最短路径,如下。查询:STARTd=node(1),e=node(2)MATCHp=shortestPath(d-*.15-e)RETURNp这意味着:找出两点间的一条最短路径,最大关系长度为15.圆括号内是一个简单的路径连接,开始节点,连接关系和结束节点。关系的字符描述像关系类型,最大数和方向在寻找最短路
14、径中都将被用到也可以标识路径为可选。结果:所有最但路径找出两节点节点所有的最短路径。查询:STARTd=node(1),e=node(2)MATCHp=allShortestPaths(d-*.15-e)RETURNp这将在节点d与e中找到两条有方向的路径。结果:命名路径如果想在模式图上的路径进行过滤或者返回此路径,可以使用命名路径(namedpath)。查询:STARTa=node(3)MATCHp=a-bRETURNp开始节点的两个路径。结果:结果:在绑定关系上的匹配当模式中包含一个绑定关系时,此关系模式没有明确的方向,Cypher将尝试着切换连接节点的边匹配关系。查询:STARTa=no
15、de(3),b=node(2)MATCHa-:KNOWS-x-:KNOWS-bRETURNx将返回两个连接节点,一次为开始节点,一次为结束节点。结果:Where如果需要从查找的数据的图中过滤,可以在查询语句中添加where子句。图:Boolean操作类型可以使用boolean操作符and和or或者也可以使用not()函数。查询:STARTn=node(3,1)WHERE=Tobias)ornot=Tobias)RETURNn返回节点。结果:节点属性上的过滤查询:STARTn=node(3,1)()WHEREtype(r)=/K.*/RETURNr关系整个以K开始的类型名都将返回。结果:属性存在
16、性查询:STARTn=node(3,1)RETURNn结果:如果缺失属性默认为true仅当属性存在时,比较一个图的元素的此属性,使用允许空属性的语法。查询:STARTn=node(3,1)=whiteRETURNn所有节点即使没有belt属性的都将返回。此类比较返回为true。结果:如果缺失属性默认为false需要在缺失属性时为false,即不想返回此属性不存在的节点时。使用感叹号。查询:STARTn=node(3,1)!=whiteRETURNn结果:空置null过滤有时候需要测试值或者标识符是否为null。与sql类似使用isnull或not(isnullx)也能起作用。查询:STARTa
17、=node(1),b=node(3,2)MATCHa-r-bWHERErisnullRETURNbTobias节点没有链接上。结果:关系过滤为过滤两点间基于关系的子图,在match子句中使用限制部分。可以描述带方向的关系和可能的类型。这些都是有效的表达:WHEREa-fbWHEREaj-bWHEREa:KNOWS-bWHEREa-:KNOWS-b查询:STARTa=node(1),b=node(3,2)WHEREa(c)RETURNr结果:返回属性查询:STARTn=node(1)结果:带特殊字符的标识符使用不在英语字符表中的字符,可以使用单引号。查询:STARTThisisntacommon
18、identifier=node(1)RETURNThisisntacommonidentifier.vv!_结果:列的别名可以给展示出来的列名起别名。查询:STARTa=node(1)返回节点的age属性,但重命名列名。结果:可选属性属性在节点上可能存在也可能不存在,可以使用问号来标识标识符即可查询:STARTn=node(1,2)如果存在age属性,则返回,不存在则返回null。结果:特别的结果DISTINCT仅检索特别的行,基于选择输出的列。查询:STARTa=node(1)MATCH(a)-(b)RETURNdistinctb返回name为B的节点,但仅为一次结果:neo4j聚合函数目录
19、聚合Aggregation计数计算节点数分组计算关系类型计算实体数计算非空可以值数求和sum平均值avg最大值max最小值min聚类COLLECT相异DISTINCT聚合(Aggregation)为集合计算数据,Cypher提供聚类功能,与SQL的groupby类似。在return语句中发现的任何聚类函数,所有没有聚类函数的列将作为聚合key使用。图:计数(count)使用来计算行数。Count有两种使用方法。Count(*)计算匹配的行的行数,count(标识符)计算标识符中非空值数。计算链接到一个节点的节点数,可以使用count(*)。查询:STARTn=node(2)MATCH(n)-(
20、x)RETURNn,count(*)返回开始节点和相关节点节点数。结果:分组计算关系类型计算分组了得关系类型,返回关系类型并使用count(*)计算。查询:STARTn=node(2)MATCH(n)-r-()RETURNtype(r),count(*)返回关系类型和其分组数。结果:计算实体数相比使用count(*),可能计算标识符更实在查询:STARTn=node(2)MATCH(n)-(x)RETURNcount(x)返回链接到开始节点上的节点数结果:计算非空可以值数查询:(OAAE)EnsNMrLLwH(寸小7)upouhuhvvhs-削-soagasusM(Ums)號(umooNHnH
21、BH(IbRETURNcount结果:neo4j高级篇目录排序Orderby通过节点属性排序节点通过多节点属性排序节点倒序排列节点空值排序Skip1.跳过前三个2.返回中间两个2.返回中间两个Limit1.返回第一部分函数Functions1.判断AllAnyNoneSingleScalar函数LengthTypeIdCoalesce11.Iterable函数NodesRelationshipsExtract排序(Orderby)输出结果排序可以使用orderby子句。注意,不能使用节点或者关系排序,仅仅只针对其属性有效。图:通过节点属性排序节点查询:STARTn=node(3,1,2)RET
22、URNn结果:通过多节点属性排序节点在orderby子句中可以通过多个属性来排序每个标识符。Cypher首先将通过第一个标识符排序,如果第个标识符或属性相等,则在orderby中检查下一个属性,依次类推。查询:STARTn=node(3,1,2)RETURNn首先通过age排序,然后再通过name排序。结果:倒序排列节点可以在标识符后添加desc或asc来进行倒序排列或丿I顺序排列。查询:STARTn=node(3,1,2)RETURNn结果:空值排序当排列结果集时,在丿I顺序排列中null将永远放在最后,而在倒序排列中放最前面。查询:STARTn=node(3,1,2),n结果:SkipSk
23、ip允许返回总结果集中的一个子集。此不保证排序,除非使用了orderby子句。图:跳过前三个返回结果中一个子集,从第三个结果开始,语法如下:查询:STARTn=node(3,4,5,1,2)RETURNnSKIP3前三个节点将略过,最后两个节点将被返回。结果:返回中间两个查询:STARTn=node(3,4,5,1,2)RETURNnSKIP1LIMIT2中间两个节点将被返回结果:LimitLimit允许返回结果集中的一个子集。图:返回第一部分查询:STARTn=node(3,4,5,1,2)RETURNnLIMIT3结果:(Functions)在Cypher中有一组函数,可分为三类不同类型:
24、判断、标量函数和聚类函数。图:判断判断为boolean函数,对给出的输入集合做判断并返回true或者false。常用在where子句中过滤子集。All迭代测试集合中所有元素的判断。在迭代器中没有元素判断将返回true。在迭代器中没有元素判断将返回true。语法:All(标识符initerablewhere判断)参数:iterable:个集合属性,或者可迭代的元素,或一个迭代函数。标识符:可用于判断比较的标识符。判断:一个测试所有迭代器中元素的判断。查询:STARTa=node(3),b=node(1)MATCHp=a-*1.3-bWHEREall(xinnodes(p)30)RETURNp过滤
25、包含age30的节点的路径,返回符合条件路径中所有节点。结果:Any语法:ANY(identifieriniterableWHEREpredicate)参数:Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。Identifier(标识符):可用于判断比较的标识符。Predicate(判断):一个测试所有迭代器中元素的判断。查询:STARTa=node(2)WHEREany=one)RETURNa结果:None语法:NONE(identifieriniterableWHEREpredicate)Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。
26、Identifier(标识符):可用于判断比较的标识符。Predicate(判断):一个测试所有迭代器中元素的判断。查询:STARTn=node(3)MATCHp=n-*1.3-bWHERENONE(xinnodes(p)=25)RETURNp结果:Single如果迭代器中仅有一个元素则返回true。语法:SINGLE(identifieriniterableWHEREpredicate)参数:Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。Identifier(标识符):可用于判断比较的标识符。Predicate(判断):一个测试所有迭代器中元素的判断。查询:STARTn=node(3)MATCHp=n-bWHERESINGLE(varinnodes(p)=blue)RETURNp结果:Scalar函数标量函数返回单个值。标量函数返回单个值。Length使用详细的length属性,返回或过滤路径的长度。语法:LENGTH(iterable)参数:Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。查询:STARTa=node(3)MATCHp=a-b-cRETURNlength(p)返回路径的长度。结果:Type返回关系类型的字符串值。语法:TYPE(relat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 连云港职业技术学院《体育-台球》2023-2024学年第一学期期末试卷
- 江西现代职业技术学院《音乐选配与编辑》2023-2024学年第一学期期末试卷
- 江苏大学《水资源系统分析》2023-2024学年第一学期期末试卷
- 华东理工大学《国学经典选读》2023-2024学年第一学期期末试卷
- 隔膜压缩机开机停机操作规程
- 湖北工业职业技术学院《医药学基础实验》2023-2024学年第一学期期末试卷
- 遵义医科大学《材料与结构选型》2023-2024学年第一学期期末试卷
- 珠海城市职业技术学院《Python程序开发》2023-2024学年第一学期期末试卷
- 重庆旅游职业学院《地下水资源勘查与评价》2023-2024学年第一学期期末试卷
- 浙江特殊教育职业学院《审计理论与方法》2023-2024学年第一学期期末试卷
- 2023七年级英语下册 Unit 3 How do you get to school Section A 第1课时(1a-2e)教案 (新版)人教新目标版
- 泌尿科主任述职报告
- 新零售门店运营管理流程手册
- 心理学专业知识考试参考题库500题(含答案)(一)
- 2024年浙江高考技术试题(含答案)
- 资管行业投研一体化建设
- 提高保险公司客户投诉处理能力的整改措施
- 物业费收取协议书模板
- 电工(中级工)理论知识练习题(附参考答案)
- 起重机的维护保养要求与月度、年度检查记录表
- 消防设施维护保养记录表
评论
0/150
提交评论