Cypher查询语言--Neo4j中的SQL(2)

时间:2021-09-16 14:47:48

Match

在一个查询的匹配(match)部分申明图形(模式)。模式的申明导致一个或多个以逗号隔开的路径(path)。

         节点标识符可以使用或者不是用圆括号。使用圆括号与不使用圆括号完全对等,如:

MATCH(a)-->(b) 与 MATCH a-->b 匹配模式完全相同。

    模式的所有部分都直接或者间接地绑定到开始点上。可选关系是一个可选描述模式的方法,但在真正图中可能没有匹配(节点可能没有或者没有此类关系时),将被估值为null。与SQL中的外联结类似,如果Cypher发现一个或者多个匹配,将会全部返回。如果没有匹配,Cypher将返回null。

如以下例子,b和p都是可选的病都可能包含null:

 

START a=node(1) MATCH p = a-[?]->b

START a=node(1) MATCH p = a-[*?]->b

START a=node(1) MATCH p = a-[?]->x-->b

START a=node(1), x=node(100) MATCH p = shortestPath( a-[*?]->x )

Cypher查询语言--Neo4j中的SQL(2)

相关节点

符号—意味着相关性,不需要关心方向和类型。

 

查询:

START n=node(3)

MATCH (n)--(x)

RETURN x

 

所有与A相关节点都被返回。

 

结果:

 Cypher查询语言--Neo4j中的SQL(2)

接出关系(Outgong relationship)

当对关系的方向感兴趣时,可以使用-->或<--符号,如:

 

查询:

START n=node(3)

MATCH (n)-->(x)

RETURN x

 

所有A的接出关系到达的节点将被返回.

结果:

Cypher查询语言--Neo4j中的SQL(2)

定向关系和标识符

如果需要关系的标识符,为了过滤关系的属性或为了返回关系,可如下例使用标识符。

 

查询:

START n=node(3)

MATCH (n)-[r]->()

RETURN r

 

所有从节点A接出的关系将被返回。

 

结果:

Cypher查询语言--Neo4j中的SQL(2)

通过关系类型匹配

当已知关系类型并想通过关系类型匹配时,可以通过冒号详细描述。

查询:

START n=node(3)

MATCH (n)-[:BLOCKS]->(x)

RETURN x

 

返回A接出关系类型为BLOCKS的节点。

 

结果:

Cypher查询语言--Neo4j中的SQL(2)

通过关系类型匹配和使用标识符

如果既想获得关系又要通过已知的关系类型,那就都添加上,如:

 

查询:

START n=node(3)

MATCH (n)-[r:BLOCKS]->()

RETURN r

 

所有从A接出的关系为BLOCKS的关系都被返回。

 

结果:

 Cypher查询语言--Neo4j中的SQL(2)

 

带有特殊字符的关系类型

有时候数据库中有非字母字符类型,或有空格在内时,使用单引号。

 

查询:

START n=node(3)

MATCH (n)-[r:`TYPE WITH SPACE IN IT`]->()

RETURN r

 

返回类型有空格的关系。

 

结果:

Cypher查询语言--Neo4j中的SQL(2)

多重关系

关系可以通过使用在()—()多个语句来表达,或可以串在一起。如下:

 

查询:

START a=node(3)

MATCH (a)-[:KNOWS]->(b)-[:KNOWS]->(c)

RETURN a,b,c

 

路径中的三个节点。

 

结果:

Cypher查询语言--Neo4j中的SQL(2)

可变长度的关系

可变数量的关系->节点可以使用-[:TYPE*minHops..maxHops]->

 

查询:

START a=node(3), x=node(2, 4)

MATCH a-[:KNOWS*1..3]->x

RETURN a,x

 

如果在1到3的关系中存在路径,将返回开始点和结束点。

 

结果:

Cypher查询语言--Neo4j中的SQL(2)

 

在可变长度关系的关系标识符

当连接两个节点的长度是可变的不确定的时,可以使用一个关系标识符遍历所有关系。

 

查询:

 

START a=node(3), x=node(2, 4)

MATCH a-[r:KNOWS*1..3]->x

RETURN r

 

如果在1到3的关系中存在路径,将返回开始点和结束点。

结果:

 Cypher查询语言--Neo4j中的SQL(2)

 

零长度路径

当使用可变长度路径,可能其路径长度为0,这也就是说两个标识符指向的为同一个节点。如果两点间的距离为0,可以确定这是同一个节点。

 

查询:

 

START a=node(3)

MATCH p1=a-[:KNOWS*0..1]->b, p2=b-[:BLOCKS*0..1]->c

RETURN a,b,c, length(p1), length(p2)

 

这个查询将返回四个路径,其中有些路径长度为0.

 

结果:

 Cypher查询语言--Neo4j中的SQL(2)

可选关系

如果关系为可选的,可以使用问号表示。与SQL的外连接类似。如果关系存在,将被返回。如果不存在在其位置将以null代替。

 

查询:

 

START a=node(2)

MATCH a-[?]->x

RETURN a,x

 

返回一个节点和一个null,因为这个节点没有关系。

 

结果:

 Cypher查询语言--Neo4j中的SQL(2)

可选类型和命名关系

通过一个正常的关系,可以决定哪个标识符可以进入,那些关系类型是需要的。

 

查询:

 

START a=node(3)

MATCH a-[r?:LOVES]->()

RETURN a,r

 

返回一个节点和一个null,因为这个节点没有关系。

 

结果:

 Cypher查询语言--Neo4j中的SQL(2)

可选元素的属性

返回可选元素上的属性,null值将返回null。

 

查询:

 

START a=node(2)

MATCH a-[?]->x

RETURN x, x.name

 

元素x在查询中为null,所有其属性name为null。

结果:

 Cypher查询语言--Neo4j中的SQL(2)

复杂匹配

在Cypher中,可哟通过更多复杂模式来匹配,像一个钻石形状模式。

 

查询:

 

START a=node(3)

MATCH (a)-[:KNOWS]->(b)-[:KNOWS]->(c),(a)-[:BLOCKS]-(d)-[:KNOWS]-(c)

RETURN a,b,c,d

 

路径中的四个节点。

 

结果:

 Cypher查询语言--Neo4j中的SQL(2)

最短路径

使用shortestPath函数可以找出一条两个节点间的最短路径,如下。

 

查询:

 

START d=node(1), e=node(2)

MATCH p = shortestPath( d-[*..15]->e )

RETURN p

 

这意味着:找出两点间的一条最短路径,最大关系长度为15.圆括号内是一个简单的路径连接,开始节点,连接关系和结束节点。关系的字符描述像关系类型,最大数和方向在寻找最短路径中都将被用到。也可以标识路径为可选。

 

结果:

 Cypher查询语言--Neo4j中的SQL(2)

所有最但路径

找出两节点节点所有的最短路径。

 

查询:

 

START d=node(1), e=node(2)

MATCH p = allShortestPaths( d-[*..15]->e )

RETURN p

 

这将在节点d与e中找到两条有方向的路径。

结果:

Cypher查询语言--Neo4j中的SQL(2)

命名路径

如果想在模式图上的路径进行过滤或者返回此路径,可以使用命名路径(named path)。

 

查询:

 

START a=node(3)

MATCH p = a-->b

RETURN p

 

开始节点的两个路径。

 

结果:

Cypher查询语言--Neo4j中的SQL(2) 

在绑定关系上的匹配

当模式中包含一个绑定关系时,此关系模式没有明确的方向,Cypher将尝试着切换连接节点的边匹配关系。

 

查询:

START a=node(3), b=node(2)

MATCH a-[?:KNOWS]-x-[?:KNOWS]-b

RETURN x

 

将返回两个连接节点,一次为开始节点,一次为结束节点。

 

结果:

 Cypher查询语言--Neo4j中的SQL(2)