Skip to content

Text2Gremlin Data Generation and Model Fine-Tuning System (Vertical Scenarios and General Scenarios)#52

Open
LRriver wants to merge 62 commits into
hugegraph:mainfrom
LRriver:text2gremlin
Open

Text2Gremlin Data Generation and Model Fine-Tuning System (Vertical Scenarios and General Scenarios)#52
LRriver wants to merge 62 commits into
hugegraph:mainfrom
LRriver:text2gremlin

Conversation

@LRriver
Copy link
Copy Markdown
Collaborator

@LRriver LRriver commented Sep 30, 2025

LLM-based Gremlin QA Synthesis and Generalization in Vertical Scenarios.

🏗️ Project Structure

Vertical_Text2Gremlin/
├── README.md
├── __pycache__/
├── data/
├── db_data/
├── graph2gremlin.py
├── gremlin_checker.py
├── gremlin_qa_dataset.csv
├── instruct_convert.py
├── llm_handler.py
└── qa_generalize.py
  • ./graph2gremlin.py: Initially generates Gremlin data based on templates and graph data, ensuring correctness through templates, and translates and preliminarily generalizes the Gremlin data and questions.
  • ./gremlin_checker.py: Performs syntax checking using Antlr4.
  • ./llm_handler.py: An LLM interaction model that inputs QA data for each batch of seed numbers (during seed data generation, queries undergo a small batch generalization), allowing the LLM to understand how to write text2gremlin, first generalizing Gremlin, then translating and generalizing the query.
  • ./qa_generalize.py: Calls gremlin_checker and llm_handler for seed data generalization.
  • ./instruct_convert.py: Handles instruction format conversion and the division of training and test sets.
  • ./db_data: Contains schema and graph data.
  • ./data/seed_data: Seed data (to be uploaded).
  • ./data/vertical_training_sets: Vertical scenario generalization data (to be uploaded).

Gremlin Corpus Generation System Based on Recursive Backtracking in General Scenarios.

📋 Project Overview
This PR adds a complete Text-to-Gremlin corpus generation system based on a recursive backtracking recipe-guided generation approach, capable of automatically generating large-scale and diverse training data from Gremlin query templates.

🏗️ Project Structure

├── generate_corpus.py                   # 主程序
├── gremlin_templates.csv                # 模板文件
├── config.json                          # 配置
├── base/
│   ├── generator.py                     # 解析泛化控制器
│   ├── Config.py                        # 配置管理模块
│   ├── Schema.py                        # Schema和数据管理
│   ├── GremlinParse.py                  # 数据结构定义
│   ├── GremlinExpr.py                   # 复杂表达式定义(谓词、匿名遍历等)
│   ├── GremlinTransVisitor.py           # AST解析
│   ├── TraversalGenerator.py            # 遍历生成器
│   ├── combination_control_config.json  # 组合控制配置
│   ├── GremlinBase.py                   # 翻译引擎
│   ├── gremlin/                         # ANTLR生成的解析器
│   └── template/                        # 翻译字典
│       ├── schema_dict.txt              # Schema术语翻译
│       └── syn_dict.txt                 # 同义词字典
├── db_data/                             # 数据和 Schema
└── output/                              # 输出目录

🎯 Core Features

  1. Recipe-Guided Generation

    • Parse Gremlin queries into Recipes using ANTLR
    • Perform intelligent parameter generalization based on Schema
    • Generate large numbers of valid variants through recursive backtracking
  2. Large-Scale Data Processing

    • Support batch loading of query templates from CSV files
    • Process 3514 real cypher2gremlin dataset entries
    • Global deduplication to ensure corpus quality
  3. Complete Error Handling

    • Support complex query types (g.call(), .with(), etc.)
    • Individual failures don't affect overall processing
    • Detailed statistics and error reporting
  4. Intelligent Constraint Mechanism

    • Schema connectivity validation
    • Syntax validity checking
    • Combinatorial explosion control (320k → 7k valid combinations)

📊 System Capabilities

  • Query type support: V/E traversals, graph algorithm calls, complex filtering, etc.
  • Generation scale: Single complex template can generate 6000+ valid variants
  • Processing efficiency: Batch processing of 3514 templates with robust error handling
  • Output quality: JSON format with query-description pairs and detailed metadata

🧪 Technical Features

  • Recursive backtracking algorithm: Systematically explore parameter combination space
  • Recipe abstraction: Structure queries into generalizable Recipes
  • Constraint optimization: 97%+ invalid combinations intelligently filtered
  • Modular design: Core components can be used and tested independently

📈 Application Value

  • Text-to-Gremlin training: Provide large-scale training data for NLP models
  • Query diversity: Generate rich query variants from limited templates
  • Data quality: Ensure syntactic correctness and semantic reasonableness of generated queries
  • Extensibility: Support extension of new schemas and query types

🔧 Usage

# Basic usage
from generator import generate_corpus_from_templates

templates = ["g.V().hasLabel('person')", "g.V().out('knows')"]
result = generate_corpus_from_templates(templates)
print(f"Generated {result['total_unique_queries']} unique queries")

📋 Documentation

  • README.md: Quick start guide

Summary by CodeRabbit

发布说明

  • 新功能

    • 新增Gremlin查询语料库生成系统,支持从模板自动化生成多样化查询
    • 新增CLI工具实现查询生成、语法分析和自然语言翻译功能
    • 新增配置驱动的组合控制系统,用于限制和多样化查询生成
    • 新增数据库模式管理和查询验证功能
  • 文档

    • 新增项目快速开始指南和详细中文文档
    • 新增电影数据集示例配置和模式定义

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Sep 30, 2025

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

概览

引入AST_Text2Gremlin模块——一套完整的图查询生成系统,包含ANTLR解析、模式管理、遍历生成和LLM翻译功能,用于从模板生成Gremlin查询语料库。

变更

集群/文件(s) 摘要
配置与模式管理
base/Config.py, base/Schema.py, base/CombinationController.py
新增配置加载器、图模式定义和生成约束控制器,支持JSON配置文件、顶点/边标签解析和数据驱动的组合策略。
Gremlin AST核心数据结构
base/GremlinExpr.py, base/GremlinParse.py
定义Predicate、TextPredicate、AnonymousTraversal、Connector、Terminal、Step和Traversal等核心类型,用于表示Gremlin查询的结构化表达。
Gremlin解析与访问
base/GremlinTransVisitor.py, base/gremlin/GremlinVisitor.py, base/gremlin/Gremlin.tokens, base/gremlin/GremlinLexer.tokens
ANTLR访问器实现、词法令牌定义和语法树遍历支持,将Gremlin查询字符串转换为结构化对象。
生成引擎核心
base/GremlinBase.py, base/TraversalGenerator.py, base/generator.py
实现查询模板翻译、递归生成逻辑、随机增强和语法检验,支持从模板批量生成多样化Gremlin查询。
命令行工具与脚本
generate_corpus.py, analyze_syntax.py, generalize_llm.py
提供语料库生成CLI、语法分析工具和LLM翻译编排,支持端到端工作流从模板生成到自然语言翻译。
配置文件与数据
config_example.json, combination_control_config.json, db_data/schema/movie_schema.json, base/template/schema_dict.txt, base/template/syn_dict.txt
示例配置、生成控制参数、电影领域模式定义和中英文术语映射字典。
项目初始化与依赖
base/__init__.py, base/gremlin/__init__.py, requirements.txt, .gitignore, .licenserc.yaml, README.md
包初始化、依赖声明、版本控制配置和文档。

序列图

sequenceDiagram
    participant User as CLI/用户
    participant GenCorpus as generate_gremlin_corpus
    participant Parser as GremlinTransVisitor
    participant Generator as TraversalGenerator
    participant Schema as Schema
    participant GremlinBase as GremlinBase
    participant Validator as check_gremlin_syntax
    
    User->>GenCorpus: 提供模板、配置、模式、数据路径
    GenCorpus->>GenCorpus: 加载Config、Schema、GremlinBase
    
    loop 遍历每个模板
        GenCorpus->>Parser: 解析模板字符串为Recipe
        Parser-->>GenCorpus: 返回Traversal对象
        
        GenCorpus->>Generator: 初始化,提供Schema/Recipe/GremlinBase
        Generator->>Schema: 查询顶点/边标签、属性、实例数据
        Schema-->>Generator: 返回模式信息和样本数据
        
        Generator->>Generator: 递归生成查询步骤和描述
        Note over Generator: 深度优先遍历,动态扩展选项
        
        loop 生成的每个查询
            GenCorpus->>Validator: 验证Gremlin语法
            Validator-->>GenCorpus: 返回有效性状态
            GenCorpus->>GenCorpus: 全局去重,积累结果
        end
    end
    
    GenCorpus-->>User: 返回语料库、统计信息、输出文件路径
Loading
sequenceDiagram
    participant User as 用户
    participant Main as generalize_llm main()
    participant Corpus as load_corpus
    participant Config as get_llm_config
    participant Batch as translate_batch
    participant LLM as OpenAI API
    participant Output as save_results
    
    User->>Main: CLI: --config --input --output
    Main->>Config: 验证并规范化LLM配置
    Config-->>Main: 返回api_key、model等
    
    Main->>Corpus: 加载最新/指定语料库JSON
    Corpus-->>Main: 返回查询列表
    
    Main->>Main: 将语料库分批处理
    
    loop 并发批处理
        Main->>Batch: 翻译批次(semaphore并发控制)
        Batch->>LLM: 发送提示+查询,请求生成多个自然语言问题
        LLM-->>Batch: 返回JSON响应
        Batch->>Batch: 解析、验证、映射结果
        Batch-->>Main: 返回翻译后的项目列表
    end
    
    Main->>Output: 保存带元数据的翻译结果
    Output-->>Main: 成功
    Main-->>User: 打印统计信息和输出路径
Loading

预估代码审查工作量

🎯 5 (Critical) | ⏱️ ~120 minutes

可能相关的PR

建议的标签

llm

🐰 扬起长耳朵,庆祝新功能

模板化查询化诗篇,
遍历递归生千般,
LLM妙笔译自然,
图海澜澜任周旋,
兔子舞动庆新年!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 10.69% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 标题完整准确地反映了此拉取请求的核心变化,涵盖了垂直场景和通用场景的Text2Gremlin数据生成和模型微调系统。

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Tip

You can customize the high-level summary generated by CodeRabbit.

Configure the reviews.high_level_summary_instructions setting to provide custom instructions for generating the high-level summary.

@github-actions
Copy link
Copy Markdown

@codecov-ai-reviewer review

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 28

♻️ Duplicate comments (1)
text2gremlin/AST_Text2Gremlin/base/test/test_csv_queries.py (1)

30-41: 代码重复:与 test_recipe_extraction_failures.py 中的 SyntaxErrorListener 相同

此类与 test_recipe_extraction_failures.py (lines 24-35) 中的定义完全相同。如前面评论所述,建议提取到共享测试工具模块 test_utils.py 中。

参见对 test_recipe_extraction_failures.py lines 24-35 的评论。

🧹 Nitpick comments (29)
text2gremlin/AST_Text2Gremlin/config.json (1)

5-5: 澄清空值的用途或移除无用配置。

"common" 字段的值为空字符串。如果此字段未使用,建议移除以避免混淆;如果它有特定用途(如作为默认值或占位符),请在文档中说明其语义。

text2gremlin/AST_Text2Gremlin/base/test/test_generator.py (2)

24-28: 建议添加输出文件清理机制

测试运行后会产生 test_generator_output.json 文件,但没有清理逻辑。建议在测试完成后清理临时文件,或者使用临时目录。

+import os
+import tempfile
+
 def test_generator():
     """测试生成器的完整流程"""
     print("🧪 开始测试generator.py...")
     
+    # 使用临时文件
+    temp_file = tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False)
+    output_file = temp_file.name
+    temp_file.close()
+    
     # 测试模板(模拟从CSV加载的数据)
     test_templates = [
         ...
     ]
     
     print(f"使用 {len(test_templates)} 个测试模板...")
     
     try:
         result = generate_corpus_from_templates(
             test_templates, 
-            output_file='test_generator_output.json'
+            output_file=output_file
         )
         
         print(f"\n✅ 生成成功!")
         ...
         
         return True
         
     except Exception as e:
         print(f"❌ 生成失败: {str(e)}")
         return False
+    finally:
+        # 清理临时文件
+        if os.path.exists(output_file):
+            os.remove(output_file)

39-41: 异常处理过于宽泛

捕获所有异常(except Exception)会掩盖潜在的编程错误。建议捕获更具体的异常类型,或至少记录完整的堆栈信息以便调试。

+    import traceback
+    
     try:
         result = generate_corpus_from_templates(
             test_templates, 
             output_file='test_generator_output.json'
         )
         ...
         
     except Exception as e:
-        print(f"❌ 生成失败: {str(e)}")
+        print(f"❌ 生成失败: {str(e)}")
+        traceback.print_exc()  # 打印完整堆栈跟踪
         return False
text2gremlin/AST_Text2Gremlin/base/test/analyze_line73_explosion.py (2)

147-147: 硬编码的分析数量限制

将分析限制为前 100 个查询是一个魔术数字,应该作为可配置参数。

-    for query_gen, desc in corpus[:100]:  # 只分析前100个
+    # 在函数参数中添加
+    def analyze_actual_generation(query: str, schema: Schema, config: Config, 
+                                  gremlin_base: GremlinBase, sample_size: int = 100):
+        ...
+        for query_gen, desc in corpus[:sample_size]:  # 只分析前N个

131-139: 缺少生成过程的错误处理

TraversalGenerator.generate() 可能会失败或返回空结果,但没有错误处理。

     visitor = GremlinTransVisitor()
     recipe = visitor.parse_and_visit(query)
     
+    if not recipe:
+        print("❌ Recipe解析失败")
+        return
+    
     generator = TraversalGenerator(schema, recipe, gremlin_base)
-    corpus = generator.generate()
+    try:
+        corpus = generator.generate()
+    except Exception as e:
+        print(f"❌ 生成失败: {e}")
+        return
     
+    if not corpus:
+        print("⚠️  未生成任何查询")
+        return
+    
     print(f"实际生成数量: {len(corpus):,}")
text2gremlin/AST_Text2Gremlin/base/Config.py (2)

38-47: 考虑简化输出路径逻辑

get_output_path 中的条件逻辑可以更清晰。当前实现在判断目录后拼接路径,可以提取为辅助方法提高可读性。

可选重构建议:

 def get_output_path(self):
     if self.gen_query:
         dir_or_file = self.config_data.get("output_query_dir_or_file")
-        if os.path.isdir(dir_or_file):
-            output_path = os.path.join(dir_or_file, self.db_id + ".txt")
-            return output_path
-        else:
-            return dir_or_file
+        return self._resolve_output_path(dir_or_file, self.db_id)
     else:
         return self.config_data.get("output_prompt_path")
+
+def _resolve_output_path(self, dir_or_file: str, db_id: str) -> str:
+    """解析输出路径:如果是目录则拼接 db_id,否则直接返回"""
+    if os.path.isdir(dir_or_file):
+        return os.path.join(dir_or_file, f"{db_id}.txt")
+    return dir_or_file

22-24: 建议指定文件编码

打开文件时未指定编码,在某些环境下可能导致编码问题。

建议显式指定 UTF-8 编码(已在上面的异常处理建议中包含):

-    with open(self.file_path, "r") as file:
+    with open(self.file_path, "r", encoding="utf-8") as file:
text2gremlin/AST_Text2Gremlin/base/test/test_recipe_extraction_failures.py (2)

148-148: 硬编码的 CSV 文件路径降低了测试灵活性

CSV 文件路径被硬编码在 main() 函数中,不便于在不同环境或数据集上运行测试。

建议通过命令行参数或环境变量使路径可配置:

 def main():
     """主函数"""
     print("=== Recipe Extraction 失败分析脚本 ===")
     print(f"开始时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
     
-    # 配置文件路径
-    csv_file_path = "gremlin_query_errors_20250928_030206.csv"
+    # 从命令行参数或环境变量获取 CSV 文件路径
+    import argparse
+    parser = argparse.ArgumentParser(description='分析 Recipe extraction 失败的查询')
+    parser.add_argument('--csv', default='gremlin_query_errors_20250928_030206.csv',
+                       help='CSV 文件路径(默认:gremlin_query_errors_20250928_030206.csv)')
+    args = parser.parse_args()
+    csv_file_path = args.csv

110-140: analyze_query_structure 函数的分析逻辑过于简化

当前的查询结构分析仅使用字符串搜索来检测步骤类型(如 'g.call' in query),这可能产生误报(例如,字符串字面量或注释中包含这些模式)。

可选改进:虽然对于快速诊断工具来说当前实现已足够,但如果需要更准确的分析,可以考虑使用正则表达式或实际的 AST 解析来检测步骤类型。例如:

import re

def analyze_query_structure(query: str):
    """分析查询的结构,帮助理解为什么提取失败"""
    print(f"\n=== 查询结构分析 ===")
    print(f"查询长度: {len(query)}")
    
    # 使用正则表达式更精确地匹配 Gremlin 步骤
    steps = []
    if re.search(r'\bg\.call\s*\(', query):
        steps.append('call')
    if re.search(r'\bg\.V\s*\(', query):
        steps.append('V')
    if re.search(r'\bg\.E\s*\(', query):
        steps.append('E')
    if re.search(r'\bg\.inject\s*\(', query):
        steps.append('inject')
    
    print(f"检测到的起始步骤: {steps}")
    # ... 其余逻辑
text2gremlin/AST_Text2Gremlin/base/test/test_csv_queries.py (2)

178-186: 多个硬编码路径降低了测试可移植性

测试脚本中硬编码了多个路径(CSV 文件、config.json、schema 文件等),这使得测试难以在不同环境或项目结构下运行。

建议通过命令行参数或配置文件使路径可配置:

 def main():
     """主函数"""
     print("=== Gremlin查询测试脚本 ===")
     print(f"开始时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
     
-    # 配置文件路径
-    csv_file_path = "cypher2gremlin_dataset_thread.csv"
+    # 解析命令行参数
+    import argparse
+    parser = argparse.ArgumentParser(description='测试 CSV 中的 Gremlin 查询')
+    parser.add_argument('--csv', default='cypher2gremlin_dataset_thread.csv',
+                       help='CSV 文件路径')
+    parser.add_argument('--config', help='配置文件路径(默认:自动检测)')
+    parser.add_argument('--schema', help='Schema 文件路径(默认:自动检测)')
+    args = parser.parse_args()
     
+    csv_file_path = args.csv
+    
     # 获取项目根目录路径
     current_dir = os.path.dirname(os.path.abspath(__file__))
     base_root = os.path.dirname(current_dir)  
     project_root = os.path.dirname(base_root)
-    config_path = os.path.join(project_root, 'config.json')
-    schema_path = os.path.join(project_root, 'db_data', 'schema', 'movie_schema.json')
-    data_path = os.path.join(project_root, 'db_data')
+    config_path = args.config or os.path.join(project_root, 'config.json')
+    schema_path = args.schema or os.path.join(project_root, 'db_data', 'schema', 'movie_schema.json')
+    data_path = os.path.join(project_root, 'db_data')

43-77: 考虑复用 check_gremlin_syntax 函数

check_gremlin_syntax 函数的实现很清晰且可复用。考虑将其也提取到共享的 test_utils.py 模块中,因为语法检查在多个测试场景中都很有用。

可以将此函数与 SyntaxErrorListener 一起移到 test_utils.py 中:

# text2gremlin/AST_Text2Gremlin/base/test/test_utils.py

def check_gremlin_syntax(query_string: str) -> tuple[bool, str]:
    """
    检查给定的Gremlin查询语句的语法。
    
    Args:
        query_string: The Gremlin query to check.
        
    Returns:
        A tuple containing:
        - bool: True if syntax is correct, False otherwise.
        - str: An error message if syntax is incorrect, or "Syntax OK" if correct.
    """
    # ... 当前实现

然后在测试文件中导入使用。

text2gremlin/AST_Text2Gremlin/base/GremlinExpr.py (3)

11-13: 改进前向声明以避免循环导入

当前第13行的字符串字面量 'Step' 不是有效的前向声明。建议使用 typing.TYPE_CHECKING 和条件导入来正确处理循环依赖。

应用此差异:

 from typing import Any, List
 
-# 由于 AnonymousTraversal 包含 Step 对象,而 Step 将在 GremlinParse 中定义,
-# 而 GremlinParse 又导入了本文件,因此使用前向声明避免循环导入问题。
-'Step'
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from .GremlinParse import Step

然后将第61行的类型注解更新为正常引用:

-    self.steps: List['Step'] = []
+    self.steps: List[Step] = []

15-49: 考虑合并 Predicate 和 TextPredicate 类以减少重复

PredicateTextPredicate 类的实现几乎完全相同,仅在 __repr__ 中的前缀不同(P. vs TextP.)。建议使用单一类并通过参数控制前缀,或使用继承来减少代码重复。

可选方案1:使用单一类和前缀参数

class Predicate:
    def __init__(self, operator: str, value: Any, prefix: str = "P"):
        self.operator = operator
        self.value = value
        self.prefix = prefix
    
    def __repr__(self) -> str:
        return f"{self.prefix}.{self.operator}({repr(self.value)})"

# 使用时
text_pred = Predicate("startingWith", "mark", prefix="TextP")

可选方案2:使用继承

class Predicate:
    prefix = "P"
    
    def __init__(self, operator: str, value: Any):
        self.operator = operator
        self.value = value
    
    def __repr__(self) -> str:
        return f"{self.prefix}.{self.operator}({repr(self.value)})"

class TextPredicate(Predicate):
    prefix = "TextP"

67-69: 增强 AnonymousTraversal 的 repr 健壮性

self.steps 为空时,__repr__ 会返回 "__." 这可能不是期望的行为。建议添加空列表检查。

 def __repr__(self) -> str:
+    if not self.steps:
+        return "__"
     step_reprs = ".".join(map(repr, self.steps))
     return f"__.{step_reprs}"
text2gremlin/AST_Text2Gremlin/base/Schema.py (2)

61-86: 改进 CSV 解析的错误处理和日志记录

当前 _parse_custom_csv 方法捕获 FileNotFoundErrorIndexError,但可能还有其他异常(如编码错误、CSV格式错误)会导致静默失败。建议:

  1. 捕获更广泛的异常类型
  2. 使用 logging 模块而非 print
  3. 考虑在严重错误时抛出异常而非返回空 DataFrame
+import logging
+
 def _parse_custom_csv(self, file_path: str, header_line_index: int) -> pd.DataFrame:
     """解析自定义多行表头的 CSV 文件。"""
     try:
         with open(file_path, 'r', encoding='utf-8') as f:
             lines = f.readlines()
         
+        if header_line_index > len(lines):
+            logging.warning(f"header_line_index {header_line_index} 超出文件行数: {file_path}")
+            return pd.DataFrame()
+        
         # 从第二行解析列名
         header_line = lines[header_line_index - 1]
         column_defs = header_line.strip().split(',')
         column_names = [d.split(':')[0] for d in column_defs]
 
         # 从指定header行之后开始读取数据
         data_lines = lines[header_line_index:]
         
         if not data_lines:
             return pd.DataFrame(columns=column_names)
 
         # 使用pandas从内存中的字符串列表读取数据
         from io import StringIO
         csv_data = StringIO("".join(data_lines))
         df = pd.read_csv(csv_data, header=None, names=column_names)
         return df
 
-    except (FileNotFoundError, IndexError) as e:
-        print(f"警告: 读取或解析文件失败: {file_path}, 错误: {e}")
+    except (FileNotFoundError, IndexError, UnicodeDecodeError, pd.errors.ParserError) as e:
+        logging.warning(f"读取或解析文件失败: {file_path}, 错误: {e}")
         return pd.DataFrame()

152-184: 控制随机种子以提高可测试性

get_instances 方法使用 random.randintdf.sample,但没有提供控制随机种子的机制。这使得测试和调试变得困难。建议添加可选的 random_state 参数。

-def get_instances(self, label: str, count: int = None) -> List[Dict]:
+def get_instances(self, label: str, count: int = None, random_state: int = None) -> List[Dict]:
     """获取多个实例
     
     Args:
         label: 标签名
         count: 要获取的实例数量,如果为None则随机选择2-5个
+        random_state: 随机种子,用于可重现的结果
         
     Returns:
         实例列表
     """
     import random
     
     is_edge = label in self.edges
     data_cache = self.edge_data if is_edge else self.vertex_data
     load_func = self._load_edge_data if is_edge else self._load_vertex_data
     
     if label not in data_cache: 
         load_func(label)
     
     df = data_cache.get(label)
     if df is None or df.empty:
         return []
     
     # 如果没有指定数量,随机选择2-5个
     if count is None:
+        if random_state is not None:
+            random.seed(random_state)
         count = random.randint(2, 5)
     
     # 如果实际数据量小于要求的数量,就全部取出
     actual_count = min(count, len(df))
     
     # 随机采样
-    sampled_df = df.sample(actual_count)
+    sampled_df = df.sample(actual_count, random_state=random_state)
     return sampled_df.to_dict('records')
text2gremlin/AST_Text2Gremlin/base/GremlinBase.py (3)

131-156: 增强 get_token_desc 的参数验证和错误处理

当前方法的异常处理(第153行)捕获 IndexErrorKeyError,但没有记录导致错误的具体参数信息,这使得调试变得困难。此外,应验证 token_key 的类型。

+import logging
+
 def get_token_desc(self, token_key: str, *args) -> str:
     """
     根据 token 和参数获取一个随机的、格式化后的中文描述。
     """
+    if not isinstance(token_key, str):
+        logging.warning(f"token_key 应为字符串类型,实际为: {type(token_key)}")
+        return ""
+    
     key = token_key.upper()
     if key in self.token_dict:
         index = self.token_dict[key]
         # 随机选择一个模板
         selected_template = random.choice(self.template[index])
         try:
             # 翻译参数中的schema术语
             translated_args = []
             for arg in args:
                 if isinstance(arg, str):
                     # 尝试翻译schema术语
                     translated_arg = self.get_schema_desc(arg)
                     translated_args.append(translated_arg)
                 else:
                     translated_args.append(arg)
             
             # 使用翻译后的参数格式化模板
             return selected_template.format(*translated_args)
-        except (IndexError, KeyError):
+        except (IndexError, KeyError) as e:
+            logging.debug(f"模板格式化失败 - token: {token_key}, 模板: {selected_template}, 参数: {args}, 错误: {e}")
             # 如果参数数量不匹配,返回原始模板
             return selected_template
     return "" # 如果 token 不存在,返回空字符串

85-129: 考虑将翻译模板外部化以提高可维护性

当前翻译模板硬编码在 _initialize_translation_templates 方法中。随着支持的 Gremlin 步骤增加,这个方法会变得冗长。建议将模板移至外部 JSON 或 YAML 文件中。

创建 template/translation_templates.json:

{
  "v": ["查询图中的所有顶点", "获取所有节点"],
  "e": ["查询图中的所有边", "获取所有关系"],
  "out": ["从当前位置出发,沿着 '{}' 方向的出边前进", "找到 '{}' 类型的邻居"]
}

然后修改方法:

def _initialize_translation_templates(self):
    """初始化 Gremlin 步骤的翻译模板。"""
    template_file = os.path.join(
        os.path.dirname(__file__), 
        'template', 
        'translation_templates.json'
    )
    
    if os.path.exists(template_file):
        with open(template_file, 'r', encoding='utf-8') as f:
            templates_data = json.load(f)
    else:
        # 回退到硬编码模板
        templates_data = { ... }
    
    for index, (key, value) in enumerate(templates_data.items()):
        self.token_dict[key.upper()] = index
        self.template.append(value)

55-56: 细化异常处理以避免隐藏配置错误

第55行捕获所有异常并仅打印信息日志。如果配置方法存在但抛出了严重错误(如权限问题、配置损坏),这种处理方式可能会隐藏问题。

     try:
         if hasattr(self.config, 'get_schema_dict_path'):
             schema_dict_paths = self.config.get_schema_dict_path()
             if isinstance(schema_dict_paths, list):
                 file_paths.extend(schema_dict_paths)
             elif isinstance(schema_dict_paths, str):
                 file_paths.append(schema_dict_paths)
         
         if hasattr(self.config, 'get_syn_dict_path'):
             syn_dict_path = self.config.get_syn_dict_path()
             if syn_dict_path:
                 file_paths.append(syn_dict_path)
                 
-    except Exception as e:
-        print(f"[INFO] Config paths not available: {e}")
+    except AttributeError as e:
+        print(f"[INFO] Config methods not available: {e}")
+    except Exception as e:
+        print(f"[WARNING] Unexpected error loading config paths: {e}")
+        raise
text2gremlin/AST_Text2Gremlin/base/GremlinTransVisitor.py (3)

25-53: 改进错误处理粒度

parse_and_visit 方法捕获了所有异常并返回 None,这使得调用方难以区分不同类型的错误(例如语法错误 vs 系统错误)。

考虑细化错误处理:

 def parse_and_visit(self, query_string: str):
     try:
         self.traversal = Traversal()
         
         input_stream = InputStream(query_string)
         lexer = GremlinLexer(input_stream)
         stream = CommonTokenStream(lexer)
         parser = GremlinParser(stream)
-        # 【修正】使用queryList作为入口规则,它包含一个或多个query
         tree = parser.queryList()
         
-        # Visit the parse tree - 访问第一个query
         result = self.visit(tree.query(0))
         
         return result if result else self.traversal
         
+    except RecognitionException as e:
+        print(f"Syntax error parsing query '{query_string}': {e}")
+        return None
+    except AttributeError as e:
+        print(f"Query structure error '{query_string}': {e}")
+        return None
     except Exception as e:
         print(f"Error parsing query '{query_string}': {e}")
         return None

111-155: 考虑提取重复的参数处理逻辑

多个 has 方法变体(lines 111-155)使用了相似的参数提取模式。

考虑提取公共辅助方法:

def _extract_has_params(self, ctx):
    """提取 has 方法的通用参数"""
    params = []
    if hasattr(ctx, 'stringNullableLiteral') and ctx.stringNullableLiteral():
        params.append(self.visit(ctx.stringNullableLiteral()))
    if hasattr(ctx, 'stringNullableArgument') and ctx.stringNullableArgument():
        params.append(self.visit(ctx.stringNullableArgument()))
    if hasattr(ctx, 'genericArgument') and ctx.genericArgument():
        params.append(self.visit(ctx.genericArgument()))
    if hasattr(ctx, 'traversalPredicate') and ctx.traversalPredicate():
        params.append(self.visit(ctx.traversalPredicate()))
    if hasattr(ctx, 'nestedTraversal') and ctx.nestedTraversal():
        params.append(self.visit(ctx.nestedTraversal()))
    if hasattr(ctx, 'traversalT') and ctx.traversalT():
        params.append(self.visit(ctx.traversalT()))
    return params

971-1390: 建议将测试代码移至专用测试文件

__main__ 块中包含了 400+ 行的综合测试代码(lines 971-1390)。虽然测试覆盖很全面,但这些代码应该移至专门的测试文件中(如 test_gremlin_trans_visitor.py),以保持主模块的简洁性。

创建新文件 text2gremlin/AST_Text2Gremlin/base/test/test_gremlin_trans_visitor_comprehensive.py 并将测试代码移至其中:

# test/test_gremlin_trans_visitor_comprehensive.py
import unittest
from GremlinTransVisitor import GremlinTransVisitor, parse_gremlin_query
from GremlinParse import Traversal
from GremlinExpr import Predicate, TextPredicate, AnonymousTraversal

class TestGremlinTransVisitorComprehensive(unittest.TestCase):
    def setUp(self):
        self.visitor = GremlinTransVisitor()
    
    def test_spawn_methods(self):
        # 将现有的测试类别转换为单元测试
        ...

if __name__ == '__main__':
    unittest.main()

在主模块中保留简单的演示示例即可。

text2gremlin/AST_Text2Gremlin/base/generator.py (3)

165-168: 考虑将警告阈值配置化

硬编码的警告阈值(5000 条生成查询,0 条新查询)可能需要根据不同场景调整。

将阈值移至配置文件或函数参数:

 def generate_corpus_from_template(
     template_string: str,
     config: Config,
     schema: Schema,
     gremlin_base: GremlinBase,
-    global_corpus_dict: dict
+    global_corpus_dict: dict,
+    large_generation_threshold: int = 5000
 ) -> tuple[int, dict]:
     ...
-    if stats['generated_count'] > 5000:
+    if stats['generated_count'] > large_generation_threshold:
         stats['warning'] = f'由于本条模版的Recip复杂,生成了大量查询({stats["generated_count"]}条)'

494-498: 增强 Gremlin 查询格式验证

当前仅检查查询是否以 g. 开头(line 495),这可能不足以捕获所有格式错误。

考虑使用 check_gremlin_syntax 进行预验证:

                     # 基本语法检查
                     if not gremlin_query.startswith('g.'):
                         stats['failed_loads'] += 1
                         stats['failed_queries'].append(f"第{row_num}行: 格式错误")
                         continue
+                    
+                    # 可选:进行完整语法检查(可能影响加载性能)
+                    # is_valid, error_msg = check_gremlin_syntax(gremlin_query)
+                    # if not is_valid:
+                    #     stats['failed_loads'] += 1
+                    #     stats['failed_queries'].append(f"第{row_num}行: {error_msg}")
+                    #     continue
                     
                     templates.append(gremlin_query)

518-518: 将 CSV 文件路径配置化

CSV 文件路径硬编码为 "cypher2gremlin_dataset.csv"(line 518)。

建议通过命令行参数或配置文件指定:

+import argparse

 if __name__ == '__main__':
+    parser = argparse.ArgumentParser(description='Generate Gremlin corpus from templates')
+    parser.add_argument('--csv', default='cypher2gremlin_dataset.csv', 
+                       help='Path to CSV file containing templates')
+    parser.add_argument('--output', default='generated_corpus.json',
+                       help='Output file path')
+    args = parser.parse_args()
+    
-    csv_file_path = "cypher2gremlin_dataset.csv"
+    csv_file_path = args.csv
     
     print(f"🔄 从 {csv_file_path} 加载Gremlin查询模板...")
     templates, load_stats = load_templates_from_csv(csv_file_path)
     ...
-        result = generate_corpus_from_templates(templates)
+        result = generate_corpus_from_templates(templates, output_file=args.output)
text2gremlin/AST_Text2Gremlin/base/TraversalGenerator.py (2)

43-77: 考虑将随机值生成参数配置化

随机值生成使用了硬编码的参数:

  • 字符串长度:5-8 个字符(lines 51, 71)
  • 整数范围:1-10000(lines 53, 73)
  • 值数量:2-5 个(line 59)

考虑通过配置文件或类参数使这些值可配置:

class TraversalGenerator:
    def __init__(self, schema: Schema, recipe: Traversal, gremlin_base: GremlinBase,
                 string_length_range: Tuple[int, int] = (5, 8),
                 int_value_range: Tuple[int, int] = (1, 10000),
                 instance_count_range: Tuple[int, int] = (2, 5)):
        self.schema = schema
        self.recipe = recipe
        self.gremlin_base = gremlin_base
        self.generated_pairs: Set[Tuple[str, str]] = set()
        self.string_length_range = string_length_range
        self.int_value_range = int_value_range
        self.instance_count_range = instance_count_range

319-373: 增强概率和参数应配置化

增强方法中硬编码了多个概率值和参数范围:

  • limit 概率: 40%(line 324)
  • range 概率: 20%(line 335)
  • sample 概率: 30%(line 347)
  • dedup 概率: 30%(line 357)
  • order 概率: 20%(line 363)
  • 各种数值范围(lines 327-341)

考虑创建配置类来管理这些参数:

@dataclass
class EnhancementConfig:
    """增强配置参数"""
    limit_probability: float = 0.4
    range_probability: float = 0.2
    sample_probability: float = 0.3
    dedup_probability: float = 0.3
    order_probability: float = 0.2
    
    limit_common_values: List[int] = field(default_factory=lambda: [1, 3, 5, 10, 20, 50, 100])
    limit_max_random: int = 200
    
    # ... 其他参数

class TraversalGenerator:
    def __init__(self, schema: Schema, recipe: Traversal, gremlin_base: GremlinBase,
                 enhancement_config: EnhancementConfig = None):
        ...
        self.enhancement_config = enhancement_config or EnhancementConfig()
text2gremlin/AST_Text2Gremlin/base/gremlin/GremlinVisitor.py (2)

1-1: 自动生成文件中暴露了绝对路径。

第 1 行的注释包含开发者的本地绝对路径 /root/lzj/ospp/Gremlin_Antlr4/Gremlin.g4。虽然这是 ANTLR 生成代码的标准输出,但建议在文档中说明生成步骤,以便其他贡献者可以重新生成此文件而不会混淆路径。


10-10: 考虑为访问器模式添加文档说明。

GremlinVisitor 是 ANTLR 生成的基础访问器类,作为 GremlinTransVisitor(在 PR 的其他文件中)的父类。对于不熟悉 ANTLR 访问器模式的维护者,建议在模块或 README 中添加简短说明:

  • 访问器模式的作用(遍历语法树)
  • 如何扩展此类(重写特定的 visitXxx 方法)
  • GremlinTransVisitor 的关系
  • 示例:如何使用访问器解析 Gremlin 查询

需要我生成一个文档模板或使用示例吗?

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9e76c2a and b14ffb3.

⛔ Files ignored due to path filters (19)
  • text2gremlin/AST_Text2Gremlin/base/cypher2gremlin_dataset.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/base/gremlin/antlr-4.13.1-complete.jar is excluded by !**/*.jar
  • text2gremlin/AST_Text2Gremlin/base/test/cypher2gremlin_dataset_thread.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/base/test/gremlin_query_errors_20250928_014705_pre.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/base/test/gremlin_query_errors_20250928_030206.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/base/test/recipe_extraction_detailed_failures_20250928_031211.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/db_data/movie/raw_data/edge_acted_in.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/db_data/movie/raw_data/edge_directed.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/db_data/movie/raw_data/edge_has_genre.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/db_data/movie/raw_data/edge_has_keyword.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/db_data/movie/raw_data/edge_is_friend.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/db_data/movie/raw_data/edge_produce.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/db_data/movie/raw_data/edge_rate.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/db_data/movie/raw_data/edge_write.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/db_data/movie/raw_data/vertex_genre.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/db_data/movie/raw_data/vertex_keyword.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/db_data/movie/raw_data/vertex_movie.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/db_data/movie/raw_data/vertex_person.csv is excluded by !**/*.csv
  • text2gremlin/AST_Text2Gremlin/db_data/movie/raw_data/vertex_user.csv is excluded by !**/*.csv
📒 Files selected for processing (21)
  • text2gremlin/AST_Text2Gremlin/README.md (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/Config.py (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/GremlinBase.py (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/GremlinExpr.py (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/GremlinParse.py (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/GremlinTransVisitor.py (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/Schema.py (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/TraversalGenerator.py (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/generator.py (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/gremlin/Gremlin.tokens (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/gremlin/GremlinLexer.tokens (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/gremlin/GremlinVisitor.py (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/template/schema_dict.txt (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/template/syn_dict.txt (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/test/analyze_line73_explosion.py (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/test/combination_explosion_report.md (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/test/test_csv_queries.py (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/test/test_generator.py (1 hunks)
  • text2gremlin/AST_Text2Gremlin/base/test/test_recipe_extraction_failures.py (1 hunks)
  • text2gremlin/AST_Text2Gremlin/config.json (1 hunks)
  • text2gremlin/AST_Text2Gremlin/db_data/schema/movie_schema.json (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
PR: hugegraph/hugegraph-ai#0
File: hugegraph-llm/AGENTS.md:0-0
Timestamp: 2025-09-16T06:40:44.968Z
Learning: Applies to hugegraph-llm/src/hugegraph_llm/operators/gremlin_generate_task.py : Maintain the Text2Gremlin pipeline in src/hugegraph_llm/operators/gremlin_generate_task.py
🧬 Code graph analysis (8)
text2gremlin/AST_Text2Gremlin/base/GremlinParse.py (1)
text2gremlin/AST_Text2Gremlin/base/GremlinExpr.py (4)
  • Predicate (15-30)
  • AnonymousTraversal (51-69)
  • TextPredicate (33-48)
  • Connector (72-88)
text2gremlin/AST_Text2Gremlin/base/test/test_recipe_extraction_failures.py (4)
text2gremlin/AST_Text2Gremlin/base/GremlinTransVisitor.py (1)
  • GremlinTransVisitor (21-955)
text2gremlin/AST_Text2Gremlin/base/GremlinParse.py (1)
  • Traversal (42-70)
text2gremlin/AST_Text2Gremlin/base/test/test_csv_queries.py (2)
  • SyntaxErrorListener (30-41)
  • main (172-254)
text2gremlin/AST_Text2Gremlin/base/test/analyze_line73_explosion.py (1)
  • main (185-227)
text2gremlin/AST_Text2Gremlin/base/test/test_generator.py (1)
text2gremlin/AST_Text2Gremlin/base/generator.py (1)
  • generate_corpus_from_templates (179-324)
text2gremlin/AST_Text2Gremlin/base/generator.py (5)
text2gremlin/AST_Text2Gremlin/base/Schema.py (1)
  • Schema (17-184)
text2gremlin/AST_Text2Gremlin/base/GremlinBase.py (1)
  • GremlinBase (12-187)
text2gremlin/AST_Text2Gremlin/base/GremlinParse.py (1)
  • Traversal (42-70)
text2gremlin/AST_Text2Gremlin/base/TraversalGenerator.py (1)
  • TraversalGenerator (19-417)
text2gremlin/AST_Text2Gremlin/base/GremlinTransVisitor.py (2)
  • GremlinTransVisitor (21-955)
  • parse_and_visit (25-53)
text2gremlin/AST_Text2Gremlin/base/GremlinTransVisitor.py (4)
text2gremlin/AST_Text2Gremlin/base/gremlin/GremlinParser.py (2)
  • GremlinParser (1481-32734)
  • queryList (2356-2400)
text2gremlin/AST_Text2Gremlin/base/gremlin/GremlinVisitor.py (1)
  • GremlinVisitor (10-2084)
text2gremlin/AST_Text2Gremlin/base/GremlinParse.py (2)
  • Traversal (42-70)
  • Step (13-40)
text2gremlin/AST_Text2Gremlin/base/GremlinExpr.py (5)
  • Predicate (15-30)
  • TextPredicate (33-48)
  • AnonymousTraversal (51-69)
  • Connector (72-88)
  • Terminal (91-104)
text2gremlin/AST_Text2Gremlin/base/test/analyze_line73_explosion.py (4)
text2gremlin/AST_Text2Gremlin/base/GremlinTransVisitor.py (2)
  • GremlinTransVisitor (21-955)
  • parse_and_visit (25-53)
text2gremlin/AST_Text2Gremlin/base/TraversalGenerator.py (1)
  • TraversalGenerator (19-417)
text2gremlin/AST_Text2Gremlin/base/Schema.py (3)
  • Schema (17-184)
  • get_vertex_labels (99-100)
  • get_edge_labels (102-103)
text2gremlin/AST_Text2Gremlin/base/GremlinBase.py (1)
  • GremlinBase (12-187)
text2gremlin/AST_Text2Gremlin/base/test/test_csv_queries.py (4)
text2gremlin/AST_Text2Gremlin/base/Schema.py (1)
  • Schema (17-184)
text2gremlin/AST_Text2Gremlin/base/TraversalGenerator.py (1)
  • TraversalGenerator (19-417)
text2gremlin/AST_Text2Gremlin/base/GremlinTransVisitor.py (2)
  • GremlinTransVisitor (21-955)
  • parse_and_visit (25-53)
text2gremlin/AST_Text2Gremlin/base/test/test_recipe_extraction_failures.py (2)
  • SyntaxErrorListener (24-35)
  • syntaxError (32-35)
text2gremlin/AST_Text2Gremlin/base/TraversalGenerator.py (4)
text2gremlin/AST_Text2Gremlin/base/Schema.py (9)
  • Schema (17-184)
  • get_instance (147-150)
  • get_instances (152-184)
  • get_vertex_creation_info (131-135)
  • get_properties_with_type (105-107)
  • get_valid_steps (109-122)
  • get_step_result_label (124-129)
  • get_vertex_labels (99-100)
  • get_updatable_properties (141-145)
text2gremlin/AST_Text2Gremlin/base/GremlinParse.py (2)
  • Traversal (42-70)
  • Step (13-40)
text2gremlin/AST_Text2Gremlin/base/GremlinExpr.py (1)
  • Predicate (15-30)
text2gremlin/AST_Text2Gremlin/base/GremlinBase.py (2)
  • GremlinBase (12-187)
  • get_schema_desc (179-187)
🪛 markdownlint-cli2 (0.18.1)
text2gremlin/AST_Text2Gremlin/base/test/combination_explosion_report.md

49-49: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


68-68: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

text2gremlin/AST_Text2Gremlin/README.md

49-49: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


68-68: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: build (3.11)
  • GitHub Check: build (3.10)
🔇 Additional comments (18)
text2gremlin/AST_Text2Gremlin/base/GremlinParse.py (1)

13-70: 数据结构设计合理。

StepTraversal 类的设计简洁清晰,文档完善。类型注解准确,__repr__ 方法实现良好,便于调试。这两个类为后续的 Gremlin 查询解析和生成奠定了良好的基础。

text2gremlin/AST_Text2Gremlin/db_data/schema/movie_schema.json (2)

1-316: Schema 定义结构良好。

整体 schema 定义清晰完整,涵盖了电影领域的主要实体和关系。类型定义准确,主键、可选字段和索引标记使用恰当。CSV 文件映射详细,包含了必要的 SRC_ID 和 DST_ID 信息。这为数据加载和查询生成提供了坚实的基础。


236-241: 未在 Schema.py 中发现对 “SKIP” 列的处理逻辑,请手动确认 CSV 加载器是否支持该跳过列的语法,或在文档中说明此自定义约定。

text2gremlin/AST_Text2Gremlin/base/test/combination_explosion_report.md (1)

1-129: 文档内容质量很高

这份分析报告非常详细和专业,清晰地解释了组合爆炸的原因、约束机制以及优化建议。文档结构良好,数学计算准确,对理解系统行为很有帮助。

text2gremlin/AST_Text2Gremlin/base/gremlin/GremlinLexer.tokens (1)

1-533: 自动生成的词法分析器令牌文件

这是一个由 ANTLR 自动生成的令牌定义文件,包含 270 个令牌定义,涵盖 Gremlin 查询语言的所有关键字、操作符和字面量。文件格式符合 ANTLR 标准,无需手动修改。

注意事项:

  • 此文件应由 ANTLR 工具重新生成,而不是手动编辑
  • 确保与对应的 .g4 语法文件保持同步
  • 建议在 .gitattributes 中标记为自动生成文件
text2gremlin/AST_Text2Gremlin/base/test/test_recipe_extraction_failures.py (1)

63-108: 测试函数的错误处理逻辑清晰完善

test_recipe_extraction 函数很好地处理了多种失败场景(语法错误、空 recipe、无步骤等),并提供了详细的错误信息。异常捕获和堆栈跟踪也有助于调试。

text2gremlin/AST_Text2Gremlin/base/test/test_csv_queries.py (2)

79-127: 测试编排逻辑设计良好

test_single_query 函数很好地编排了完整的测试流程:语法检查 → Recipe 提取 → 泛化生成 → 生成查询的语法验证。错误处理全面,返回值清晰,有助于调试。


244-252: 错误统计逻辑为调试提供了有价值的洞察

按错误类型分组统计的逻辑有助于快速识别最常见的失败模式,对于改进生成系统非常有用。

text2gremlin/AST_Text2Gremlin/base/GremlinBase.py (1)

12-28: 代码逻辑正确,初始化流程清晰

__init__ 方法正确地按顺序初始化了配置、规则名、翻译模板和字典。加载顺序合理,确保了依赖关系的正确处理。

text2gremlin/AST_Text2Gremlin/base/Schema.py (1)

68-70: 验证列定义解析的健壮性并修正检查脚本

第70行 d.split(':')[0] 假定每个定义都包含冒号,建议改为只分割第一个冒号并做防御性检查:

column_names = [d.split(':', 1)[0] if ':' in d else d for d in column_defs]

同时,原示例脚本因 -x sh -c 不支持 if ! 语法而失败,建议改为使用 bash 并以兼容写法验证 CSV:

#!/usr/bin/env bash
fd -e csv -x bash -c '
  echo "检查文件: {}"
  head -n 2 {} | tail -n 1 | tr "," "\n" | while IFS= read -r col; do
    if echo "$col" | grep -q ":"; then
      :
    else
      echo "  警告: 列定义缺少冒号: $col"
    fi
  done
'

请使用上述脚本验证所有 CSV 文件,确保列定义格式一致。

text2gremlin/AST_Text2Gremlin/base/GremlinTransVisitor.py (3)

88-165: LGTM - Spawn 和导航方法实现正确

Spawn 方法(V, E, addV, addE, inject, io, call)和导航方法(out, in, both, outE, inE, bothE, outV, inV, bothV)的实现逻辑正确,正确处理了各种参数变体。


280-302: LGTM - 嵌套遍历的状态管理实现正确

visitNestedTraversal 方法正确地保存和恢复了遍历状态,避免了状态污染。这种临时遍历的方式是处理匿名遍历的标准做法。


8-19: 确认相对导入路径正确

所有 gremlin.* 和本地模块的文件均存在于 text2gremlin/AST_Text2Gremlin/base 目录下,可正常解析,无需调整。

text2gremlin/AST_Text2Gremlin/base/generator.py (1)

26-73: LGTM - 语法检查实现正确

SyntaxErrorListenercheck_gremlin_syntax 的实现正确捕获了 ANTLR 解析错误,为后续的语法验证提供了可靠的基础。

text2gremlin/AST_Text2Gremlin/base/TraversalGenerator.py (2)

19-41: LGTM - 生成器初始化和入口方法设计合理

使用 Set[Tuple[str, str]] 进行去重是正确的选择,generate 方法作为公共 API 入口点设计清晰。


154-188: LGTM - 导航步骤的泛化逻辑实现优秀

导航步骤(out/in/both)的处理逻辑正确实现了配方泛化:

  1. 优先使用配方中指定的边标签(lines 159-168)
  2. 同时生成其他可能的边变体(lines 170-178)
  3. 正确更新结果标签和类型

这种设计很好地平衡了忠实度和多样性。

text2gremlin/AST_Text2Gremlin/base/gremlin/Gremlin.tokens (1)

1-532: ANTLR生成的tokens文件 - 避免手动修改

此文件定义了Gremlin词法分析器使用的完整token集合(267个关键字token + 标点符号token + 字面量token)。这类文件通常由ANTLR从语法文件(.g4)自动生成,包含token的数值映射和字符串表示。

注意事项:

  • 如果此文件是自动生成的,应避免手动修改,所有更改应通过修改源语法文件并重新生成来完成
  • 确保与GremlinLexer.tokens和语法定义保持同步
  • Token数值的连续性和唯一性对解析器正确运行至关重要
text2gremlin/AST_Text2Gremlin/base/gremlin/GremlinVisitor.py (1)

2088-2088: 命名空间清理处理得当。

使用 del GremlinParser 清理模块命名空间是良好实践,确保此模块只公开 GremlinVisitor 类,符合 ANTLR 生成代码的标准模式。

Comment thread text2gremlin/AST_Text2Gremlin/base/Config.py Outdated
Comment thread text2gremlin/AST_Text2Gremlin/base/Config.py Outdated
Comment thread text2gremlin/AST_Text2Gremlin/base/generator.py Outdated
Comment on lines +393 to +452
if __name__ == '__main__':
# templates = [
# # === 查询操作 (Query) - 40% ===

# # 基础查询
# "g.V().has('name', 'John')",
# "g.V().has('title', 'The Matrix')",
# "g.V().has('born', 1961)",
# "g.V().hasLabel('person')",
# "g.V().hasLabel('movie')",

# # 导航查询
# "g.V().has('name', 'Laurence Fishburne').out('acted_in')",
# "g.V().has('title', 'The Matrix').in('acted_in')",
# "g.V().hasLabel('person').out('directed')",
# "g.V().hasLabel('movie').in('rate')",

# # 复杂查询
# "g.V().has('name', 'Laurence Fishburne').out('acted_in').has('title', 'The Matrix')",
# "g.V().hasLabel('person').out('acted_in').in('rate')",
# "g.V().has('title', 'Matrix').in('acted_in').out('directed')",

# # === 创建操作 (Create) - 25% ===

# # 基础创建
# "g.addV('person')",
# "g.addV('movie')",
# "g.addV('user')",

# # 带属性创建
# "g.addV('person').property('name', 'New Actor')",
# "g.addV('movie').property('title', 'New Movie')",
# "g.addV('person').property('name', 'Jane').property('born', 1990)",
# "g.addV('movie').property('title', 'Test Movie').property('duration', 120)",
# "g.addV('user').property('login', 'newuser').property('name', 'New User')",

# # === 更新操作 (Update) - 25% ===

# # 单属性更新
# "g.V().has('name', 'John').property('born', 1990)",
# "g.V().has('title', 'Test').property('duration', 120)",
# "g.V().hasLabel('person').has('name', 'Jane').property('born', 1985)",
# "g.V().hasLabel('movie').has('title', 'Old Movie').property('rated', 'PG-13')",

# # 多属性更新
# "g.V().has('name', 'John').property('born', 1990).property('poster_image', 'new_url')",
# "g.V().has('title', 'Test').property('duration', 150).property('rated', 'R')",
# "g.V().hasLabel('user').has('login', 'testuser').property('name', 'Updated Name').property('born', 1995)",

# # === 删除操作 (Delete) - 10% ===

# # 基础删除
# "g.V().has('name', 'temp_person').drop()",
# "g.V().has('title', 'temp_movie').drop()",
# "g.V().hasLabel('user').has('login', 'temp_user').drop()",

# # 条件删除
# "g.V().hasLabel('person').has('born', 0).drop()",
# "g.V().hasLabel('movie').has('duration', 0).drop()",
# ]
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

清理或文档化注释掉的模板列表

60 行注释掉的模板列表(lines 394-452)占用了大量空间。

选项 1:如果这些模板仍然有用,将它们移至独立的示例文件:

# examples/sample_templates.py
SAMPLE_TEMPLATES = [
    # 查询操作
    "g.V().has('name', 'John')",
    ...
]

选项 2:如果不再需要,直接删除这些注释。

🤖 Prompt for AI Agents
In text2gremlin/AST_Text2Gremlin/base/generator.py around lines 393 to 452 there
is a large block of 60 commented-out template strings that clutter the file;
either extract them into a separate example file (e.g.,
examples/sample_templates.py as a SAMPLE_TEMPLATES list and import or reference
it) or remove them entirely if unused; implement the extraction by creating the
new module containing the templates and replacing the commented block with a
short comment and an import/use note, or simply delete the commented templates
if they are obsolete.

Comment on lines +8 to +2085
# This class defines a complete generic visitor for a parse tree produced by GremlinParser.

class GremlinVisitor(ParseTreeVisitor):

# Visit a parse tree produced by GremlinParser#queryList.
def visitQueryList(self, ctx:GremlinParser.QueryListContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#query.
def visitQuery(self, ctx:GremlinParser.QueryContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#emptyQuery.
def visitEmptyQuery(self, ctx:GremlinParser.EmptyQueryContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSource.
def visitTraversalSource(self, ctx:GremlinParser.TraversalSourceContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#transactionPart.
def visitTransactionPart(self, ctx:GremlinParser.TransactionPartContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#rootTraversal.
def visitRootTraversal(self, ctx:GremlinParser.RootTraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSelfMethod.
def visitTraversalSourceSelfMethod(self, ctx:GremlinParser.TraversalSourceSelfMethodContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSelfMethod_withBulk.
def visitTraversalSourceSelfMethod_withBulk(self, ctx:GremlinParser.TraversalSourceSelfMethod_withBulkContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSelfMethod_withPath.
def visitTraversalSourceSelfMethod_withPath(self, ctx:GremlinParser.TraversalSourceSelfMethod_withPathContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSelfMethod_withSack.
def visitTraversalSourceSelfMethod_withSack(self, ctx:GremlinParser.TraversalSourceSelfMethod_withSackContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSelfMethod_withSideEffect.
def visitTraversalSourceSelfMethod_withSideEffect(self, ctx:GremlinParser.TraversalSourceSelfMethod_withSideEffectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSelfMethod_withStrategies.
def visitTraversalSourceSelfMethod_withStrategies(self, ctx:GremlinParser.TraversalSourceSelfMethod_withStrategiesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSelfMethod_withoutStrategies.
def visitTraversalSourceSelfMethod_withoutStrategies(self, ctx:GremlinParser.TraversalSourceSelfMethod_withoutStrategiesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSelfMethod_with.
def visitTraversalSourceSelfMethod_with(self, ctx:GremlinParser.TraversalSourceSelfMethod_withContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod.
def visitTraversalSourceSpawnMethod(self, ctx:GremlinParser.TraversalSourceSpawnMethodContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_addE.
def visitTraversalSourceSpawnMethod_addE(self, ctx:GremlinParser.TraversalSourceSpawnMethod_addEContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_addV.
def visitTraversalSourceSpawnMethod_addV(self, ctx:GremlinParser.TraversalSourceSpawnMethod_addVContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_E.
def visitTraversalSourceSpawnMethod_E(self, ctx:GremlinParser.TraversalSourceSpawnMethod_EContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_V.
def visitTraversalSourceSpawnMethod_V(self, ctx:GremlinParser.TraversalSourceSpawnMethod_VContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_inject.
def visitTraversalSourceSpawnMethod_inject(self, ctx:GremlinParser.TraversalSourceSpawnMethod_injectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_io.
def visitTraversalSourceSpawnMethod_io(self, ctx:GremlinParser.TraversalSourceSpawnMethod_ioContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_mergeV_Map.
def visitTraversalSourceSpawnMethod_mergeV_Map(self, ctx:GremlinParser.TraversalSourceSpawnMethod_mergeV_MapContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_mergeV_Traversal.
def visitTraversalSourceSpawnMethod_mergeV_Traversal(self, ctx:GremlinParser.TraversalSourceSpawnMethod_mergeV_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_mergeE_Map.
def visitTraversalSourceSpawnMethod_mergeE_Map(self, ctx:GremlinParser.TraversalSourceSpawnMethod_mergeE_MapContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_mergeE_Traversal.
def visitTraversalSourceSpawnMethod_mergeE_Traversal(self, ctx:GremlinParser.TraversalSourceSpawnMethod_mergeE_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_call_empty.
def visitTraversalSourceSpawnMethod_call_empty(self, ctx:GremlinParser.TraversalSourceSpawnMethod_call_emptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_call_string.
def visitTraversalSourceSpawnMethod_call_string(self, ctx:GremlinParser.TraversalSourceSpawnMethod_call_stringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_call_string_map.
def visitTraversalSourceSpawnMethod_call_string_map(self, ctx:GremlinParser.TraversalSourceSpawnMethod_call_string_mapContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_call_string_traversal.
def visitTraversalSourceSpawnMethod_call_string_traversal(self, ctx:GremlinParser.TraversalSourceSpawnMethod_call_string_traversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_call_string_map_traversal.
def visitTraversalSourceSpawnMethod_call_string_map_traversal(self, ctx:GremlinParser.TraversalSourceSpawnMethod_call_string_map_traversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSourceSpawnMethod_union.
def visitTraversalSourceSpawnMethod_union(self, ctx:GremlinParser.TraversalSourceSpawnMethod_unionContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#chainedTraversal.
def visitChainedTraversal(self, ctx:GremlinParser.ChainedTraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#nestedTraversal.
def visitNestedTraversal(self, ctx:GremlinParser.NestedTraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#terminatedTraversal.
def visitTerminatedTraversal(self, ctx:GremlinParser.TerminatedTraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod.
def visitTraversalMethod(self, ctx:GremlinParser.TraversalMethodContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_V.
def visitTraversalMethod_V(self, ctx:GremlinParser.TraversalMethod_VContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_E.
def visitTraversalMethod_E(self, ctx:GremlinParser.TraversalMethod_EContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_addE_String.
def visitTraversalMethod_addE_String(self, ctx:GremlinParser.TraversalMethod_addE_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_addE_Traversal.
def visitTraversalMethod_addE_Traversal(self, ctx:GremlinParser.TraversalMethod_addE_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_addV_Empty.
def visitTraversalMethod_addV_Empty(self, ctx:GremlinParser.TraversalMethod_addV_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_addV_String.
def visitTraversalMethod_addV_String(self, ctx:GremlinParser.TraversalMethod_addV_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_addV_Traversal.
def visitTraversalMethod_addV_Traversal(self, ctx:GremlinParser.TraversalMethod_addV_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_aggregate_Scope_String.
def visitTraversalMethod_aggregate_Scope_String(self, ctx:GremlinParser.TraversalMethod_aggregate_Scope_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_aggregate_String.
def visitTraversalMethod_aggregate_String(self, ctx:GremlinParser.TraversalMethod_aggregate_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_all_P.
def visitTraversalMethod_all_P(self, ctx:GremlinParser.TraversalMethod_all_PContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_and.
def visitTraversalMethod_and(self, ctx:GremlinParser.TraversalMethod_andContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_any_P.
def visitTraversalMethod_any_P(self, ctx:GremlinParser.TraversalMethod_any_PContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_as.
def visitTraversalMethod_as(self, ctx:GremlinParser.TraversalMethod_asContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_asDate.
def visitTraversalMethod_asDate(self, ctx:GremlinParser.TraversalMethod_asDateContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_asString_Empty.
def visitTraversalMethod_asString_Empty(self, ctx:GremlinParser.TraversalMethod_asString_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_asString_Scope.
def visitTraversalMethod_asString_Scope(self, ctx:GremlinParser.TraversalMethod_asString_ScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_barrier_Consumer.
def visitTraversalMethod_barrier_Consumer(self, ctx:GremlinParser.TraversalMethod_barrier_ConsumerContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_barrier_Empty.
def visitTraversalMethod_barrier_Empty(self, ctx:GremlinParser.TraversalMethod_barrier_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_barrier_int.
def visitTraversalMethod_barrier_int(self, ctx:GremlinParser.TraversalMethod_barrier_intContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_both.
def visitTraversalMethod_both(self, ctx:GremlinParser.TraversalMethod_bothContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_bothE.
def visitTraversalMethod_bothE(self, ctx:GremlinParser.TraversalMethod_bothEContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_bothV.
def visitTraversalMethod_bothV(self, ctx:GremlinParser.TraversalMethod_bothVContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_branch.
def visitTraversalMethod_branch(self, ctx:GremlinParser.TraversalMethod_branchContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_by_Comparator.
def visitTraversalMethod_by_Comparator(self, ctx:GremlinParser.TraversalMethod_by_ComparatorContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_by_Empty.
def visitTraversalMethod_by_Empty(self, ctx:GremlinParser.TraversalMethod_by_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_by_Function.
def visitTraversalMethod_by_Function(self, ctx:GremlinParser.TraversalMethod_by_FunctionContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_by_Function_Comparator.
def visitTraversalMethod_by_Function_Comparator(self, ctx:GremlinParser.TraversalMethod_by_Function_ComparatorContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_by_Order.
def visitTraversalMethod_by_Order(self, ctx:GremlinParser.TraversalMethod_by_OrderContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_by_String.
def visitTraversalMethod_by_String(self, ctx:GremlinParser.TraversalMethod_by_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_by_String_Comparator.
def visitTraversalMethod_by_String_Comparator(self, ctx:GremlinParser.TraversalMethod_by_String_ComparatorContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_by_T.
def visitTraversalMethod_by_T(self, ctx:GremlinParser.TraversalMethod_by_TContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_by_Traversal.
def visitTraversalMethod_by_Traversal(self, ctx:GremlinParser.TraversalMethod_by_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_by_Traversal_Comparator.
def visitTraversalMethod_by_Traversal_Comparator(self, ctx:GremlinParser.TraversalMethod_by_Traversal_ComparatorContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_call_string.
def visitTraversalMethod_call_string(self, ctx:GremlinParser.TraversalMethod_call_stringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_call_string_map.
def visitTraversalMethod_call_string_map(self, ctx:GremlinParser.TraversalMethod_call_string_mapContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_call_string_traversal.
def visitTraversalMethod_call_string_traversal(self, ctx:GremlinParser.TraversalMethod_call_string_traversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_call_string_map_traversal.
def visitTraversalMethod_call_string_map_traversal(self, ctx:GremlinParser.TraversalMethod_call_string_map_traversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_cap.
def visitTraversalMethod_cap(self, ctx:GremlinParser.TraversalMethod_capContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_choose_Function.
def visitTraversalMethod_choose_Function(self, ctx:GremlinParser.TraversalMethod_choose_FunctionContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_choose_Predicate_Traversal.
def visitTraversalMethod_choose_Predicate_Traversal(self, ctx:GremlinParser.TraversalMethod_choose_Predicate_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_choose_Predicate_Traversal_Traversal.
def visitTraversalMethod_choose_Predicate_Traversal_Traversal(self, ctx:GremlinParser.TraversalMethod_choose_Predicate_Traversal_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_choose_Traversal.
def visitTraversalMethod_choose_Traversal(self, ctx:GremlinParser.TraversalMethod_choose_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_choose_Traversal_Traversal.
def visitTraversalMethod_choose_Traversal_Traversal(self, ctx:GremlinParser.TraversalMethod_choose_Traversal_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_choose_Traversal_Traversal_Traversal.
def visitTraversalMethod_choose_Traversal_Traversal_Traversal(self, ctx:GremlinParser.TraversalMethod_choose_Traversal_Traversal_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_coalesce.
def visitTraversalMethod_coalesce(self, ctx:GremlinParser.TraversalMethod_coalesceContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_coin.
def visitTraversalMethod_coin(self, ctx:GremlinParser.TraversalMethod_coinContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_combine_Object.
def visitTraversalMethod_combine_Object(self, ctx:GremlinParser.TraversalMethod_combine_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_concat_Traversal_Traversal.
def visitTraversalMethod_concat_Traversal_Traversal(self, ctx:GremlinParser.TraversalMethod_concat_Traversal_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_concat_String.
def visitTraversalMethod_concat_String(self, ctx:GremlinParser.TraversalMethod_concat_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_conjoin_String.
def visitTraversalMethod_conjoin_String(self, ctx:GremlinParser.TraversalMethod_conjoin_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_connectedComponent.
def visitTraversalMethod_connectedComponent(self, ctx:GremlinParser.TraversalMethod_connectedComponentContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_constant.
def visitTraversalMethod_constant(self, ctx:GremlinParser.TraversalMethod_constantContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_count_Empty.
def visitTraversalMethod_count_Empty(self, ctx:GremlinParser.TraversalMethod_count_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_count_Scope.
def visitTraversalMethod_count_Scope(self, ctx:GremlinParser.TraversalMethod_count_ScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_cyclicPath.
def visitTraversalMethod_cyclicPath(self, ctx:GremlinParser.TraversalMethod_cyclicPathContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_dateAdd.
def visitTraversalMethod_dateAdd(self, ctx:GremlinParser.TraversalMethod_dateAddContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_dateDiff_Traversal.
def visitTraversalMethod_dateDiff_Traversal(self, ctx:GremlinParser.TraversalMethod_dateDiff_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_dateDiff_Date.
def visitTraversalMethod_dateDiff_Date(self, ctx:GremlinParser.TraversalMethod_dateDiff_DateContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_dedup_Scope_String.
def visitTraversalMethod_dedup_Scope_String(self, ctx:GremlinParser.TraversalMethod_dedup_Scope_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_dedup_String.
def visitTraversalMethod_dedup_String(self, ctx:GremlinParser.TraversalMethod_dedup_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_difference_Object.
def visitTraversalMethod_difference_Object(self, ctx:GremlinParser.TraversalMethod_difference_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_discard.
def visitTraversalMethod_discard(self, ctx:GremlinParser.TraversalMethod_discardContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_disjunct_Object.
def visitTraversalMethod_disjunct_Object(self, ctx:GremlinParser.TraversalMethod_disjunct_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_drop.
def visitTraversalMethod_drop(self, ctx:GremlinParser.TraversalMethod_dropContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_element.
def visitTraversalMethod_element(self, ctx:GremlinParser.TraversalMethod_elementContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_elementMap.
def visitTraversalMethod_elementMap(self, ctx:GremlinParser.TraversalMethod_elementMapContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_emit_Empty.
def visitTraversalMethod_emit_Empty(self, ctx:GremlinParser.TraversalMethod_emit_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_emit_Predicate.
def visitTraversalMethod_emit_Predicate(self, ctx:GremlinParser.TraversalMethod_emit_PredicateContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_emit_Traversal.
def visitTraversalMethod_emit_Traversal(self, ctx:GremlinParser.TraversalMethod_emit_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_fail_Empty.
def visitTraversalMethod_fail_Empty(self, ctx:GremlinParser.TraversalMethod_fail_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_fail_String.
def visitTraversalMethod_fail_String(self, ctx:GremlinParser.TraversalMethod_fail_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_filter_Predicate.
def visitTraversalMethod_filter_Predicate(self, ctx:GremlinParser.TraversalMethod_filter_PredicateContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_filter_Traversal.
def visitTraversalMethod_filter_Traversal(self, ctx:GremlinParser.TraversalMethod_filter_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_flatMap.
def visitTraversalMethod_flatMap(self, ctx:GremlinParser.TraversalMethod_flatMapContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_fold_Empty.
def visitTraversalMethod_fold_Empty(self, ctx:GremlinParser.TraversalMethod_fold_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_fold_Object_BiFunction.
def visitTraversalMethod_fold_Object_BiFunction(self, ctx:GremlinParser.TraversalMethod_fold_Object_BiFunctionContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_format_String.
def visitTraversalMethod_format_String(self, ctx:GremlinParser.TraversalMethod_format_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_from_String.
def visitTraversalMethod_from_String(self, ctx:GremlinParser.TraversalMethod_from_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_from_Vertex.
def visitTraversalMethod_from_Vertex(self, ctx:GremlinParser.TraversalMethod_from_VertexContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_from_Traversal.
def visitTraversalMethod_from_Traversal(self, ctx:GremlinParser.TraversalMethod_from_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_group_Empty.
def visitTraversalMethod_group_Empty(self, ctx:GremlinParser.TraversalMethod_group_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_group_String.
def visitTraversalMethod_group_String(self, ctx:GremlinParser.TraversalMethod_group_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_groupCount_Empty.
def visitTraversalMethod_groupCount_Empty(self, ctx:GremlinParser.TraversalMethod_groupCount_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_groupCount_String.
def visitTraversalMethod_groupCount_String(self, ctx:GremlinParser.TraversalMethod_groupCount_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_has_String.
def visitTraversalMethod_has_String(self, ctx:GremlinParser.TraversalMethod_has_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_has_String_Object.
def visitTraversalMethod_has_String_Object(self, ctx:GremlinParser.TraversalMethod_has_String_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_has_String_P.
def visitTraversalMethod_has_String_P(self, ctx:GremlinParser.TraversalMethod_has_String_PContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_has_String_String_Object.
def visitTraversalMethod_has_String_String_Object(self, ctx:GremlinParser.TraversalMethod_has_String_String_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_has_String_String_P.
def visitTraversalMethod_has_String_String_P(self, ctx:GremlinParser.TraversalMethod_has_String_String_PContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_has_String_Traversal.
def visitTraversalMethod_has_String_Traversal(self, ctx:GremlinParser.TraversalMethod_has_String_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_has_T_Object.
def visitTraversalMethod_has_T_Object(self, ctx:GremlinParser.TraversalMethod_has_T_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_has_T_P.
def visitTraversalMethod_has_T_P(self, ctx:GremlinParser.TraversalMethod_has_T_PContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_has_T_Traversal.
def visitTraversalMethod_has_T_Traversal(self, ctx:GremlinParser.TraversalMethod_has_T_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_hasId_Object_Object.
def visitTraversalMethod_hasId_Object_Object(self, ctx:GremlinParser.TraversalMethod_hasId_Object_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_hasId_P.
def visitTraversalMethod_hasId_P(self, ctx:GremlinParser.TraversalMethod_hasId_PContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_hasKey_P.
def visitTraversalMethod_hasKey_P(self, ctx:GremlinParser.TraversalMethod_hasKey_PContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_hasKey_String_String.
def visitTraversalMethod_hasKey_String_String(self, ctx:GremlinParser.TraversalMethod_hasKey_String_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_hasLabel_P.
def visitTraversalMethod_hasLabel_P(self, ctx:GremlinParser.TraversalMethod_hasLabel_PContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_hasLabel_String_String.
def visitTraversalMethod_hasLabel_String_String(self, ctx:GremlinParser.TraversalMethod_hasLabel_String_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_hasNot.
def visitTraversalMethod_hasNot(self, ctx:GremlinParser.TraversalMethod_hasNotContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_hasValue_Object_Object.
def visitTraversalMethod_hasValue_Object_Object(self, ctx:GremlinParser.TraversalMethod_hasValue_Object_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_hasValue_P.
def visitTraversalMethod_hasValue_P(self, ctx:GremlinParser.TraversalMethod_hasValue_PContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_id.
def visitTraversalMethod_id(self, ctx:GremlinParser.TraversalMethod_idContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_identity.
def visitTraversalMethod_identity(self, ctx:GremlinParser.TraversalMethod_identityContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_in.
def visitTraversalMethod_in(self, ctx:GremlinParser.TraversalMethod_inContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_inE.
def visitTraversalMethod_inE(self, ctx:GremlinParser.TraversalMethod_inEContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_intersect_Object.
def visitTraversalMethod_intersect_Object(self, ctx:GremlinParser.TraversalMethod_intersect_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_inV.
def visitTraversalMethod_inV(self, ctx:GremlinParser.TraversalMethod_inVContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_index.
def visitTraversalMethod_index(self, ctx:GremlinParser.TraversalMethod_indexContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_inject.
def visitTraversalMethod_inject(self, ctx:GremlinParser.TraversalMethod_injectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_is_Object.
def visitTraversalMethod_is_Object(self, ctx:GremlinParser.TraversalMethod_is_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_is_P.
def visitTraversalMethod_is_P(self, ctx:GremlinParser.TraversalMethod_is_PContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_key.
def visitTraversalMethod_key(self, ctx:GremlinParser.TraversalMethod_keyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_label.
def visitTraversalMethod_label(self, ctx:GremlinParser.TraversalMethod_labelContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_length_Empty.
def visitTraversalMethod_length_Empty(self, ctx:GremlinParser.TraversalMethod_length_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_length_Scope.
def visitTraversalMethod_length_Scope(self, ctx:GremlinParser.TraversalMethod_length_ScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_limit_Scope_long.
def visitTraversalMethod_limit_Scope_long(self, ctx:GremlinParser.TraversalMethod_limit_Scope_longContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_limit_long.
def visitTraversalMethod_limit_long(self, ctx:GremlinParser.TraversalMethod_limit_longContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_local.
def visitTraversalMethod_local(self, ctx:GremlinParser.TraversalMethod_localContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_loops_Empty.
def visitTraversalMethod_loops_Empty(self, ctx:GremlinParser.TraversalMethod_loops_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_loops_String.
def visitTraversalMethod_loops_String(self, ctx:GremlinParser.TraversalMethod_loops_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_lTrim_Empty.
def visitTraversalMethod_lTrim_Empty(self, ctx:GremlinParser.TraversalMethod_lTrim_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_lTrim_Scope.
def visitTraversalMethod_lTrim_Scope(self, ctx:GremlinParser.TraversalMethod_lTrim_ScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_map.
def visitTraversalMethod_map(self, ctx:GremlinParser.TraversalMethod_mapContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_match.
def visitTraversalMethod_match(self, ctx:GremlinParser.TraversalMethod_matchContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_math.
def visitTraversalMethod_math(self, ctx:GremlinParser.TraversalMethod_mathContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_max_Empty.
def visitTraversalMethod_max_Empty(self, ctx:GremlinParser.TraversalMethod_max_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_max_Scope.
def visitTraversalMethod_max_Scope(self, ctx:GremlinParser.TraversalMethod_max_ScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_mean_Empty.
def visitTraversalMethod_mean_Empty(self, ctx:GremlinParser.TraversalMethod_mean_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_mean_Scope.
def visitTraversalMethod_mean_Scope(self, ctx:GremlinParser.TraversalMethod_mean_ScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_merge_Object.
def visitTraversalMethod_merge_Object(self, ctx:GremlinParser.TraversalMethod_merge_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_mergeV_empty.
def visitTraversalMethod_mergeV_empty(self, ctx:GremlinParser.TraversalMethod_mergeV_emptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_mergeV_Map.
def visitTraversalMethod_mergeV_Map(self, ctx:GremlinParser.TraversalMethod_mergeV_MapContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_mergeV_Traversal.
def visitTraversalMethod_mergeV_Traversal(self, ctx:GremlinParser.TraversalMethod_mergeV_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_mergeE_empty.
def visitTraversalMethod_mergeE_empty(self, ctx:GremlinParser.TraversalMethod_mergeE_emptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_mergeE_Map.
def visitTraversalMethod_mergeE_Map(self, ctx:GremlinParser.TraversalMethod_mergeE_MapContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_mergeE_Traversal.
def visitTraversalMethod_mergeE_Traversal(self, ctx:GremlinParser.TraversalMethod_mergeE_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_min_Empty.
def visitTraversalMethod_min_Empty(self, ctx:GremlinParser.TraversalMethod_min_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_min_Scope.
def visitTraversalMethod_min_Scope(self, ctx:GremlinParser.TraversalMethod_min_ScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_none_P.
def visitTraversalMethod_none_P(self, ctx:GremlinParser.TraversalMethod_none_PContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_not.
def visitTraversalMethod_not(self, ctx:GremlinParser.TraversalMethod_notContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_option_Predicate_Traversal.
def visitTraversalMethod_option_Predicate_Traversal(self, ctx:GremlinParser.TraversalMethod_option_Predicate_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_option_Merge_Map.
def visitTraversalMethod_option_Merge_Map(self, ctx:GremlinParser.TraversalMethod_option_Merge_MapContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_option_Merge_Map_Cardinality.
def visitTraversalMethod_option_Merge_Map_Cardinality(self, ctx:GremlinParser.TraversalMethod_option_Merge_Map_CardinalityContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_option_Merge_Traversal.
def visitTraversalMethod_option_Merge_Traversal(self, ctx:GremlinParser.TraversalMethod_option_Merge_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_option_Object_Traversal.
def visitTraversalMethod_option_Object_Traversal(self, ctx:GremlinParser.TraversalMethod_option_Object_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_option_Traversal.
def visitTraversalMethod_option_Traversal(self, ctx:GremlinParser.TraversalMethod_option_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_optional.
def visitTraversalMethod_optional(self, ctx:GremlinParser.TraversalMethod_optionalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_or.
def visitTraversalMethod_or(self, ctx:GremlinParser.TraversalMethod_orContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_order_Empty.
def visitTraversalMethod_order_Empty(self, ctx:GremlinParser.TraversalMethod_order_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_order_Scope.
def visitTraversalMethod_order_Scope(self, ctx:GremlinParser.TraversalMethod_order_ScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_otherV.
def visitTraversalMethod_otherV(self, ctx:GremlinParser.TraversalMethod_otherVContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_out.
def visitTraversalMethod_out(self, ctx:GremlinParser.TraversalMethod_outContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_outE.
def visitTraversalMethod_outE(self, ctx:GremlinParser.TraversalMethod_outEContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_outV.
def visitTraversalMethod_outV(self, ctx:GremlinParser.TraversalMethod_outVContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_pageRank_Empty.
def visitTraversalMethod_pageRank_Empty(self, ctx:GremlinParser.TraversalMethod_pageRank_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_pageRank_double.
def visitTraversalMethod_pageRank_double(self, ctx:GremlinParser.TraversalMethod_pageRank_doubleContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_path.
def visitTraversalMethod_path(self, ctx:GremlinParser.TraversalMethod_pathContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_peerPressure.
def visitTraversalMethod_peerPressure(self, ctx:GremlinParser.TraversalMethod_peerPressureContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_product_Object.
def visitTraversalMethod_product_Object(self, ctx:GremlinParser.TraversalMethod_product_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_profile_Empty.
def visitTraversalMethod_profile_Empty(self, ctx:GremlinParser.TraversalMethod_profile_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_profile_String.
def visitTraversalMethod_profile_String(self, ctx:GremlinParser.TraversalMethod_profile_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_project.
def visitTraversalMethod_project(self, ctx:GremlinParser.TraversalMethod_projectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_properties.
def visitTraversalMethod_properties(self, ctx:GremlinParser.TraversalMethod_propertiesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_property_Cardinality_Object_Object_Object.
def visitTraversalMethod_property_Cardinality_Object_Object_Object(self, ctx:GremlinParser.TraversalMethod_property_Cardinality_Object_Object_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_property_Cardinality_Object.
def visitTraversalMethod_property_Cardinality_Object(self, ctx:GremlinParser.TraversalMethod_property_Cardinality_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_property_Object_Object_Object.
def visitTraversalMethod_property_Object_Object_Object(self, ctx:GremlinParser.TraversalMethod_property_Object_Object_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_property_Object.
def visitTraversalMethod_property_Object(self, ctx:GremlinParser.TraversalMethod_property_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_propertyMap.
def visitTraversalMethod_propertyMap(self, ctx:GremlinParser.TraversalMethod_propertyMapContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_range_Scope_long_long.
def visitTraversalMethod_range_Scope_long_long(self, ctx:GremlinParser.TraversalMethod_range_Scope_long_longContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_range_long_long.
def visitTraversalMethod_range_long_long(self, ctx:GremlinParser.TraversalMethod_range_long_longContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_read.
def visitTraversalMethod_read(self, ctx:GremlinParser.TraversalMethod_readContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_repeat_String_Traversal.
def visitTraversalMethod_repeat_String_Traversal(self, ctx:GremlinParser.TraversalMethod_repeat_String_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_repeat_Traversal.
def visitTraversalMethod_repeat_Traversal(self, ctx:GremlinParser.TraversalMethod_repeat_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_replace_String_String.
def visitTraversalMethod_replace_String_String(self, ctx:GremlinParser.TraversalMethod_replace_String_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_replace_Scope_String_String.
def visitTraversalMethod_replace_Scope_String_String(self, ctx:GremlinParser.TraversalMethod_replace_Scope_String_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_reverse_Empty.
def visitTraversalMethod_reverse_Empty(self, ctx:GremlinParser.TraversalMethod_reverse_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_rTrim_Empty.
def visitTraversalMethod_rTrim_Empty(self, ctx:GremlinParser.TraversalMethod_rTrim_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_rTrim_Scope.
def visitTraversalMethod_rTrim_Scope(self, ctx:GremlinParser.TraversalMethod_rTrim_ScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_sack_BiFunction.
def visitTraversalMethod_sack_BiFunction(self, ctx:GremlinParser.TraversalMethod_sack_BiFunctionContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_sack_Empty.
def visitTraversalMethod_sack_Empty(self, ctx:GremlinParser.TraversalMethod_sack_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_sample_Scope_int.
def visitTraversalMethod_sample_Scope_int(self, ctx:GremlinParser.TraversalMethod_sample_Scope_intContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_sample_int.
def visitTraversalMethod_sample_int(self, ctx:GremlinParser.TraversalMethod_sample_intContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_select_Column.
def visitTraversalMethod_select_Column(self, ctx:GremlinParser.TraversalMethod_select_ColumnContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_select_Pop_String.
def visitTraversalMethod_select_Pop_String(self, ctx:GremlinParser.TraversalMethod_select_Pop_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_select_Pop_String_String_String.
def visitTraversalMethod_select_Pop_String_String_String(self, ctx:GremlinParser.TraversalMethod_select_Pop_String_String_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_select_Pop_Traversal.
def visitTraversalMethod_select_Pop_Traversal(self, ctx:GremlinParser.TraversalMethod_select_Pop_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_select_String.
def visitTraversalMethod_select_String(self, ctx:GremlinParser.TraversalMethod_select_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_select_String_String_String.
def visitTraversalMethod_select_String_String_String(self, ctx:GremlinParser.TraversalMethod_select_String_String_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_select_Traversal.
def visitTraversalMethod_select_Traversal(self, ctx:GremlinParser.TraversalMethod_select_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_shortestPath.
def visitTraversalMethod_shortestPath(self, ctx:GremlinParser.TraversalMethod_shortestPathContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_sideEffect.
def visitTraversalMethod_sideEffect(self, ctx:GremlinParser.TraversalMethod_sideEffectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_simplePath.
def visitTraversalMethod_simplePath(self, ctx:GremlinParser.TraversalMethod_simplePathContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_skip_Scope_long.
def visitTraversalMethod_skip_Scope_long(self, ctx:GremlinParser.TraversalMethod_skip_Scope_longContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_skip_long.
def visitTraversalMethod_skip_long(self, ctx:GremlinParser.TraversalMethod_skip_longContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_split_String.
def visitTraversalMethod_split_String(self, ctx:GremlinParser.TraversalMethod_split_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_split_Scope_String.
def visitTraversalMethod_split_Scope_String(self, ctx:GremlinParser.TraversalMethod_split_Scope_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_store.
def visitTraversalMethod_store(self, ctx:GremlinParser.TraversalMethod_storeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_subgraph.
def visitTraversalMethod_subgraph(self, ctx:GremlinParser.TraversalMethod_subgraphContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_substring_int.
def visitTraversalMethod_substring_int(self, ctx:GremlinParser.TraversalMethod_substring_intContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_substring_Scope_int.
def visitTraversalMethod_substring_Scope_int(self, ctx:GremlinParser.TraversalMethod_substring_Scope_intContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_substring_int_int.
def visitTraversalMethod_substring_int_int(self, ctx:GremlinParser.TraversalMethod_substring_int_intContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_substring_Scope_int_int.
def visitTraversalMethod_substring_Scope_int_int(self, ctx:GremlinParser.TraversalMethod_substring_Scope_int_intContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_sum_Empty.
def visitTraversalMethod_sum_Empty(self, ctx:GremlinParser.TraversalMethod_sum_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_sum_Scope.
def visitTraversalMethod_sum_Scope(self, ctx:GremlinParser.TraversalMethod_sum_ScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_tail_Empty.
def visitTraversalMethod_tail_Empty(self, ctx:GremlinParser.TraversalMethod_tail_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_tail_Scope.
def visitTraversalMethod_tail_Scope(self, ctx:GremlinParser.TraversalMethod_tail_ScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_tail_Scope_long.
def visitTraversalMethod_tail_Scope_long(self, ctx:GremlinParser.TraversalMethod_tail_Scope_longContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_tail_long.
def visitTraversalMethod_tail_long(self, ctx:GremlinParser.TraversalMethod_tail_longContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_timeLimit.
def visitTraversalMethod_timeLimit(self, ctx:GremlinParser.TraversalMethod_timeLimitContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_times.
def visitTraversalMethod_times(self, ctx:GremlinParser.TraversalMethod_timesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_to_Direction_String.
def visitTraversalMethod_to_Direction_String(self, ctx:GremlinParser.TraversalMethod_to_Direction_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_to_String.
def visitTraversalMethod_to_String(self, ctx:GremlinParser.TraversalMethod_to_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_to_Vertex.
def visitTraversalMethod_to_Vertex(self, ctx:GremlinParser.TraversalMethod_to_VertexContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_to_Traversal.
def visitTraversalMethod_to_Traversal(self, ctx:GremlinParser.TraversalMethod_to_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_toE.
def visitTraversalMethod_toE(self, ctx:GremlinParser.TraversalMethod_toEContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_toLower_Empty.
def visitTraversalMethod_toLower_Empty(self, ctx:GremlinParser.TraversalMethod_toLower_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_toLower_Scope.
def visitTraversalMethod_toLower_Scope(self, ctx:GremlinParser.TraversalMethod_toLower_ScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_toUpper_Empty.
def visitTraversalMethod_toUpper_Empty(self, ctx:GremlinParser.TraversalMethod_toUpper_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_toUpper_Scope.
def visitTraversalMethod_toUpper_Scope(self, ctx:GremlinParser.TraversalMethod_toUpper_ScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_toV.
def visitTraversalMethod_toV(self, ctx:GremlinParser.TraversalMethod_toVContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_tree_Empty.
def visitTraversalMethod_tree_Empty(self, ctx:GremlinParser.TraversalMethod_tree_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_tree_String.
def visitTraversalMethod_tree_String(self, ctx:GremlinParser.TraversalMethod_tree_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_trim_Empty.
def visitTraversalMethod_trim_Empty(self, ctx:GremlinParser.TraversalMethod_trim_EmptyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_trim_Scope.
def visitTraversalMethod_trim_Scope(self, ctx:GremlinParser.TraversalMethod_trim_ScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_unfold.
def visitTraversalMethod_unfold(self, ctx:GremlinParser.TraversalMethod_unfoldContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_union.
def visitTraversalMethod_union(self, ctx:GremlinParser.TraversalMethod_unionContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_until_Predicate.
def visitTraversalMethod_until_Predicate(self, ctx:GremlinParser.TraversalMethod_until_PredicateContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_until_Traversal.
def visitTraversalMethod_until_Traversal(self, ctx:GremlinParser.TraversalMethod_until_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_value.
def visitTraversalMethod_value(self, ctx:GremlinParser.TraversalMethod_valueContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_valueMap_String.
def visitTraversalMethod_valueMap_String(self, ctx:GremlinParser.TraversalMethod_valueMap_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_valueMap_boolean_String.
def visitTraversalMethod_valueMap_boolean_String(self, ctx:GremlinParser.TraversalMethod_valueMap_boolean_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_values.
def visitTraversalMethod_values(self, ctx:GremlinParser.TraversalMethod_valuesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_where_P.
def visitTraversalMethod_where_P(self, ctx:GremlinParser.TraversalMethod_where_PContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_where_String_P.
def visitTraversalMethod_where_String_P(self, ctx:GremlinParser.TraversalMethod_where_String_PContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_where_Traversal.
def visitTraversalMethod_where_Traversal(self, ctx:GremlinParser.TraversalMethod_where_TraversalContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_with_String.
def visitTraversalMethod_with_String(self, ctx:GremlinParser.TraversalMethod_with_StringContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_with_String_Object.
def visitTraversalMethod_with_String_Object(self, ctx:GremlinParser.TraversalMethod_with_String_ObjectContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMethod_write.
def visitTraversalMethod_write(self, ctx:GremlinParser.TraversalMethod_writeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#structureVertexLiteral.
def visitStructureVertexLiteral(self, ctx:GremlinParser.StructureVertexLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalStrategy.
def visitTraversalStrategy(self, ctx:GremlinParser.TraversalStrategyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#configuration.
def visitConfiguration(self, ctx:GremlinParser.ConfigurationContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalScope.
def visitTraversalScope(self, ctx:GremlinParser.TraversalScopeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalBarrier.
def visitTraversalBarrier(self, ctx:GremlinParser.TraversalBarrierContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalT.
def visitTraversalT(self, ctx:GremlinParser.TraversalTContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalTShort.
def visitTraversalTShort(self, ctx:GremlinParser.TraversalTShortContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalTLong.
def visitTraversalTLong(self, ctx:GremlinParser.TraversalTLongContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalMerge.
def visitTraversalMerge(self, ctx:GremlinParser.TraversalMergeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalOrder.
def visitTraversalOrder(self, ctx:GremlinParser.TraversalOrderContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalDirection.
def visitTraversalDirection(self, ctx:GremlinParser.TraversalDirectionContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalDirectionShort.
def visitTraversalDirectionShort(self, ctx:GremlinParser.TraversalDirectionShortContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalDirectionLong.
def visitTraversalDirectionLong(self, ctx:GremlinParser.TraversalDirectionLongContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalCardinality.
def visitTraversalCardinality(self, ctx:GremlinParser.TraversalCardinalityContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalColumn.
def visitTraversalColumn(self, ctx:GremlinParser.TraversalColumnContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPop.
def visitTraversalPop(self, ctx:GremlinParser.TraversalPopContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalOperator.
def visitTraversalOperator(self, ctx:GremlinParser.TraversalOperatorContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPick.
def visitTraversalPick(self, ctx:GremlinParser.TraversalPickContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalDT.
def visitTraversalDT(self, ctx:GremlinParser.TraversalDTContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate.
def visitTraversalPredicate(self, ctx:GremlinParser.TraversalPredicateContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalTerminalMethod.
def visitTraversalTerminalMethod(self, ctx:GremlinParser.TraversalTerminalMethodContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalSackMethod.
def visitTraversalSackMethod(self, ctx:GremlinParser.TraversalSackMethodContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalComparator.
def visitTraversalComparator(self, ctx:GremlinParser.TraversalComparatorContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalFunction.
def visitTraversalFunction(self, ctx:GremlinParser.TraversalFunctionContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalBiFunction.
def visitTraversalBiFunction(self, ctx:GremlinParser.TraversalBiFunctionContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_eq.
def visitTraversalPredicate_eq(self, ctx:GremlinParser.TraversalPredicate_eqContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_neq.
def visitTraversalPredicate_neq(self, ctx:GremlinParser.TraversalPredicate_neqContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_lt.
def visitTraversalPredicate_lt(self, ctx:GremlinParser.TraversalPredicate_ltContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_lte.
def visitTraversalPredicate_lte(self, ctx:GremlinParser.TraversalPredicate_lteContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_gt.
def visitTraversalPredicate_gt(self, ctx:GremlinParser.TraversalPredicate_gtContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_gte.
def visitTraversalPredicate_gte(self, ctx:GremlinParser.TraversalPredicate_gteContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_inside.
def visitTraversalPredicate_inside(self, ctx:GremlinParser.TraversalPredicate_insideContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_outside.
def visitTraversalPredicate_outside(self, ctx:GremlinParser.TraversalPredicate_outsideContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_between.
def visitTraversalPredicate_between(self, ctx:GremlinParser.TraversalPredicate_betweenContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_within.
def visitTraversalPredicate_within(self, ctx:GremlinParser.TraversalPredicate_withinContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_without.
def visitTraversalPredicate_without(self, ctx:GremlinParser.TraversalPredicate_withoutContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_not.
def visitTraversalPredicate_not(self, ctx:GremlinParser.TraversalPredicate_notContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_containing.
def visitTraversalPredicate_containing(self, ctx:GremlinParser.TraversalPredicate_containingContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_notContaining.
def visitTraversalPredicate_notContaining(self, ctx:GremlinParser.TraversalPredicate_notContainingContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_startingWith.
def visitTraversalPredicate_startingWith(self, ctx:GremlinParser.TraversalPredicate_startingWithContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_notStartingWith.
def visitTraversalPredicate_notStartingWith(self, ctx:GremlinParser.TraversalPredicate_notStartingWithContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_endingWith.
def visitTraversalPredicate_endingWith(self, ctx:GremlinParser.TraversalPredicate_endingWithContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_notEndingWith.
def visitTraversalPredicate_notEndingWith(self, ctx:GremlinParser.TraversalPredicate_notEndingWithContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_regex.
def visitTraversalPredicate_regex(self, ctx:GremlinParser.TraversalPredicate_regexContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalPredicate_notRegex.
def visitTraversalPredicate_notRegex(self, ctx:GremlinParser.TraversalPredicate_notRegexContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalTerminalMethod_explain.
def visitTraversalTerminalMethod_explain(self, ctx:GremlinParser.TraversalTerminalMethod_explainContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalTerminalMethod_hasNext.
def visitTraversalTerminalMethod_hasNext(self, ctx:GremlinParser.TraversalTerminalMethod_hasNextContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalTerminalMethod_iterate.
def visitTraversalTerminalMethod_iterate(self, ctx:GremlinParser.TraversalTerminalMethod_iterateContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalTerminalMethod_tryNext.
def visitTraversalTerminalMethod_tryNext(self, ctx:GremlinParser.TraversalTerminalMethod_tryNextContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalTerminalMethod_next.
def visitTraversalTerminalMethod_next(self, ctx:GremlinParser.TraversalTerminalMethod_nextContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalTerminalMethod_toList.
def visitTraversalTerminalMethod_toList(self, ctx:GremlinParser.TraversalTerminalMethod_toListContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalTerminalMethod_toSet.
def visitTraversalTerminalMethod_toSet(self, ctx:GremlinParser.TraversalTerminalMethod_toSetContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalTerminalMethod_toBulkSet.
def visitTraversalTerminalMethod_toBulkSet(self, ctx:GremlinParser.TraversalTerminalMethod_toBulkSetContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#withOptionKeys.
def visitWithOptionKeys(self, ctx:GremlinParser.WithOptionKeysContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#connectedComponentConstants.
def visitConnectedComponentConstants(self, ctx:GremlinParser.ConnectedComponentConstantsContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#pageRankConstants.
def visitPageRankConstants(self, ctx:GremlinParser.PageRankConstantsContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#peerPressureConstants.
def visitPeerPressureConstants(self, ctx:GremlinParser.PeerPressureConstantsContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#shortestPathConstants.
def visitShortestPathConstants(self, ctx:GremlinParser.ShortestPathConstantsContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#withOptionsValues.
def visitWithOptionsValues(self, ctx:GremlinParser.WithOptionsValuesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#ioOptionsKeys.
def visitIoOptionsKeys(self, ctx:GremlinParser.IoOptionsKeysContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#ioOptionsValues.
def visitIoOptionsValues(self, ctx:GremlinParser.IoOptionsValuesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#connectedComponentConstants_component.
def visitConnectedComponentConstants_component(self, ctx:GremlinParser.ConnectedComponentConstants_componentContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#connectedComponentConstants_edges.
def visitConnectedComponentConstants_edges(self, ctx:GremlinParser.ConnectedComponentConstants_edgesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#connectedComponentConstants_propertyName.
def visitConnectedComponentConstants_propertyName(self, ctx:GremlinParser.ConnectedComponentConstants_propertyNameContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#pageRankConstants_edges.
def visitPageRankConstants_edges(self, ctx:GremlinParser.PageRankConstants_edgesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#pageRankConstants_times.
def visitPageRankConstants_times(self, ctx:GremlinParser.PageRankConstants_timesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#pageRankConstants_propertyName.
def visitPageRankConstants_propertyName(self, ctx:GremlinParser.PageRankConstants_propertyNameContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#peerPressureConstants_edges.
def visitPeerPressureConstants_edges(self, ctx:GremlinParser.PeerPressureConstants_edgesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#peerPressureConstants_times.
def visitPeerPressureConstants_times(self, ctx:GremlinParser.PeerPressureConstants_timesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#peerPressureConstants_propertyName.
def visitPeerPressureConstants_propertyName(self, ctx:GremlinParser.PeerPressureConstants_propertyNameContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#shortestPathConstants_target.
def visitShortestPathConstants_target(self, ctx:GremlinParser.ShortestPathConstants_targetContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#shortestPathConstants_edges.
def visitShortestPathConstants_edges(self, ctx:GremlinParser.ShortestPathConstants_edgesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#shortestPathConstants_distance.
def visitShortestPathConstants_distance(self, ctx:GremlinParser.ShortestPathConstants_distanceContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#shortestPathConstants_maxDistance.
def visitShortestPathConstants_maxDistance(self, ctx:GremlinParser.ShortestPathConstants_maxDistanceContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#shortestPathConstants_includeEdges.
def visitShortestPathConstants_includeEdges(self, ctx:GremlinParser.ShortestPathConstants_includeEdgesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#withOptionsConstants_tokens.
def visitWithOptionsConstants_tokens(self, ctx:GremlinParser.WithOptionsConstants_tokensContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#withOptionsConstants_none.
def visitWithOptionsConstants_none(self, ctx:GremlinParser.WithOptionsConstants_noneContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#withOptionsConstants_ids.
def visitWithOptionsConstants_ids(self, ctx:GremlinParser.WithOptionsConstants_idsContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#withOptionsConstants_labels.
def visitWithOptionsConstants_labels(self, ctx:GremlinParser.WithOptionsConstants_labelsContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#withOptionsConstants_keys.
def visitWithOptionsConstants_keys(self, ctx:GremlinParser.WithOptionsConstants_keysContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#withOptionsConstants_values.
def visitWithOptionsConstants_values(self, ctx:GremlinParser.WithOptionsConstants_valuesContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#withOptionsConstants_all.
def visitWithOptionsConstants_all(self, ctx:GremlinParser.WithOptionsConstants_allContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#withOptionsConstants_indexer.
def visitWithOptionsConstants_indexer(self, ctx:GremlinParser.WithOptionsConstants_indexerContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#withOptionsConstants_list.
def visitWithOptionsConstants_list(self, ctx:GremlinParser.WithOptionsConstants_listContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#withOptionsConstants_map.
def visitWithOptionsConstants_map(self, ctx:GremlinParser.WithOptionsConstants_mapContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#ioOptionsConstants_reader.
def visitIoOptionsConstants_reader(self, ctx:GremlinParser.IoOptionsConstants_readerContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#ioOptionsConstants_writer.
def visitIoOptionsConstants_writer(self, ctx:GremlinParser.IoOptionsConstants_writerContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#ioOptionsConstants_gryo.
def visitIoOptionsConstants_gryo(self, ctx:GremlinParser.IoOptionsConstants_gryoContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#ioOptionsConstants_graphson.
def visitIoOptionsConstants_graphson(self, ctx:GremlinParser.IoOptionsConstants_graphsonContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#ioOptionsConstants_graphml.
def visitIoOptionsConstants_graphml(self, ctx:GremlinParser.IoOptionsConstants_graphmlContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#connectedComponentStringConstant.
def visitConnectedComponentStringConstant(self, ctx:GremlinParser.ConnectedComponentStringConstantContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#pageRankStringConstant.
def visitPageRankStringConstant(self, ctx:GremlinParser.PageRankStringConstantContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#peerPressureStringConstant.
def visitPeerPressureStringConstant(self, ctx:GremlinParser.PeerPressureStringConstantContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#shortestPathStringConstant.
def visitShortestPathStringConstant(self, ctx:GremlinParser.ShortestPathStringConstantContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#withOptionsStringConstant.
def visitWithOptionsStringConstant(self, ctx:GremlinParser.WithOptionsStringConstantContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#ioOptionsStringConstant.
def visitIoOptionsStringConstant(self, ctx:GremlinParser.IoOptionsStringConstantContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#booleanArgument.
def visitBooleanArgument(self, ctx:GremlinParser.BooleanArgumentContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#integerArgument.
def visitIntegerArgument(self, ctx:GremlinParser.IntegerArgumentContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#floatArgument.
def visitFloatArgument(self, ctx:GremlinParser.FloatArgumentContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#stringArgument.
def visitStringArgument(self, ctx:GremlinParser.StringArgumentContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#stringNullableArgument.
def visitStringNullableArgument(self, ctx:GremlinParser.StringNullableArgumentContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#stringNullableArgumentVarargs.
def visitStringNullableArgumentVarargs(self, ctx:GremlinParser.StringNullableArgumentVarargsContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#dateArgument.
def visitDateArgument(self, ctx:GremlinParser.DateArgumentContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#genericArgument.
def visitGenericArgument(self, ctx:GremlinParser.GenericArgumentContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#genericArgumentVarargs.
def visitGenericArgumentVarargs(self, ctx:GremlinParser.GenericArgumentVarargsContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#genericMapArgument.
def visitGenericMapArgument(self, ctx:GremlinParser.GenericMapArgumentContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#genericMapNullableArgument.
def visitGenericMapNullableArgument(self, ctx:GremlinParser.GenericMapNullableArgumentContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#nullableGenericLiteralMap.
def visitNullableGenericLiteralMap(self, ctx:GremlinParser.NullableGenericLiteralMapContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#structureVertexArgument.
def visitStructureVertexArgument(self, ctx:GremlinParser.StructureVertexArgumentContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalStrategyVarargs.
def visitTraversalStrategyVarargs(self, ctx:GremlinParser.TraversalStrategyVarargsContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#traversalStrategyExpr.
def visitTraversalStrategyExpr(self, ctx:GremlinParser.TraversalStrategyExprContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#classTypeList.
def visitClassTypeList(self, ctx:GremlinParser.ClassTypeListContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#classTypeExpr.
def visitClassTypeExpr(self, ctx:GremlinParser.ClassTypeExprContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#nestedTraversalList.
def visitNestedTraversalList(self, ctx:GremlinParser.NestedTraversalListContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#nestedTraversalExpr.
def visitNestedTraversalExpr(self, ctx:GremlinParser.NestedTraversalExprContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#genericCollectionLiteral.
def visitGenericCollectionLiteral(self, ctx:GremlinParser.GenericCollectionLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#genericLiteralVarargs.
def visitGenericLiteralVarargs(self, ctx:GremlinParser.GenericLiteralVarargsContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#genericLiteralExpr.
def visitGenericLiteralExpr(self, ctx:GremlinParser.GenericLiteralExprContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#genericMapNullableLiteral.
def visitGenericMapNullableLiteral(self, ctx:GremlinParser.GenericMapNullableLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#genericRangeLiteral.
def visitGenericRangeLiteral(self, ctx:GremlinParser.GenericRangeLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#genericSetLiteral.
def visitGenericSetLiteral(self, ctx:GremlinParser.GenericSetLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#stringNullableLiteralVarargs.
def visitStringNullableLiteralVarargs(self, ctx:GremlinParser.StringNullableLiteralVarargsContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#genericLiteral.
def visitGenericLiteral(self, ctx:GremlinParser.GenericLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#genericMapLiteral.
def visitGenericMapLiteral(self, ctx:GremlinParser.GenericMapLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#mapKey.
def visitMapKey(self, ctx:GremlinParser.MapKeyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#mapEntry.
def visitMapEntry(self, ctx:GremlinParser.MapEntryContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#stringLiteral.
def visitStringLiteral(self, ctx:GremlinParser.StringLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#stringNullableLiteral.
def visitStringNullableLiteral(self, ctx:GremlinParser.StringNullableLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#integerLiteral.
def visitIntegerLiteral(self, ctx:GremlinParser.IntegerLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#floatLiteral.
def visitFloatLiteral(self, ctx:GremlinParser.FloatLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#numericLiteral.
def visitNumericLiteral(self, ctx:GremlinParser.NumericLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#booleanLiteral.
def visitBooleanLiteral(self, ctx:GremlinParser.BooleanLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#dateLiteral.
def visitDateLiteral(self, ctx:GremlinParser.DateLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#nullLiteral.
def visitNullLiteral(self, ctx:GremlinParser.NullLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#nanLiteral.
def visitNanLiteral(self, ctx:GremlinParser.NanLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#infLiteral.
def visitInfLiteral(self, ctx:GremlinParser.InfLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#uuidLiteral.
def visitUuidLiteral(self, ctx:GremlinParser.UuidLiteralContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#nakedKey.
def visitNakedKey(self, ctx:GremlinParser.NakedKeyContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#classType.
def visitClassType(self, ctx:GremlinParser.ClassTypeContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#variable.
def visitVariable(self, ctx:GremlinParser.VariableContext):
return self.visitChildren(ctx)


# Visit a parse tree produced by GremlinParser#keyword.
def visitKeyword(self, ctx:GremlinParser.KeywordContext):
return self.visitChildren(ctx)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

🧩 Analysis chain

确认自动生成代码的版本控制策略。

此文件由 ANTLR 自动生成,包含约 270 个访问器方法的样板代码。通常,自动生成的代码有两种处理方式:

  1. 不提交到版本控制:在 .gitignore 中排除,由构建脚本从语法文件重新生成
  2. 提交到版本控制:便于审查和调试,但需要文档说明重新生成步骤

请确认项目的策略。如果选择提交生成的代码,建议在 README 或构建文档中添加:

  • 语法文件位置(Gremlin.g4)
  • ANTLR 版本(4.13.1)
  • 重新生成命令

🏁 Script executed:

#!/bin/bash
# 检查是否存在 .gitignore 规则或文档说明生成代码的处理方式

# 搜索 .gitignore 中是否排除了生成的文件
if [ -f .gitignore ]; then
  echo "=== .gitignore 中与 ANTLR 生成文件相关的规则 ==="
  rg -n "GremlinVisitor|GremlinParser|\.g4" .gitignore || echo "未找到相关规则"
fi

echo ""
echo "=== 搜索文档中关于 ANTLR 代码生成的说明 ==="
rg -n -i "antlr|生成|generate.*gremlin" README.md text2gremlin/AST_Text2Gremlin/README.md 2>/dev/null || echo "未找到相关文档"

echo ""
echo "=== 检查是否存在构建脚本 ==="
fd -t f "build|generate|setup" -e sh -e py -e yml -e yaml | head -10

Length of output: 3237


补充 ANTLR 生成文件的文档说明。 在 text2gremlin/AST_Text2Gremlin/README.md 中明确 Gremlin.g4 语法文件路径、使用的 ANTLR 版本(如 4.13.1)及重新生成 GremlinVisitor.py 的命令示例;或根据项目策略将生成文件移出版本控制并在构建脚本中添加自动生成步骤。

🤖 Prompt for AI Agents
In text2gremlin/AST_Text2Gremlin/base/gremlin/GremlinVisitor.py (lines 8-2085)
the reviewer asks for documentation about this ANTLR-generated file; update
text2gremlin/AST_Text2Gremlin/README.md to state the path to the Gremlin.g4
grammar, the ANTLR version used (e.g. 4.13.1), and include an exact command
example to regenerate GremlinVisitor.py (including Java/ANTLR jar invocation or
the maven/gradle task as appropriate); alternatively, if project policy prefers
generated files excluded from VCS, move GremlinVisitor.py out of version control
and add an automated regeneration step to the build scripts (show the build step
and where it runs) so developers can recreate the file reproducibly.

"db_schema_path": {
"common": "",
"yago": "./db_data/schema/yago.json",
"movie": "../db_data/schema/movie_schema.json",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

统一路径格式以提高一致性。

"movie" 的路径使用了 ../db_data/schema/movie_schema.json(向上一级目录),而其他路径使用 ./db_data/schema/(当前目录)。这种不一致可能表明目录结构存在问题或配置错误。请验证正确的相对路径,并确保所有 schema 路径使用统一的基准目录。

运行以下脚本验证所有 schema 文件是否存在:


🏁 Script executed:

#!/bin/bash
# 验证 config.json 中的 schema 路径
cd text2gremlin/AST_Text2Gremlin
for schema in "yago" "movie" "the_three_body" "finbench" "SNB" "three_kingdoms"; do
  path=$(jq -r ".db_schema_path.${schema}" config.json)
  if [ "$path" != "" ] && [ "$path" != "null" ]; then
    if [ -f "$path" ]; then
      echo "$schema: $path"
    else
      echo "$schema: $path (文件不存在)"
    fi
  fi
done

Length of output: 327


🏁 Script executed:

#!/bin/bash
# 定位项目中所有 db_data 目录和 schema 文件
find . -type d | sed -e 's|^\./||' | grep db_data || echo "No db_data directories found"
find . -type f | sed -e 's|^\./||' | grep '/db_data/' || echo "No db_data files found"

Length of output: 1159


统一并修正 schema 路径及文件

  • 将所有 db_schema_path 统一改为相对于 config.json"./db_data/schema/<name>_schema.json",去除 ../ 前缀
  • 为每个引用的 schema 添加或重命名对应的 JSON 文件(目前只有 movie_schema.json 存在,其他均缺失)
🤖 Prompt for AI Agents
In text2gremlin/AST_Text2Gremlin/config.json around line 7, the schema path for
"movie" and other schema entries use a ../ prefix and some referenced schema
files are missing; update all db_schema_path entries to use paths relative to
config.json like "./db_data/schema/<name>_schema.json" (remove "../"), and
ensure every referenced schema has a corresponding JSON file in
text2gremlin/AST_Text2Gremlin/db_data/schema named <name>_schema.json (create or
rename files as needed so all references resolve).

"finbench": "./db_data/schema/finbench_schema.json",
"SNB": "./db_data/schema/SNB_schema.json",
"three_kingdoms": "./db_data/schema/three_kingdoms.json",
"wandering_earth": "/root/work_repo/db_data/schema/wandering_earth.json"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

避免使用绝对路径以提高可移植性。

"wandering_earth" 使用了绝对路径 /root/work_repo/db_data/schema/wandering_earth.json,这会导致配置在不同环境或用户间无法移植。建议改用相对路径,与其他 schema 路径保持一致。

应用此修改(假设文件结构一致):

-        "wandering_earth": "/root/work_repo/db_data/schema/wandering_earth.json"
+        "wandering_earth": "./db_data/schema/wandering_earth.json"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"wandering_earth": "/root/work_repo/db_data/schema/wandering_earth.json"
"wandering_earth": "./db_data/schema/wandering_earth.json"
🤖 Prompt for AI Agents
In text2gremlin/AST_Text2Gremlin/config.json around line 12, the
"wandering_earth" entry uses an absolute path
(/root/work_repo/db_data/schema/wandering_earth.json) which breaks portability;
change it to a relative path consistent with other schema entries (e.g.,
../db_data/schema/wandering_earth.json or ./schema/wandering_earth.json
depending on repo layout), update any related docs or scripts if they assume the
old absolute path, and run a quick config-load test to ensure the relative path
resolves correctly in CI and local environments.

Comment thread text2gremlin/AST_Text2Gremlin/README.md Outdated
Comment thread text2gremlin/AST_Text2Gremlin/README.md Outdated
Comment thread text2gremlin/AST_Text2Gremlin/README.md Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

♻️ Duplicate comments (1)
text2gremlin/AST_Text2Gremlin/base/GremlinBase.py (1)

58-99: ⚠️ Potential issue | 🟠 Major

schema_dictsyn_dict 的回退拆开处理。

当前逻辑只在“一个配置路径都没拿到”或“所有配置路径都不存在”时才回退默认字典。像 config_example.json 这种只提供 schema_dict_path 的常见场景,会让 schema_dict.txt 被加载、syn_dict.txt 却被静默跳过,而且是否跳过还会随启动目录变化,导致描述生成不稳定。

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@text2gremlin/AST_Text2Gremlin/base/GremlinBase.py` around lines 58 - 99,
当前实现把 schema_dict 和 syn_dict 的回退逻辑混在一起,导致如果只配置了 schema_dict_path 时 syn_dict
可能被静默跳过;请将对 schema 和 syn 的路径收集与存在性检查拆成两条独立流程:分别调用 config.get_schema_dict_path 和
config.get_syn_dict_path(引用符号:get_schema_dict_path, get_syn_dict_path),为 schema
和 syn 各自维护 file_paths/schema_paths 与 syn_paths,分别判断 os.path.exists 并如果不存在再各自回退到
template 下的默认文件(引用符号:default_paths/current_dir),最后将实际存在的路径合并或分别传入
self.load_dict_from_file(引用符号:load_dict_from_file)以确保两个字典独立且确定地被加载或明确地记录未找到。
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@text2gremlin/AST_Text2Gremlin/analyze_syntax.py`:
- Around line 172-197: The CLI --top option is ignored because print_results()
hardcodes steps.most_common(25) and main() does not pass args.top; update
print_results to accept a top:int (default 25) and use steps.most_common(top)
when building sorted_steps, and change all callers (including main() and the
other call site referenced around lines 359-392) to pass args.top (or the
default) through to print_results; keep existing behavior for print_bar,
max_count calculation, and preserve default=25 so CLI changes take effect.
- Around line 88-99: START_PATTERN currently records the initial step (e.g.
g.V()/g.E()) and STEP_PATTERN then re-counts the same token, and the exclusion
list erroneously filters out the valid "group" step; to fix, compute the initial
start_step from START_PATTERN (use start_match.group(1)) and in the STEP_PATTERN
loop skip only the specific match that is the same occurrence as the start (e.g.
compare match.start() or match.span() to start_match.start()/span()) so you
don't double-count, and remove "group" from the exclusion tuple in the condition
(keep filtering truly non-step calls like "get", "put", "toString" if needed);
update references to stats["steps"] accordingly so the initial step is counted
exactly once.

In `@text2gremlin/AST_Text2Gremlin/generalize_llm.py`:
- Around line 214-216: The BatchTranslationResult validation currently only
enforces non-empty results but doesn't ensure the returned entries match the
input count or that each BatchTranslationItem.questions length equals expected
num_questions, which lets missing translations be treated as successes; update
the post-response validation logic (around BatchTranslationResult /
BatchTranslationItem handling in generalize_llm.py and the similar block at
lines ~262-287) to: (1) assert that len(results) == len(input_descriptions) and
for each item assert len(item.questions) == num_questions, (2) when a mismatch
or missing/empty question is detected, populate item._error with a descriptive
error and do not increment success_count, and (3) surface/log these errors so
the caller can handle failures instead of silently treating them as successful
translations.
- Around line 243-247: The LLM call using client.chat.completions.create
currently has no timeout and no transport-layer retry/backoff; wrap that call in
an async retry loop with exponential backoff and jitter (e.g., retries for
transient errors and status codes 429, 502, 503, 504) and enforce a per-attempt
timeout (use the client's timeout option if available or asyncio.wait_for around
client.chat.completions.create). Catch transport/network exceptions (e.g.,
HTTP/connection errors from the HTTP client) and rate-limit responses, retry
with increasing delay, and preserve the existing JSON/validation error handling
paths in the surrounding code (keep the existing handlers in generalize_llm.py
but move the client.chat.completions.create invocation into the new
timed/retried wrapper to avoid unbounded hangs and add exponential backoff in
the general exception handler).

In `@text2gremlin/AST_Text2Gremlin/README.md`:
- Around line 31-38: The README's "运行" section references the wrong script name:
replace the outdated show_syntax_stats.py with the actual script
analyze_syntax.py so the quick-start and the later "语法分析" section match the
added file; update the line in README.md where the example run commands appear
to call python analyze_syntax.py and verify other README mentions of
show_syntax_stats.py are removed or renamed accordingly.

---

Duplicate comments:
In `@text2gremlin/AST_Text2Gremlin/base/GremlinBase.py`:
- Around line 58-99: 当前实现把 schema_dict 和 syn_dict 的回退逻辑混在一起,导致如果只配置了
schema_dict_path 时 syn_dict 可能被静默跳过;请将对 schema 和 syn 的路径收集与存在性检查拆成两条独立流程:分别调用
config.get_schema_dict_path 和
config.get_syn_dict_path(引用符号:get_schema_dict_path, get_syn_dict_path),为 schema
和 syn 各自维护 file_paths/schema_paths 与 syn_paths,分别判断 os.path.exists 并如果不存在再各自回退到
template 下的默认文件(引用符号:default_paths/current_dir),最后将实际存在的路径合并或分别传入
self.load_dict_from_file(引用符号:load_dict_from_file)以确保两个字典独立且确定地被加载或明确地记录未找到。

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 18839e67-345a-49fd-8ec1-43418d9a5f13

📥 Commits

Reviewing files that changed from the base of the PR and between 471e141 and fceae69.

⛔ Files ignored due to path filters (1)
  • text2gremlin/AST_Text2Gremlin/gremlin_templates.csv is excluded by !**/*.csv
📒 Files selected for processing (8)
  • text2gremlin/AST_Text2Gremlin/.gitignore
  • text2gremlin/AST_Text2Gremlin/README.md
  • text2gremlin/AST_Text2Gremlin/analyze_syntax.py
  • text2gremlin/AST_Text2Gremlin/base/GremlinBase.py
  • text2gremlin/AST_Text2Gremlin/base/TraversalGenerator.py
  • text2gremlin/AST_Text2Gremlin/config_example.json
  • text2gremlin/AST_Text2Gremlin/generalize_llm.py
  • text2gremlin/AST_Text2Gremlin/output/generated_corpus_20260308_020414.json

Comment on lines +88 to +99
# 起始步骤
start_match = START_PATTERN.search(query)
if start_match:
stats["steps"][start_match.group(1)] += 1

# 链式步骤
for match in STEP_PATTERN.finditer(query):
step_name = match.group(1)
# 排除非步骤的方法调用(如 property 的值参数中的方法)
if step_name not in ("group", "get", "put", "toString"):
stats["steps"][step_name] += 1

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

修正步骤统计的双计数和漏计数。

START_PATTERN 会先把 g.V()/g.E() 记一次,STEP_PATTERN 又会把同一个起始步骤再记一次;同时 Line 97 把合法的 group() 步骤过滤掉了。这样生成的总步骤数、Top 排名和分类占比都会系统性失真。

🩹 建议修复
-    # 起始步骤
-    start_match = START_PATTERN.search(query)
-    if start_match:
-        stats["steps"][start_match.group(1)] += 1
-
     # 链式步骤
     for match in STEP_PATTERN.finditer(query):
         step_name = match.group(1)
         # 排除非步骤的方法调用(如 property 的值参数中的方法)
-        if step_name not in ("group", "get", "put", "toString"):
+        if step_name not in ("get", "put", "toString"):
             stats["steps"][step_name] += 1
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# 起始步骤
start_match = START_PATTERN.search(query)
if start_match:
stats["steps"][start_match.group(1)] += 1
# 链式步骤
for match in STEP_PATTERN.finditer(query):
step_name = match.group(1)
# 排除非步骤的方法调用(如 property 的值参数中的方法)
if step_name not in ("group", "get", "put", "toString"):
stats["steps"][step_name] += 1
# 链式步骤
for match in STEP_PATTERN.finditer(query):
step_name = match.group(1)
# 排除非步骤的方法调用(如 property 的值参数中的方法)
if step_name not in ("get", "put", "toString"):
stats["steps"][step_name] += 1
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@text2gremlin/AST_Text2Gremlin/analyze_syntax.py` around lines 88 - 99,
START_PATTERN currently records the initial step (e.g. g.V()/g.E()) and
STEP_PATTERN then re-counts the same token, and the exclusion list erroneously
filters out the valid "group" step; to fix, compute the initial start_step from
START_PATTERN (use start_match.group(1)) and in the STEP_PATTERN loop skip only
the specific match that is the same occurrence as the start (e.g. compare
match.start() or match.span() to start_match.start()/span()) so you don't
double-count, and remove "group" from the exclusion tuple in the condition (keep
filtering truly non-step calls like "get", "put", "toString" if needed); update
references to stats["steps"] accordingly so the initial step is counted exactly
once.

Comment on lines +172 to +197
def print_results(stats: dict, total_queries: int):
"""终端打印统计结果"""
steps = stats["steps"]
total_steps = sum(steps.values())
step_counts = stats["step_counts"]

print("\n" + "=" * 70)
print("📊 Gremlin 语法分布统计")
print("=" * 70)
print(f" 总查询数: {total_queries:,}")
print(f" 总步骤数: {total_steps:,}")
print(f" 不同步骤类型: {len(steps)}")
if step_counts:
avg = sum(step_counts) / len(step_counts)
print(f" 平均步骤/查询: {avg:.2f}")
print(f" 最大步骤数: {max(step_counts)}")
print(f" 最小步骤数: {min(step_counts)}")

# Top 步骤
print(f"\n{'─' * 70}")
print("🏆 步骤分布 (Top 25)")
print(f"{'─' * 70}")
sorted_steps = steps.most_common(25)
max_count = sorted_steps[0][1] if sorted_steps else 1
for i, (name, count) in enumerate(sorted_steps, 1):
print_bar(name, count, max_count, total_steps, i)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

--top 参数真正生效。

CLI 暴露了 --top,但终端输出仍固定 most_common(25)main() 也没有把 args.top 传进去。现在 --top 30 这类命令不会改变任何输出。

🩹 建议修复
-def print_results(stats: dict, total_queries: int):
+def print_results(stats: dict, total_queries: int, top_n: int = 25):
     """终端打印统计结果"""
     steps = stats["steps"]
     total_steps = sum(steps.values())
     step_counts = stats["step_counts"]
@@
-    print("🏆 步骤分布 (Top 25)")
+    print(f"🏆 步骤分布 (Top {top_n})")
     print(f"{'─' * 70}")
-    sorted_steps = steps.most_common(25)
+    sorted_steps = steps.most_common(top_n)
@@
-    print_results(stats, total_queries)
+    print_results(stats, total_queries, args.top)

Also applies to: 359-392

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@text2gremlin/AST_Text2Gremlin/analyze_syntax.py` around lines 172 - 197, The
CLI --top option is ignored because print_results() hardcodes
steps.most_common(25) and main() does not pass args.top; update print_results to
accept a top:int (default 25) and use steps.most_common(top) when building
sorted_steps, and change all callers (including main() and the other call site
referenced around lines 359-392) to pass args.top (or the default) through to
print_results; keep existing behavior for print_bar, max_count calculation, and
preserve default=25 so CLI changes take effect.

Comment on lines +214 to +216
class BatchTranslationResult(BaseModel):
"""批量翻译结果"""
results: List[BatchTranslationItem] = Field(min_length=1)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

不要把缺失翻译静默记为成功。

这里的校验只保证 results / questions 非空,但不保证“返回条数 == 输入条数”或“每条 questions 数量 == num_questions”。一旦模型漏掉某几条,当前代码会直接把 description 填进 questions 且不打 _error,最终 success_count 还会把这些样本算作成功,训练集里也会混入并非“问题”的描述文本。

🩹 建议修复
                 # Pydantic 验证
                 validated = BatchTranslationResult(**data)
+                expected_indexes = set(range(1, len(items) + 1))
+                actual_indexes = {r.index for r in validated.results}
+                if actual_indexes != expected_indexes:
+                    raise ValueError(
+                        f"批次返回索引不完整: expected={sorted(expected_indexes)} actual={sorted(actual_indexes)}"
+                    )
+                if any(len(r.questions) != num_questions for r in validated.results):
+                    raise ValueError(f"批次返回的 questions 数量不等于 {num_questions}")
@@
                     else:
                         # 该条没有翻译结果,用描述兜底
                         results.append({
                             "query": item["query"],
                             "description": item["description"],
                             "questions": [item["description"]],
+                            "_error": "LLM 返回缺失该条结果,已回退为 description",
                         })

Also applies to: 262-287

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@text2gremlin/AST_Text2Gremlin/generalize_llm.py` around lines 214 - 216, The
BatchTranslationResult validation currently only enforces non-empty results but
doesn't ensure the returned entries match the input count or that each
BatchTranslationItem.questions length equals expected num_questions, which lets
missing translations be treated as successes; update the post-response
validation logic (around BatchTranslationResult / BatchTranslationItem handling
in generalize_llm.py and the similar block at lines ~262-287) to: (1) assert
that len(results) == len(input_descriptions) and for each item assert
len(item.questions) == num_questions, (2) when a mismatch or missing/empty
question is detected, populate item._error with a descriptive error and do not
increment success_count, and (3) surface/log these errors so the caller can
handle failures instead of silently treating them as successful translations.

Comment on lines +243 to +247
response = await client.chat.completions.create(
model=llm_config["model"],
messages=[{"role": "user", "content": prompt}],
temperature=llm_config["temperature"],
)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

cat -n text2gremlin/AST_Text2Gremlin/generalize_llm.py | sed -n '230,320p'

Repository: hugegraph/hugegraph-ai

Length of output: 4065


为外部 LLM 调用补上超时和传输层重试。

当前代码在调用 LLM API 时缺少超时机制,单次 create() 调用可能无限期挂起。同时,仅有 JSON 和验证错误会重试(第 291-304 行),而网络抖动、429 限流、网关超时等会被第 305-315 行的通用异常处理器捕获但直接失败,不会重试,导致单个网络故障即可使整批任务失败。

🩹 建议修复
-                response = await client.chat.completions.create(
-                    model=llm_config["model"],
-                    messages=[{"role": "user", "content": prompt}],
-                    temperature=llm_config["temperature"],
-                )
+                response = await asyncio.wait_for(
+                    client.chat.completions.create(
+                        model=llm_config["model"],
+                        messages=[{"role": "user", "content": prompt}],
+                        temperature=llm_config["temperature"],
+                    ),
+                    timeout=llm_config.get("request_timeout", 60),
+                )
@@
             except Exception as e:
-                # 非预期错误,不重试
-                return [
+                if attempt < max_retries - 1:
+                    await asyncio.sleep(min(2 ** attempt, 8))
+                    continue
+                return [

此外第 305 行的通用异常处理器应当包含指数退避重试,以处理临时性网络故障。

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@text2gremlin/AST_Text2Gremlin/generalize_llm.py` around lines 243 - 247, The
LLM call using client.chat.completions.create currently has no timeout and no
transport-layer retry/backoff; wrap that call in an async retry loop with
exponential backoff and jitter (e.g., retries for transient errors and status
codes 429, 502, 503, 504) and enforce a per-attempt timeout (use the client's
timeout option if available or asyncio.wait_for around
client.chat.completions.create). Catch transport/network exceptions (e.g.,
HTTP/connection errors from the HTTP client) and rate-limit responses, retry
with increasing delay, and preserve the existing JSON/validation error handling
paths in the surrounding code (keep the existing handlers in generalize_llm.py
but move the client.chat.completions.create invocation into the new
timed/retried wrapper to avoid unbounded hangs and add exponential backoff in
the general exception handler).

Comment thread text2gremlin/AST_Text2Gremlin/README.md Outdated
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 60 changed files in this pull request and generated 7 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +200 to +203
### 输出要求
1. 准确反映查询语义,不遗漏过滤条件、排序、限制数量等
2. 各风格表达方式要有明显差异,长度
3. 专有名词保持原样,不要出现 Gremlin 术语
Copy link

Copilot AI Mar 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

build_translation_prompt() 的 prompt 文本里第 2 条输出要求以“长度”结尾但没有写完(当前是“各风格表达方式要有明显差异,长度”),会让 LLM 约束不完整/歧义。建议补全该条要求(例如明确长度范围或“长度可不同但需自然”等)。

Copilot uses AI. Check for mistakes.
Comment on lines +184 to +186
if stats['generated_count'] > 5000:
stats['warning'] = f'由于本条模版的Recip复杂,生成了大量查询({stats["generated_count"]}条)'
elif new_pairs_count == 0 and stats['generated_count'] > 0:
Copy link

Copilot AI Mar 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里的警告信息里“Recip复杂”应为“Recipe复杂/配方复杂”。这是面向用户的输出文本,建议修正拼写以避免误解。

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +3
1,16
1,17
1,18
Copy link

Copilot AI Mar 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

该 CSV 文件缺少与其它 raw_data 文件一致的两行表头(LABEL/... 和 列定义行)。但 movie_schema.json 中对 edge_has_genre.csv 配置了 header: 2,Schema._parse_custom_csv 会尝试读取第 2 行作为列定义,导致 IndexError 并返回空 DataFrame,从而使 has_genre 边数据无法加载。建议:要么为该文件补齐两行表头,要么把 schema 中该文件的 header 改为 0/1 并与解析逻辑对齐。

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +11
# 配置文件
config.json

# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
*.egg-info/
.eggs/
Copy link

Copilot AI Mar 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

output/ 目录下提交了多份生成产物(如 generated_corpus_.json、llm_translated_.json、migrated_.json、text2gremlin_dataset_.json 等,其中包含多 MB 文件)。这类文件通常应由运行流水线本地生成并通过 .gitignore 排除,否则会显著膨胀仓库体积、增加 clone/CI 成本并引入频繁的无意义变更。建议将 output/(或至少 output/*.jsonoutput/preference_data/)加入 .gitignore,并从 PR 中移除这些生成文件。

Copilot uses AI. Check for mistakes.
Comment on lines +27 to +30
# 由于 AnonymousTraversal 包含 Step 对象,而 Step 将在 GremlinParse 中定义,
# 而 GremlinParse 又导入了本文件,因此使用前向声明避免循环导入问题。
'Step'

Copy link

Copilot AI Mar 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里的 'Step' 是一个无副作用的字符串字面量语句,实际不会起到前向声明/类型提示的作用,反而会让读者误以为有特殊含义。建议改用 from __future__ import annotations,或在 typing.TYPE_CHECKING 分支里导入 Step(并用引号注解),避免循环依赖的同时保持可读性。

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +44
aiohappyeyeballs==2.6.1
aiosignal==1.4.0
annotated-types==0.7.0
antlr4-python3-runtime==4.13.1
anyio==4.9.0
attrs==25.3.0
certifi==2025.7.14
contourpy==1.3.3
cycler==0.12.1
distro==1.9.0
dotenv==0.9.9
fonttools==4.59.2
frozenlist==1.7.0
h11==0.16.0
httpcore==1.0.9
httpx==0.28.1
idna==3.10
jiter==0.10.0
kiwisolver==1.4.9
matplotlib==3.10.5
multidict==6.6.4
numpy==2.3.1
nvidia-ml-py==12.575.51
nvitop==1.5.2
openai==1.96.0
packaging==25.0
pandas==2.3.1
pillow==11.3.0
propcache==0.3.2
psutil==7.0.0
pydantic==2.11.7
pydantic_core==2.33.2
pyparsing==3.2.3
python-dateutil==2.9.0.post0
python-dotenv==1.1.1
pytz==2025.2
six==1.17.0
sniffio==1.3.1
tenacity==9.1.2
tqdm==4.67.1
typing_extensions==4.14.1
typing-inspection==0.4.1
tzdata==2025.2
yarl==1.20.1
Copy link

Copilot AI Mar 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

requirements.txt 中包含多项当前代码未使用的依赖(例如 matplotlib、nvitop、nvidia-ml-py、dotenv/python-dotenv 等;仓库内未检索到相关 import)。这会增加安装体积与环境不确定性。建议删除未使用依赖,或将开发/监控类依赖拆分到可选的 requirements-dev.txt / extras 中。

Copilot uses AI. Check for mistakes.
Comment on lines +105 to +126
args, extra = parser.parse_known_args()

start_idx = STAGES.index(args.stage)
stop_idx = STAGES.index(args.stop) if args.stop else len(STAGES) - 1

if start_idx > stop_idx:
print(f"❌ --stage ({args.stage}) 不能在 --stop ({args.stop}) 之后")
sys.exit(1)

stages_to_run = STAGES[start_idx:stop_idx + 1]

print("=" * 60)
print("🚀 LLM 增强数据生成流水线")
print("=" * 60)
print(f" 执行阶段: {' → '.join(stages_to_run)}")
if extra:
print(f" 额外参数: {extra}")

for stage in stages_to_run:
rc = run_stage(stage, extra)
if rc != 0:
print(f"\n❌ 阶段 {stage} 失败 (exit code: {rc}),流水线中止")
Copy link

Copilot AI Mar 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

run_llm_pipeline.py 会把 parse_known_args() 收集到的 extra 参数原样传给每一个 stage 模块执行(translate/migrate/merge/dpo 都收到同一组参数)。但各 stage 的 argparse 选项集合不同(例如 generalize_llm 支持 --inputmerge_dataset 不支持),这会导致某些 stage 因“unrecognized arguments”直接退出。建议改为:为不同 stage 维护各自的参数(例如使用 --translate-arg ... / --migrate-arg ...,或在 pipeline CLI 中显式定义并按 stage 转发),或要求用户用 -- 分隔并只把其后的参数传给单个 stage。

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants