谓词函数

谓词是布尔函数,对于给定的一组输入返回 true 或 false。它们最常用于在查询的 WHERE 部分中过滤子图。

Exists(Property)

exists() 如果节点、关系或映射中存在指定的属性,则返回 true。这与 EXISTS 子句不同。

语法:exists(property)

返回值:

agtype 布尔值。

参数:

名称 描述
property 来自顶点或边的属性。

查询:

SELECT *
FROM cypher('graph_name', $$MATCH (n)
     WHERE exists(n.surname)
     RETURN n.first_name, n.last_name
$$) as (first_name agtype, last_name agtype);

结果:

first_name last_name
'John' 'Smith'
'Patty' 'Patterson'

Exists(Path)

EXISTS(path) 如果给定的路径已经存在,则返回 true

注意!
EXISTS 子查询的已知限制 在 YMatrix AGE 中,EXISTS 子查询如果引用了外部作用域的变量,在某些嵌套场景下会报错: ERROR: could not devise a query plan for the given query

  • 触发条件:
    当 EXISTS 出现在 OPTIONAL MATCH 的 WHERE 子句中,并且引用了 OPTIONAL MATCH 之前定义的变量时,会触发此问题。
  • 示例:
    报错:EXISTS 中引用了外部变量 a MATCH (a:A) WITH a OPTIONAL MATCH (a)-[:incs]->(c) WHERE EXISTS((c)<-[:incs]-(a)) RETURN a, c
    正常:EXISTS 中使用匿名节点,不引用外部变量 MATCH (a:A) WITH a OPTIONAL MATCH (a)-[:incs]->(c) WHERE EXISTS((c)<-[:incs]-()) RETURN a, c
  • 原因: AGE 在转换 Cypher 查询时,将 OPTIONAL MATCH 转换为 SQL 的 LATERAL LEFT JOIN 子查询,将 EXISTS 转换为 SQL 的 EXISTS SubLink。当 EXISTS 中引用外部变量时,会形成 LATERAL 子查询内嵌套 EXISTS 并跨两层引用外部变量的结构。YMatrix 的分布式查询计划器无法为这种多层嵌套的外部变量引用生成执行计划,这是底层分布式计划器的限制。
  • 建议的替代写法
  1. 将 EXISTS 中的模式条件直接合并到 OPTIONAL MATCH 的模式中,具体的:将 EXISTS 条件融入 OPTIONAL MATCH 模式 MATCH (a:A) WITH a OPTIONAL MATCH (a)-[:incs]->(c)<-[:incs]-(a) RETURN a, c
  2. 或者将查询拆分为多步,避免在 OPTIONAL MATCH 的 WHERE 中使用带外部变量引用的 EXISTS,具体的:拆分查询 MATCH (a:A) WITH a OPTIONAL MATCH (a)-[:incs]->(c) WITH a, c WHERE c IS NULL OR EXISTS((c)<-[:incs]-()) RETURN a, c

注意!
影响范围:此限制仅在以下条件同时满足时触发:

  1. 使用 OPTIONAL MATCH(生成 LATERAL LEFT JOIN);
  2. 在其 WHERE 子句中使用 EXISTS;
  3. EXISTS 模式中引用了 OPTIONAL MATCH 外部作用域的变量。
    普通 MATCH 中的 EXISTS、属性存在性检查 EXISTS(n.prop)、以及不引用外部变量的模式 EXISTS 均不受影响

查询:

SELECT *
FROM cypher('graph_name', $$
     MATCH (n)
     WHERE exists((n)-[]-({name: 'Willem Defoe'}))
     RETURN n.full_name
$$) as (full_name agtype);

结果:

full_name
'Toby Maguire'
'Tom Holland'