tugraph-analytics icon indicating copy to clipboard operation
tugraph-analytics copied to clipboard

Added implementation of standard ISO-GQL syntax(5):same predicate

Open Loognqiang opened this issue 1 year ago • 1 comments

【需求描述】 新增实现以下标准ISO-GQL语法:

  1. same predicate

【期望产出】

  1. 支持实现上述语法,同时提供并跑通测试用例。

如有疑问请联系: @puuuuug

Loognqiang avatar Nov 05 '24 05:11 Loognqiang

当前现状分析

Apache GeaFlow已经具备了GQL查询语言的基础架构,包括基于Apache Calcite的解析器实现和图模式匹配功能。

现有的架构包括:

  • 基本的Match模式语法支持
  • SqlUnionPathPattern用于路径模式的联合操作
  • 基于Apache Calcite的GeaFlowDSLParser解析器

实现方案

1. 语法扩展设计

需要在现有的Match语法基础上扩展"same predicate"功能,支持在多个路径模式中使用相同的谓词条件。根据现有的Match语法结构 ,建议扩展语法如下:

MATCH PathPattern1 | PathPattern2 WHERE SAME(predicate_condition)

2. 核心组件实现

2.1 AST节点扩展

需要扩展现有的SQL节点类来支持same predicate语法:

  • 基于现有的SqlUnionPathPattern创建SqlSamePredicatePattern类
  • 扩展现有的SqlMatchPattern以支持same predicate条件

2.2 解析器扩展

需要在GeaFlowDSLParser中添加same predicate的语法规则:

  • 扩展lexical规则识别SAME关键字
  • 添加语法规则处理same predicate结构
  • 更新GQL conformance规则

2.3 验证器实现

需要在GQLValidatorImpl中添加same predicate的验证逻辑:

  • 验证predicate条件的合法性
  • 确保相同谓词在不同路径模式中的兼容性
  • 类型检查和作用域验证

2.4 关系代数转换

需要在GQLToRelConverter中实现same predicate到关系代数的转换:

  • 将same predicate条件提取为公共过滤条件
  • 生成适当的关系代数操作符
  • 优化生成的查询计划

3. 详细实现步骤

第一阶段:语法解析支持

  1. 在geaflow-dsl-parser模块中:
    • 扩展GeaFlowParserImpl添加same predicate语法
    • 创建SqlSamePredicatePattern AST节点类
    • 更新GQLConformance配置

第二阶段:语义验证

  1. 在geaflow-dsl-plan模块中:
    • 扩展GQLValidatorImpl添加same predicate验证
    • 创建相应的namespace类处理作用域
    • 实现类型推导和兼容性检查

第三阶段:执行计划生成

  1. 在geaflow-dsl-plan模块中:
    • 扩展GQLToRelConverter处理same predicate转换
    • 创建对应的关系代数操作符
    • 实现查询优化规则

第四阶段:测试用例开发

  1. 在geaflow-dsl-parser的test模块中:
    • 创建SamePredicateSyntaxTest测试类
    • 添加各种same predicate语法的测试用例
    • 在IsoGqlSyntaxTest中增加相关测试

4. 测试用例设计

以下测试场景:

-- 基础same predicate测试
MATCH (a:person) -> (b) | (a:person) -> (c) WHERE SAME(a.age > 25)

-- 复杂条件测试  
MATCH (a) -[e1:knows]-> (b) | (a) -[e2:likes]-> (c) WHERE SAME(e1.weight = e2.weight)

-- 嵌套路径测试
MATCH ((a) -> (b) -> (c)) | ((a) -> (d) -> (e)) WHERE SAME(a.status = 'active')

kitalkuyo-gita avatar Aug 24 '25 04:08 kitalkuyo-gita