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

时间:2022-06-28 14:45:53

Where

如果需要从查找的数据的图中过滤,可以在查询语句中添加where子句。

图:

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

Boolean 操作类型

可以使用boolean操作符and 和 or 或者也可以使用not()函数。

查询:

 

START n=node(3, 1)

WHERE (n.age < 30 and n.name = "Tobias") ornot(n.name = "Tobias")

RETURN n

 

返回节点。

 

结果:

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

节点属性上的过滤

查询:

 

START n=node(3, 1)

WHERE n.age < 30

RETURN n

 

结果:

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

正则表达式

可以通过使用=~ /regexp/来匹配正在表达式。如下:

 

查询:

 

START n=node(3, 1)

WHERE n.name =~ /Tob.*/

RETURN n

 

返回名叫Tobias的节点。

 

结果:

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

转义正则表达式

如果在正则表达式中需要有斜杠时可以通过转义实现。

 

查询:

 

START n=node(3, 1)

WHERE n.name =~ /Some\/thing/

RETURN n

 

没有匹配的节点返回。

 

结果:

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

不分大小些正则表达式

在正则表达式前加上?i,整个正则表达式将会忽略大小写。

 

查询:

 

START n=node(3, 1)

WHERE n.name =~ /(?i)ANDR.*/

RETURN n

 

属性name为Andres的节点将返回

 

结果:

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

关系类型上的过滤

可以match模式中通过添加具体的关系类型,但有时需要针对类型的更加高级的过滤。可以使用明确的type属性来对比,查询对关系类型名作一个正则比较。

 

查询:

 

START n=node(3)

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

WHERE type(r) =~ /K.*/

RETURN r

 

关系整个以K开始的类型名都将返回。

 

结果:

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

属性存在性

查询:

 

START n=node(3, 1)

WHERE n.belt

RETURN n

 

结果:

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

如果缺失属性默认为true

仅当属性存在时,比较一个图的元素的此属性,使用允许空属性的语法。

 

查询:

 

START n=node(3, 1)

WHERE n.belt? = 'white'

RETURN n

 

所有节点即使没有belt属性的 都将返回。此类比较返回为true。

 

结果:

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

如果缺失属性默认为false

需要在缺失属性时为false,即不想返回此属性不存在的节点时。使用感叹号。

 

查询:

 

START n=node(3, 1)

WHERE n.belt! = 'white'

RETURN n

 

结果:

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

空置null过滤

有时候需要测试值或者标识符是否为null。与sql类似使用 is null 或 not(is null x)也能起作用。

 

查询:

 

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

MATCH a<-[r?]-b

WHERE r is null

RETURN b

 

Tobias节点没有链接上。

 

结果:

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

关系过滤

为过滤两点间基于关系的子图,在match子句中使用限制部分。可以描述带方向的关系和可能的类型。这些都是有效的表达:WHERE a-→b WHERE a←-b WHERE a←[:KNOWS]-bWHERE a-[:KNOWS]-b

 

查询:

 

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

WHERE a<--b

RETURN b

 

Tobias节点没有链接

结果:

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