首页 NeojCypher查询语言详解

NeojCypher查询语言详解

举报
开通vip

NeojCypher查询语言详解ItwaslastrevisedonJanuary2,2021NeojCypher查询语言详解Neo4jCypher查询语言详解Cypher介绍“Cypher”是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询。Cypher还在继续发展和成熟,这也就意味着有可能会出现语法的变化。同时也意味着作为组件没有经历严格的性能测试。Cypher设计的目的是一个人类查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询的专业操作人员(我认为这个很重要)。它的构念是基于英语单词和...

NeojCypher查询语言详解
ItwaslastrevisedonJanuary2,2021NeojCypher查询语言详解Neo4jCypher查询语言详解Cypher介绍“Cypher”是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 现力和效率的查询。Cypher还在继续发展和成熟,这也就意味着有可能会出现语法的变化。同时也意味着作为组件没有经历严格的性能测试。Cypher 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 的目的是一个人类查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询的专业操作人员(我认为这个很重要)。它的构念是基于英语单词和灵巧的图解。Cyper通过一系列不同的方法和建立于确定的实践为表达查询而激发的。许多关键字如like和orderby是受SQL的启发。模式匹配的表达式来自于SPARQL。正则表达式匹配实现实用Scalaprogramminglanguage语言。Cypher是一个申明式的语言。对比命令式语言如Java和脚本语言如Gremlin和JRuby,它的焦点在于从图中如何找回(whattoretrieve),而不是怎么去做。这使得在不对用户公布的实现细节里关心的是怎么优化查询。这个查询语言包含以下几个明显的部分:START:在图中的开始点,通过元素的ID或所以查找获得。MATCH:图形的匹配模式,束缚于开始点。WHERE:过滤条件。RETURN:返回所需要的。在下例中看三个关键字示例图片如下:如:这个有个查询,通过遍历图找到索引里一个叫John的朋友的朋友(不是他的直接朋友),返回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]->followerWHERE=~/S.*/RETURNuser,返回结果:操作符Cypher中的操作符有三个不同种类:数学,相等和关系。数学操作符有+,-,*,/和%。当然只有+对字符有作用。等于操作符有=,<>,<,>,<=,>=。因为Neo4j是一个模式少的图形数据库,Cypher有两个特殊的操作符?和!。有些是用在属性上,有些事用于处理缺少值。对于一个不存在的属性做比较会导致错误。为替代与其他什么做比较时总是检查属性是否存在,在缺失属性时问号将使得比较总是返回true,感叹号使得比较总是返回false。="foo"这个断言在属性缺失情况下将评估为true。!="foo"这个断言在属性缺失情况下将评估为false。警告:在同一个比较中混合使用两个符号将导致不可预料的结果。参数Cypher支持带参数的查询。这允许开发者不需要必须构建一个string的查询,并且使得Cypher的查询计划的缓存更容易。参数可以在where子句,start子句的索引key或索引值,索引查询中作为节点/关系id的引用。以下是几个在java中使用参数的示例:节点id参数Mapparams=newHashMap();("id",0);ExecutionResultresult=("startn=node({id})return",params);节点对象参数Mapparams=newHashMap();("node",andreasNode);ExecutionResultresult=("startn=node({node})return",params);多节点id参数Mapparams=newHashMap();("id",(0,1,2));ExecutionResultresult=("startn=node({id})return",params);字符串参数Mapparams=newHashMap();("name","Johan");ExecutionResultresult=("startn=node(0,1,2)where={name}returnn",params);索引键值参数Mapparams=newHashMap();("key","name");("value","Michaela");ExecutionResultresult=("startn=node:people({key}={value})returnn",params);索引查询参数Mapparams=newHashMap();("query","name:Andreas");ExecutionResultresult=("startn=node:people({query})returnn",params);SKIP与LIMIT*的数字参数Mapparams=newHashMap();("s",1);("l",1);ExecutionResultresult=("startn=node(0,1,2)returnskip{s}limit{l}",params);正则表达式参数Mapparams=newHashMap();("regex",".*h.*");ExecutionResultresult=("startn=node(0,1,2)where=~{regex}return",params);标识符当你参考部分的模式时,需要通过命名完成。定义的不同的命名部分就被称为标识符。如下例中:STARTn=node(1)MATCHn-->bRETURNb标识符为n和b。标识符可以是大写或小些,可以包含下划线。当需要其他字符时可以使用符号。对于属性名的规则也是一样。注解可以在查询语句中使用双斜杠来添加注解。如:STARTn=node(1)RETURNb结果:定向关系和标识符如果需要关系的标识符,为了过滤关系的属性或为了返回关系,可如下例使用标识符。查询:STARTn=node(3)MATCH(n)-[r]->()RETURNr所有从节点A接出的关系将被返回。结果:通过关系类型匹配当已知关系类型并想通过关系类型匹配时,可以通过冒号详细描述。查询:STARTn=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返回类型有空格的关系。结果:多重关系关系可以通过使用在()—()多个语句来表达,或可以串在一起。如下:查询: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,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的外连接类似。如果关系存在,将被返回。如果不存在在其位置将以null代替。查询: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中,可哟通过更多复杂模式来匹配,像一个钻石形状模式。查询: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.圆括号内是一个简单的路径连接,开始节点,连接关系和结束节点。关系的字符描述像关系类型,最大数和方向在寻找最短路径中都将被用到。也可以标识路径为可选。结果:所有最但路径找出两节点节点所有的最短路径。查询:STARTd=node(1),e=node(2)MATCHp=allShortestPaths(d-[*..15]->e)RETURNp这将在节点d与e中找到两条有方向的路径。结果:命名路径如果想在模式图上的路径进行过滤或者返回此路径,可以使用命名路径(namedpath)。查询:STARTa=node(3)MATCHp=a-->bRETURNp开始节点的两个路径。结果:在绑定关系上的匹配当模式中包含一个绑定关系时,此关系模式没有明确的方向,Cypher将尝试着切换连接节点的边匹配关系。查询:STARTa=node(3),b=node(2)MATCHa-[:KNOWS]-x-[:KNOWS]-bRETURNx将返回两个连接节点,一次为开始节点,一次为结束节点。结果:Where如果需要从查找的数据的图中过滤,可以在查询语句中添加where子句。图:Boolean操作类型可以使用boolean操作符and和or或者也可以使用not()函数。查询:STARTn=node(3,1)WHERE<30and="Tobias")ornot="Tobias")RETURNn返回节点。结果:节点属性上的过滤查询:STARTn=node(3,1)WHERE<30RETURNn结果:正则表达式可以通过使用=~/regexp/来匹配正在表达式。如下:查询:STARTn=node(3,1)WHERE=~/Tob.*/RETURNn返回名叫Tobias的节点。结果:转义正则表达式如果在正则表达式中需要有斜杠时可以通过转义实现。查询:STARTn=node(3,1)WHERE=~/Some\/thing/RETURNn没有匹配的节点返回。结果:不分大小些正则表达式在正则表达式前加上?i,整个正则表达式将会忽略大小写。查询:STARTn=node(3,1)WHERE=~/(i)ANDR.*/RETURNn属性name为Andres的节点将返回结果:关系类型上的过滤可以match模式中通过添加具体的关系类型,但有时需要针对类型的更加高级的过滤。可以使用明确的type属性来对比,查询对关系类型名作一个正则比较。查询:STARTn=node(3)MATCH(n)-[r]->()WHEREtype(r)=~/K.*/RETURNr关系整个以K开始的类型名都将返回。结果:属性存在性查询:STARTn=node(3,1)WHERERETURNn结果:如果缺失属性默认为true仅当属性存在时,比较一个图的元素的此属性,使用允许空属性的语法。查询:STARTn=node(3,1)WHERE='white'RETURNn所有节点即使没有belt属性的都将返回。此类比较返回为true。结果:如果缺失属性默认为false需要在缺失属性时为false,即不想返回此属性不存在的节点时。使用感叹号。查询:STARTn=node(3,1)WHERE!='white'RETURNn结果:空置null过滤有时候需要测试值或者标识符是否为null。与sql类似使用isnull或not(isnullx)也能起作用。查询:STARTa=node(1),b=node(3,2)MATCHa<-[r]-bWHERErisnullRETURNbTobias节点没有链接上。结果:关系过滤为过滤两点间基于关系的子图,在match子句中使用限制部分。可以描述带方向的关系和可能的类型。这些都是有效的表达:WHEREa-→bWHEREa←-bWHEREa←[:KNOWS]-bWHEREa-[:KNOWS]-b查询:STARTa=node(1),b=node(3,2)WHEREa<--bRETURNbTobias节点没有链接结果:neo4j综合目录返回节点返回关系返回属性带特殊字符的标识符列的别名可选属性特别的结果查询中的返回部分,返回途中定义的感兴趣的部分。可以为节点、关系或其上的属性。图返回节点返回一个节点,在返回语句中列出即可。查询:STARTn=node(2)RETURNn结果:返回关系查询:STARTn=node(1)MATCH(n)-[r:KNOWS]->(c)RETURNr结果:返回属性查询:STARTn=node(1)RETURN结果:带特殊字符的标识符使用不在英语字符表中的字符,可以使用’单引号。查询:STARTThisisn'tacommonidentifier=node(1)RETURNThisisn'tacommonidentifier.<>`结果:列的别名可以给展示出来的列名起别名。查询:STARTa=node(1)RETURNASSomethingTotallyDifferent返回节点的age属性,但重命名列名。结果:可选属性属性在节点上可能存在也可能不存在,可以使用问号来标识标识符即可。查询:STARTn=node(1,2)RETURN如果存在age属性,则返回,不存在则返回null。结果:特别的结果DISTINCT?仅检索特别的行,基于选择输出的列。查询:STARTa=node(1)MATCH(a)-->(b)RETURNdistinctb返回name为B的节点,但仅为一次。结果:neo4j聚合函数目录聚合Aggregation计数计算节点数分组计算关系类型计算实体数计算非空可以值数求和sum平均值avg最大值max最小值min聚类COLLECT相异DISTINCT聚合(Aggregation)为集合计算数据,Cypher提供聚类功能,与SQL的groupby类似。在return语句中发现的任何聚类函数,所有没有聚类函数的列将作为聚合key使用。图:计数计数(count)使用来计算行数。Count有两种使用方法。Count(*)计算匹配的行的行数,count(<标识符>)计算标识符中非空值数。计算节点数计算链接到一个节点的节点数,可以使用count(*)。查询:STARTn=node(2)MATCH(n)-->(x)RETURNn,count(*)返回开始节点和相关节点节点数。结果:分组计算关系类型计算分组了得关系类型,返回关系类型并使用count(*)计算。查询:STARTn=node(2)MATCH(n)-[r]->()RETURNtype(r),count(*)返回关系类型和其分组数。结果:计算实体数相比使用count(*),可能计算标识符更实在。查询:STARTn=node(2)MATCH(n)-->(x)RETURNcount(x)返回链接到开始节点上的节点数结果:计算非空可以值数查询:STARTn=node(2,3,4,1)RETURNcount)结果:求和(sum)Sum集合简单计算数值类型的值。Null值将自动去掉。如下:查询:STARTn=node(2,3,4)RETURNsum计算所有节点属性值之和。结果:平均值(avg)Avg计算数量列的平均值查询:STARTn=node(2,3,4)RETURNavg结果:最大值(max)Max查找数字列中的最大值。查询:STARTn=node(2,3,4)RETURNmax结果:最小值(min)Min使用数字属性作为输入,并返回在列中最小的值。查询:STARTn=node(2,3,4)RETURNmin结果:聚类(COLLECT)Collect将所有值收集到一个集合list中。查询:STARTn=node(2,3,4)RETURNcollect返回一个带有所有属性值的简单列。结果:相异(DISTINCT)聚合函数中使用distinct来去掉值中重复的数据。查询:STARTa=node(2)MATCHa-->bRETURNcount(distinct结果:neo4j高级篇目录排序Orderby通过节点属性排序节点通过多节点属性排序节点倒序排列节点空值排序Skip跳过前三个返回中间两个Limit返回第一部分函数Functions判断AllAnyNoneSingleScalar函数LengthTypeIdCoalesceIterable函数NodesRelationshipsExtract排序(Orderby)输出结果排序可以使用orderby子句。注意,不能使用节点或者关系排序,仅仅只针对其属性有效。图:通过节点属性排序节点查询:STARTn=node(3,1,2)RETURNnORDERBY结果:通过多节点属性排序节点在orderby子句中可以通过多个属性来排序每个标识符。Cypher首先将通过第一个标识符排序,如果第一个标识符或属性相等,则在orderby中检查下一个属性,依次类推。查询:STARTn=node(3,1,2)RETURNnORDERBY,首先通过age排序,然后再通过name排序。结果:倒序排列节点可以在标识符后添加desc或asc来进行倒序排列或顺序排列。查询:STARTn=node(3,1,2)RETURNnORDERBYDESC结果:空值排序当排列结果集时,在顺序排列中null将永远放在最后,而在倒序排列中放最前面。查询:STARTn=node(3,1,2)RETURN,nORDERBY结果:SkipSkip允许返回总结果集中的一个子集。此不保证排序,除非使用了orderby’子句。图:跳过前三个返回结果中一个子集,从第三个结果开始,语法如下:查询:STARTn=node(3,4,5,1,2)RETURNnORDERBYSKIP3前三个节点将略过,最后两个节点将被返回。结果:返回中间两个查询:STARTn=node(3,4,5,1,2)RETURNnORDERBYSKIP1LIMIT2中间两个节点将被返回。结果:LimitLimit允许返回结果集中的一个子集。图:返回第一部分查询:STARTn=node(3,4,5,1,2)RETURNnLIMIT3结果:函数(Functions)在Cypher中有一组函数,可分为三类不同类型:判断、标量函数和聚类函数。图:判断判断为boolean函数,对给出的输入集合做判断并返回true或者false。常用在where子句中过滤子集。All迭代测试集合中所有元素的判断。语法:All(标识符initerablewhere判断)参数:iterable:一个集合属性,或者可迭代的元素,或一个迭代函数。标识符:可用于判断比较的标识符。判断:一个测试所有迭代器中元素的判断。查询:STARTa=node(3),b=node(1)MATCHp=a-[*1..3]->bWHEREall(xinnodes(p)WHERE>30)RETURNp过滤包含age〈30的节点的路径,返回符合条件路径中所有节点。结果:Any语法:ANY(identifieriniterableWHEREpredicate)参数:Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。Identifier(标识符):可用于判断比较的标识符。Predicate(判断):一个测试所有迭代器中元素的判断。查询:STARTa=node(2)WHEREany(xinWHEREx="one")RETURNa结果:None在迭代器中没有元素判断将返回true。语法:NONE(identifieriniterableWHEREpredicate)Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。Identifier(标识符):可用于判断比较的标识符。Predicate(判断):一个测试所有迭代器中元素的判断。查询:STARTn=node(3)MATCHp=n-[*1..3]->bWHERENONE(xinnodes(p)WHERE=25)RETURNp结果:Single如果迭代器中仅有一个元素则返回true。语法:SINGLE(identifieriniterableWHEREpredicate)参数:Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。Identifier(标识符):可用于判断比较的标识符。Predicate(判断):一个测试所有迭代器中元素的判断。查询:STARTn=node(3)MATCHp=n-->bWHERESINGLE(varinnodes(p)WHERE="blue")RETURNp结果:Scalar函数标量函数返回单个值。Length使用详细的length属性,返回或过滤路径的长度。语法:LENGTH(iterable)参数:Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。查询:STARTa=node(3)MATCHp=a-->b-->cRETURNlength(p)返回路径的长度。结果:Type返回关系类型的字符串值。语法:TYPE(relationship)参数:Relationship:一条关系。查询:STARTn=node(3)MATCH(n)-[r]->()RETURNtype(r)返回关系r的类型。结果:Id返回关系或者节点的id语法:ID(property-container)参数:Property-container:一个节点或者一条关系。查询:STARTa=node(3,4,5)RETURNID(a)返回这三个节点的id。结果:Coalesce返回表达式中第一个非空值。语法:COALESCE(expression[,expression]*)参数:Expression:可能返回null的表达式。查询:STARTa=node(3)RETURNcoalesce,)结果:Iterable函数迭代器函数返回一个事物的迭代器---在路径中的节点等等。Nodes返回一个路径中的所有节点。语法:NODES(path)参数:Path:路径查询:STARTa=node(3),c=node(2)MATCHp=a-->b-->cRETURNNODES(p)结果:Relationships返回一条路径中的所有关系。语法:RELATIONSHIPS(path)参数:Path:路径查询:STARTa=node(3),c=node(2)MATCHp=a-->b-->cRETURNRELATIONSHIPS(p)结果:Extract可以使用extract单个属性,或从关系或节点集合迭代一个函数的值。将遍历迭代器中所有的节点并运行表达式返回结果。语法:EXTRACT(identifieriniterable:expression)Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。Identifier(标识符):闭包中表述内容的标识符,这决定哪个标识符将用到。expression(表达式):这个表达式将对于迭代器中每个值运行一次,并生成一个结果迭代器。查询:STARTa=node(3),b=node(4),c=node(1)MATCHp=a-->b-->cRETURNextract(ninnodes(p):返回路径中所有age属性值。结果:
本文档为【NeojCypher查询语言详解】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
少杰
喜欢看书
格式:doc
大小:3MB
软件:Word
页数:0
分类:企业经营
上传时间:2021-09-18
浏览量:0