graphforge 0.3.9__tar.gz → 0.3.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/workflows/docs.yml +12 -10
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/workflows/test.yml +1 -1
- {graphforge-0.3.9 → graphforge-0.3.10}/.gitignore +4 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/CHANGELOG.md +15 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/Makefile +10 -1
- {graphforge-0.3.9 → graphforge-0.3.10}/PKG-INFO +11 -6
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/getting-started/installation.md +23 -2
- graphforge-0.3.10/docs/guide/analytics-integration.md +234 -0
- graphforge-0.3.10/docs/research/agent-grounding.md +719 -0
- graphforge-0.3.10/docs/research/kg-construction.md +731 -0
- graphforge-0.3.10/docs/research/llm-workflows.md +794 -0
- graphforge-0.3.10/docs/research/network-analysis.md +796 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/use-cases/agent-grounding.md +69 -48
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/use-cases/agent-tool-recall.md +112 -64
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/use-cases/knowledge-graph-construction.md +60 -7
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/use-cases/llm-workflows.md +100 -60
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/use-cases/network-analysis.md +41 -58
- {graphforge-0.3.9 → graphforge-0.3.10}/examples/05_migration_from_networkx.py +40 -24
- {graphforge-0.3.9 → graphforge-0.3.10}/mkdocs.yml +2 -5
- {graphforge-0.3.9 → graphforge-0.3.10}/pyproject.toml +22 -10
- graphforge-0.3.10/scripts/benchmark_neighbourhood.py +421 -0
- graphforge-0.3.10/scripts/benchmark_tool_registry.py +329 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/scripts/tck_perf_report.py +2 -2
- graphforge-0.3.10/scripts/validate_agent_snippets.py +1188 -0
- graphforge-0.3.10/scripts/validate_llm_snippets.py +916 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/__init__.py +3 -2
- graphforge-0.3.10/src/graphforge/_compat.py +14 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/api.py +744 -7
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/ast/expression.py +17 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/exporters/json_graph.py +7 -2
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/executor/executor.py +76 -1
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/optimizer/optimizer.py +13 -2
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/parser/cypher.lark +10 -1
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/parser/parser.py +27 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/planner/planner.py +27 -3
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/types/values.py +89 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_distinct_clause.py +45 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_exists_is_empty.py +76 -0
- graphforge-0.3.10/tests/integration/test_shortest_path.py +45 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_with_clause.py +69 -0
- graphforge-0.3.10/tests/unit/api/test_add_graph_documents.py +261 -0
- graphforge-0.3.10/tests/unit/api/test_analytics.py +366 -0
- graphforge-0.3.10/tests/unit/api/test_cache.py +220 -0
- graphforge-0.3.10/tests/unit/api/test_json_io.py +261 -0
- graphforge-0.3.10/tests/unit/api/test_merge_node.py +156 -0
- graphforge-0.3.10/tests/unit/api/test_schema_introspection.py +163 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_registry.py +21 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_unwind_limit_short_circuit.py +35 -1
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_redundant_elimination.py +53 -1
- graphforge-0.3.10/tests/unit/parser/test_shortest_path_parser.py +63 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_syntax_error_validation.py +10 -0
- graphforge-0.3.10/tests/unit/types/test_unwrap.py +179 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/uv.lock +437 -16
- {graphforge-0.3.9 → graphforge-0.3.10}/.codecov.yml +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.coderabbit.yaml +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.editorconfig +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/CODEOWNERS +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/ISSUE_WORKFLOW.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/SECURITY.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/dependabot.yml +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/pull_request_template.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/workflows/README.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/workflows/changelog-check.yml +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/workflows/pr-labeler.yml +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/workflows/publish.yaml +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.github/workflows/release-tracking.yml +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/.pre-commit-config.yaml +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/CHANGELOG_v0.3.0.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/CLAUDE.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/CODE_OF_CONDUCT.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/CONTRIBUTING.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/IMPLEMENTATION_PLAN.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/LICENSE +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/README.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/RELEASING.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/benchmarks/.gitkeep +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/coverage.json +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/architecture/ast-and-planning.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/architecture/execution-model.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/architecture/overview.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/architecture/storage-analysis.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/architecture/storage.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/community/code-of-conduct.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/community/security.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/cypher-guide.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/datasets/cypher-script-loading.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/datasets/ldbc.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/datasets/neo4j-examples.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/datasets/networkrepository.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/datasets/overview.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/datasets/snap.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/QUICKSTART_V0.2.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/codecov-integration.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/contributing.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/documentation-update-summary.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/parser-performance-analysis.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/perf-baseline-findings-v0.3.9.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/perf-v038-to-v039-delta.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/phase-1a-completion-report.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/release-process.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/release-strategy.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/requirements.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/session-2026-01-31-cicd-infrastructure.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/session-2026-01-31-documentation.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/session-2026-01-31-regression-fix.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/session-2026-01-31-with-clause.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/session-2026-02-01-codecov-setup.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/session-2026-02-01-column-naming-investigation.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/session-summary.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/tck-session-2026-01-31-final.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/tck-session-2026-01-31.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/tck_baseline_analysis_v0.3.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/testing-setup-complete.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/testing.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/v0.2-plan-summary.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/v0.4-revised-plan.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/workflow.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/getting-started/quickstart.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/getting-started/tutorial.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/guide/cypher-guide.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/guide/graph-construction.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/guide/overview.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/index.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/INCOMPLETE_FEATURES_ISSUES.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/README.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/RELEASE_TRACKING.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/VALIDATION_REPORT.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/api.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/changelog.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/column-naming-behavior.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/feature-aggregation-functions.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/feature-graph-queries.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/feature-graph-schema.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/feature-mapping/clause-to-tck.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/feature-mapping/function-to-tck.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/feature-order-by.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/feature-return-aliasing.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/implementation-status/clauses.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/implementation-status/functions.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/implementation-status/operators.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/implementation-status/patterns.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/opencypher-compatibility-matrix.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/opencypher-compatibility.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/opencypher-features/01-clauses.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/opencypher-features/02-functions.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/opencypher-features/03-operators.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/opencypher-features/04-patterns.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/opencypher-features/05-data-types.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/scale-limits.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/tck-compliance.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/tck-inventory.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/releases/implementation-summary.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/releases/next-steps.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/releases/phase-1-complete.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/releases/phase-2-complete.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/releases/phase-3-complete.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/releases/roadmap.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/docs/stylesheets/extra.css +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/examples/01_social_network.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/examples/02_knowledge_graph.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/examples/03_data_lineage.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/examples/04_citation_network.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/examples/agent_grounding/ecommerce_agent.ipynb +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/examples/basic_graph.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/examples/basic_usage.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/scripts/build_feature_graph.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/scripts/bump_version.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/scripts/check_release_needed.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/scripts/inventory_tck.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/scripts/perf_report.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/scripts/pre-push-check.sh +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/scripts/tck_metrics.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/scripts/validate_datasets.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/ast/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/ast/clause.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/ast/pattern.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/ast/query.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/base.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/data/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/data/networkrepository.json +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/data/snap.json +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/exporters/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/formats/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/formats/json_graph.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/compression.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/csv.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/cypher.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/graphml.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/json_graph.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/ldbc.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/ldbc_schema.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/registry.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/sources/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/sources/graphml.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/sources/json_graph.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/sources/ldbc.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/sources/networkrepository.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/sources/snap.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/executor/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/executor/evaluator.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/optimizer/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/optimizer/cost_model.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/optimizer/join_reorder.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/optimizer/predicate_utils.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/optimizer/statistics.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/parser/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/planner/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/planner/operators.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/planner/types.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/procedures/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/procedures/registry.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/storage/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/storage/memory.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/storage/pydantic_serialization.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/storage/serialization.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/storage/sqlite_backend.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/types/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/types/graph.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/README.md +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/conftest.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/conftest.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_compression.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_cypher_loader_docs.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_end_to_end_workflows.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_graphml_loader.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_json_graph_exporter.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_json_graph_loader.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_json_graph_roundtrip.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_ldbc_loader.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_networkrepository_loader.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/executor/test_graph_functions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_aggregation_edge_cases.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_aggregation_functions_advanced.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_anonymous_relationships.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_arithmetic.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_builder_api.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_call_procedures.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_call_subqueries.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_case_expressions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_collect.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_column_naming.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_compact_iso8601.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_complex_merge_patterns.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_complex_where_predicates.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_create_clause.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_create_edge_cases.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_delete_null.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_detach_delete.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_e2e_queries.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_executor_edge_cases.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_graph_element_comparison.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_hex_octal_literals.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_iana_timezones.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_id_function.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_issues_271_274.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_label_disjunction.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_label_predicate.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_list_comprehension.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_list_concatenation.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_list_functions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_list_operations.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_list_path_overloading.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_list_subscript.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_logical_operators.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_map_subscript.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_match_create.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_math_functions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_math_functions_extended.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_math_functions_new.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_merge_edge_cases.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_merge_on_create_real.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_merge_on_match_real.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_mixed_type_sort.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_nan_handling.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_null_handling.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_operator_precedence.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_optimizer_aggregate_pushdown.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_optimizer_integration.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_optimizer_redundant_elimination.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_optional_match.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_optional_match_delete.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_path_binding.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_path_binding_variable_length.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_path_functions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_pattern_comprehension.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_pattern_predicates.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_persistence.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_power_operator.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_predicate_functions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_properties_keys_functions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_relationship_directions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_relationship_uniqueness.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_remove_clause.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_set_delete_merge.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_size_function.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_skip_limit_expressions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_snap_dataset_loading.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_sort_after_aggregation.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_spatial_api.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_sqlite_persistence.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_startnode_endnode_functions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_string_functions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_string_functions_new.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_string_matching.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_subquery_expressions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_temporal_map_constructors.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_temporal_queries.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_temporal_select_into.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_transactions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_type_conversion_fixes.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_type_functions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_union.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_unwind.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_variable_length_paths.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_varlen_predicate_and_uniqueness.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_wildcard_execution.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_with_aggregation_real.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_with_clause_modifiers.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_with_clause_positions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_with_distinct_skip_limit.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_xor_operator.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/perf/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/perf/conftest.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/perf/test_real_datasets.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/property/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/property/strategies.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/conftest.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/coverage_matrix.json +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/download_tck.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/Aggregation1_BasicAggregation.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/Match1_SimpleMatches.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match7.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match8.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match9.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge7.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge8.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge9.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/remove/Remove1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/remove/Remove2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/remove/Remove3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return7.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return8.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/union/Union1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/union/Union2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/union/Union3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/unwind/Unwind1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With7.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere7.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation7.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation8.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/comparison/Comparison1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/comparison/Comparison2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/comparison/Comparison3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/comparison/Comparison4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/conditional/Conditional1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/conditional/Conditional2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph7.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph8.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph9.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List10.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List11.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List12.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List7.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List8.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List9.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals7.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals8.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/map/Map1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/map/Map2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/map/Map3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical10.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical11.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical12.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical13.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical14.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical15.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical16.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical17.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical7.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical8.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical9.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/null/Null1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/null/Null2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/null/Null3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/path/Path1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/path/Path2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/path/Path3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/pattern/Pattern1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/pattern/Pattern2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/precedence/Precedence1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/precedence/Precedence2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/precedence/Precedence3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/precedence/Precedence4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier10.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier11.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier12.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier7.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier8.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier9.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String10.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String11.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String12.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String13.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String14.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String7.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String8.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String9.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal10.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal7.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal8.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal9.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion2.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion3.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion4.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion5.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion6.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/useCases/countingSubgraphMatches/CountingSubgraphMatches1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/useCases/triadicSelection/TriadicSelection1.feature +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/graphs/binary-tree-1/binary-tree-1.cypher +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/graphs/binary-tree-1/binary-tree-1.json +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/graphs/binary-tree-2/binary-tree-2.cypher +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/graphs/binary-tree-2/binary-tree-2.json +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/graphs/named-graphs.adoc +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/tck_config.yaml +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/tck_markers.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/test_features.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/test_tck_compliance.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/api/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/api/test_api_coverage.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/api/test_bulk_ingest.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/api/test_clear.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/api/test_clone.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/api/test_cypher_value_conversion.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/ast/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/ast/test_ast_nodes.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/ast/test_expression_coverage.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_compression_coverage.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_csv_loader.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_cypher_loader.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_graphml_loader.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_json_graph_exporter.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_json_graph_format.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_json_graph_loader.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_ldbc_schema.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_networkrepository.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_snap_datasets.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_sources_registration.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_aggregation_errors.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_aggregation_functions_advanced.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_arithmetic_evaluator.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_element_id.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_evaluator.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_evaluator_additional_coverage.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_evaluator_coverage_boost.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_evaluator_error_paths.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_executor_coverage_boost.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_executor_error_paths.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_expression_matching.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_expressions_match.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_graph_functions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_id_function.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_in_operator.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_infer_rel_var.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_limit_short_circuit.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_list_functions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_list_functions_errors.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_map_property_access.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_merge_on_create.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_merge_on_match.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_multihop_create.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_optional_expand_bound_dst.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_optional_scan_coverage.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_parenthesized_expr_coverage.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_path_functions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_procedure_call_executor.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_properties_keys_errors.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_property_index_executor.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_set_extensions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_sort_edge_cases.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_spatial_functions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_startnode_endnode_errors.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_string_functions_new.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_string_matching_evaluator.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_subquery_planner_check.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_temporal_functions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_temporal_truncate_arithmetic.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_three_valued_logic.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_type_conversion_complex.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_undirected_relationship_bugs.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_with_aggregation.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_aggregate_pushdown.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_cost_model.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_filter_pushdown.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_join_reorder.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_join_reorder_coverage.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_optimizer_coverage.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_optimizer_reuse.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_predicate_reorder.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_predicate_utils.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_predicate_utils_coverage.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_statistics.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_arithmetic_parser.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_call_procedure_parser.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_case_parser.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_collect_parser.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_delete_parser.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_float_literals.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_grammar.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_hex_octal_literals.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_label_predicate_parser.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_merge_on_create.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_merge_on_match.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_optional_match_delete.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_order_by_direction.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_parser.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_parser_caching.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_parser_coverage_boost.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_path_binding.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_pattern_comprehension_binding.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_pattern_predicates.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_remove_parser.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_string_matching_parser.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_wildcard_parsing.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_with_at_query_start.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_with_clause_positions.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_call_procedure_planner.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_expand_multi_hop_operator.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_operator_validation.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_operators.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_planner_branch_coverage.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_planner_comprehensive.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_planner_edge_cases.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_remove_planner.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_type_tracking.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_with_validation.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/procedures/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/procedures/test_registry.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/__init__.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_graph_edge_cases.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_memory_store.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_property_index.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_pydantic_serialization.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_serialization_edge_cases.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_spatial_serialization.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_sqlite_backend_adjacency.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_sqlite_backend_delete_bulk.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_storage_coverage.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_temporal_serialization.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/test_graph_elements.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/test_iana_timezone_construction.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/test_procedure_registry_coverage.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/test_values.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/types/test_cypher_values_deep_equality.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/types/test_cypher_values_edge_cases.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/types/test_extreme_temporal_values.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/types/test_graph_element_edge_cases.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/types/test_path_values.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/types/test_spatial_values.py +0 -0
- {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/types/test_temporal_values.py +0 -0
|
@@ -6,12 +6,15 @@ on:
|
|
|
6
6
|
paths:
|
|
7
7
|
- 'docs/**'
|
|
8
8
|
- 'mkdocs.yml'
|
|
9
|
+
- 'src/graphforge/**'
|
|
10
|
+
- 'pyproject.toml'
|
|
9
11
|
- '.github/workflows/docs.yml'
|
|
10
12
|
pull_request:
|
|
11
13
|
branches: [main]
|
|
12
14
|
paths:
|
|
13
15
|
- 'docs/**'
|
|
14
16
|
- 'mkdocs.yml'
|
|
17
|
+
- 'src/graphforge/**'
|
|
15
18
|
workflow_dispatch:
|
|
16
19
|
|
|
17
20
|
permissions:
|
|
@@ -19,7 +22,6 @@ permissions:
|
|
|
19
22
|
pages: write
|
|
20
23
|
id-token: write
|
|
21
24
|
|
|
22
|
-
# Allow only one concurrent deployment
|
|
23
25
|
concurrency:
|
|
24
26
|
group: pages
|
|
25
27
|
cancel-in-progress: false
|
|
@@ -28,30 +30,30 @@ jobs:
|
|
|
28
30
|
build:
|
|
29
31
|
name: Build Documentation
|
|
30
32
|
runs-on: ubuntu-latest
|
|
31
|
-
|
|
32
33
|
steps:
|
|
33
|
-
- name: Checkout
|
|
34
|
+
- name: Checkout
|
|
34
35
|
uses: actions/checkout@v6
|
|
35
36
|
with:
|
|
36
|
-
fetch-depth: 0
|
|
37
|
+
fetch-depth: 0
|
|
37
38
|
|
|
38
39
|
- name: Install uv
|
|
39
40
|
uses: astral-sh/setup-uv@v8.1.0
|
|
41
|
+
with:
|
|
42
|
+
enable-cache: true
|
|
40
43
|
|
|
41
44
|
- name: Set up Python
|
|
42
45
|
uses: actions/setup-python@v6
|
|
43
46
|
with:
|
|
44
47
|
python-version: '3.12'
|
|
45
48
|
|
|
46
|
-
- name: Install
|
|
47
|
-
run:
|
|
48
|
-
uv pip install --system -e ".[docs]"
|
|
49
|
+
- name: Install docs dependencies
|
|
50
|
+
run: uv sync --group docs
|
|
49
51
|
|
|
50
52
|
- name: Build documentation
|
|
51
|
-
run: mkdocs build --strict
|
|
53
|
+
run: uv run mkdocs build --strict
|
|
52
54
|
|
|
53
55
|
- name: Upload Pages artifact
|
|
54
|
-
if:
|
|
56
|
+
if: github.event_name != 'pull_request'
|
|
55
57
|
uses: actions/upload-pages-artifact@v5
|
|
56
58
|
with:
|
|
57
59
|
path: site/
|
|
@@ -59,7 +61,7 @@ jobs:
|
|
|
59
61
|
deploy:
|
|
60
62
|
name: Deploy to GitHub Pages
|
|
61
63
|
needs: build
|
|
62
|
-
if:
|
|
64
|
+
if: github.event_name != 'pull_request'
|
|
63
65
|
runs-on: ubuntu-latest
|
|
64
66
|
|
|
65
67
|
environment:
|
|
@@ -266,7 +266,7 @@ jobs:
|
|
|
266
266
|
|
|
267
267
|
- name: Report TCK performance metrics
|
|
268
268
|
if: always()
|
|
269
|
-
run: uv run python3 scripts/tck_perf_report.py test-results-tck.xml --threshold
|
|
269
|
+
run: uv run python3 scripts/tck_perf_report.py test-results-tck.xml --threshold 2
|
|
270
270
|
|
|
271
271
|
- name: Upload TCK results to Codecov
|
|
272
272
|
uses: codecov/codecov-action@v6
|
|
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.3.10] - 2026-05-06
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Schema introspection API** (#469, #499) — `labels()`, `relationship_types()`, `node_count(label=None)`, `relationship_count(type=None)` on `GraphForge`; efficient set-union over storage backend
|
|
14
|
+
- **JSON export/import** (#470, #500) — `gf.to_json(path, metadata, indent)` serialises the full graph to a portable JSON file; `GraphForge.from_json(path)` reconstructs it; Hypothesis roundtrip property test
|
|
15
|
+
- **`merge_node()` safe upsert** (#471, #501) — `merge_node(labels, match_on, on_create, on_match)` with regex label validation, index-safe on_match updates, and create/match semantics matching MERGE clause behaviour
|
|
16
|
+
- **`add_graph_documents()` LangChain-compatible ingestion** (#472, #502) — duck-typed batch ingestion accepting any object with `.nodes`/`.relationships` attributes; idempotent edges; rel type pre-check; no `langchain-community` import required
|
|
17
|
+
- **Parse/plan LRU cache** (#464, #504) — `GraphForge(cache_size=N)` caches parsed+planned query pipelines; `clear_cache()` and `cache_info()` for introspection; thread-safe; default size 128
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
- **ORDER BY on aliased RETURN DISTINCT property no longer raises UndefinedVariable** (#481, #494) — planner now records `(variable, property)` paths for aliased `PropertyAccess` return items, so `RETURN DISTINCT a.year AS year ORDER BY a.year` resolves correctly
|
|
21
|
+
- **Variable reuse across WITH boundary no longer raises KeyError** (#482, #495) — optimizer's redundant-traversal-elimination pass now treats `Aggregate` as a scope boundary (same as `With`/`Union`/`Subquery`), preventing fresh post-WITH variable bindings from being silently dropped
|
|
22
|
+
- **EXISTS {} subquery crash on anonymous inner node with outer-scope property** (#474, #496) — `_plan_match` now passes `var_name` (always set, from pattern variable or generated) instead of `node_pattern.variable` (can be None) to `_properties_to_predicate`
|
|
23
|
+
- **`shortestPath()` / `allShortestPaths()` parse correctly and raise NotImplementedError** (#468, #497) — previously caused unhelpful `SyntaxError: Unexpected token`; now parsed into `ShortestPathExpression` AST nodes; planner raises `NotImplementedError` with BFS workaround: `MATCH path = (a)-[*1..N]-(b) RETURN length(path) ORDER BY length(path) LIMIT 1`
|
|
24
|
+
|
|
10
25
|
## [0.3.9] - 2026-05-04
|
|
11
26
|
|
|
12
27
|
### Added
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
.PHONY: help lint format type-check security test pre-push pre-push-fast clean test-tck docstring-coverage test-network test-perf test-perf-xs test-perf-slow test-perf-large coverage coverage-quick coverage-report coverage-diff coverage-strict check-coverage check-patch-coverage test-durations test-analytics
|
|
1
|
+
.PHONY: help lint format type-check security test pre-push pre-push-fast clean test-tck docstring-coverage test-network test-perf test-perf-xs test-perf-slow test-perf-large coverage coverage-quick coverage-report coverage-diff coverage-strict check-coverage check-patch-coverage test-durations test-analytics docs-serve docs-build docs-clean
|
|
2
2
|
|
|
3
3
|
help: ## Show this help message
|
|
4
4
|
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
|
|
@@ -178,3 +178,12 @@ clean: ## Clean up cache files
|
|
|
178
178
|
find . -type f -name "*.pyc" -delete 2>/dev/null || true
|
|
179
179
|
rm -f test-results*.xml coverage.xml 2>/dev/null || true
|
|
180
180
|
rm -rf htmlcov/ 2>/dev/null || true
|
|
181
|
+
|
|
182
|
+
docs-serve: ## Serve docs locally with live reload (http://127.0.0.1:8000)
|
|
183
|
+
uv run --group docs mkdocs serve
|
|
184
|
+
|
|
185
|
+
docs-build: ## Build docs site to site/ (strict mode)
|
|
186
|
+
uv run --group docs mkdocs build --strict
|
|
187
|
+
|
|
188
|
+
docs-clean: ## Remove built docs
|
|
189
|
+
rm -rf site/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: graphforge
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.10
|
|
4
4
|
Summary: Composable graph tooling for analysis, construction, and refinement
|
|
5
5
|
Project-URL: Homepage, https://github.com/DecisionNerd/graphforge
|
|
6
6
|
Project-URL: Repository, https://github.com/DecisionNerd/graphforge
|
|
@@ -29,6 +29,10 @@ Requires-Dist: msgpack>=1.0
|
|
|
29
29
|
Requires-Dist: pydantic>=2.6
|
|
30
30
|
Requires-Dist: python-dateutil>=2.8.2
|
|
31
31
|
Requires-Dist: pyyaml>=6.0.3
|
|
32
|
+
Provides-Extra: analytics
|
|
33
|
+
Requires-Dist: networkx>=3.0; extra == 'analytics'
|
|
34
|
+
Requires-Dist: pandas>=2.0; extra == 'analytics'
|
|
35
|
+
Requires-Dist: python-igraph>=0.11; extra == 'analytics'
|
|
32
36
|
Provides-Extra: dev
|
|
33
37
|
Requires-Dist: hypothesis>=6.0; extra == 'dev'
|
|
34
38
|
Requires-Dist: pytest-bdd>=7.0; extra == 'dev'
|
|
@@ -39,11 +43,12 @@ Requires-Dist: pytest-timeout>=2.0; extra == 'dev'
|
|
|
39
43
|
Requires-Dist: pytest-xdist>=3.0; extra == 'dev'
|
|
40
44
|
Requires-Dist: pytest>=9.0.3; extra == 'dev'
|
|
41
45
|
Requires-Dist: ruff==0.15.12; extra == 'dev'
|
|
42
|
-
Provides-Extra:
|
|
43
|
-
Requires-Dist:
|
|
44
|
-
|
|
45
|
-
Requires-Dist:
|
|
46
|
-
|
|
46
|
+
Provides-Extra: igraph
|
|
47
|
+
Requires-Dist: python-igraph>=0.11; extra == 'igraph'
|
|
48
|
+
Provides-Extra: networkx
|
|
49
|
+
Requires-Dist: networkx>=3.0; extra == 'networkx'
|
|
50
|
+
Provides-Extra: pandas
|
|
51
|
+
Requires-Dist: pandas>=2.0; extra == 'pandas'
|
|
47
52
|
Description-Content-Type: text/markdown
|
|
48
53
|
|
|
49
54
|
<h1 align="center">GraphForge</h1>
|
|
@@ -18,14 +18,35 @@ uv add graphforge
|
|
|
18
18
|
|
|
19
19
|
```python
|
|
20
20
|
import graphforge
|
|
21
|
-
print(graphforge.__version__) # 0.3.
|
|
21
|
+
print(graphforge.__version__) # 0.3.10
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
## Optional dependencies
|
|
25
25
|
|
|
26
|
+
GraphForge ships optional extras for analytics workflows. Install only what
|
|
27
|
+
you need:
|
|
28
|
+
|
|
26
29
|
```bash
|
|
30
|
+
# pandas DataFrame export — db.to_dataframe()
|
|
31
|
+
pip install "graphforge[pandas]"
|
|
32
|
+
|
|
33
|
+
# NetworkX export — db.to_networkx()
|
|
34
|
+
pip install "graphforge[networkx]"
|
|
35
|
+
|
|
36
|
+
# igraph export — db.to_igraph()
|
|
37
|
+
pip install "graphforge[igraph]"
|
|
38
|
+
|
|
39
|
+
# All analytics extras at once (pandas + networkx + igraph)
|
|
40
|
+
pip install "graphforge[analytics]"
|
|
41
|
+
|
|
27
42
|
# Zstandard compression for LDBC .tar.zst datasets
|
|
28
|
-
pip install zstandard
|
|
43
|
+
pip install "graphforge[zstandard]"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
With uv:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
uv add "graphforge[analytics]"
|
|
29
50
|
```
|
|
30
51
|
|
|
31
52
|
## Install from source
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# Analytics Integration
|
|
2
|
+
|
|
3
|
+
GraphForge ships four export methods that bridge the gap between its Cypher query engine
|
|
4
|
+
and the Python analytics stack. All four unwrap `CypherValue` objects automatically —
|
|
5
|
+
you get plain Python types, not wrappers.
|
|
6
|
+
|
|
7
|
+
| Method | Returns | Requires |
|
|
8
|
+
|--------|---------|----------|
|
|
9
|
+
| `db.to_dicts(query)` | `list[dict[str, Any]]` | nothing |
|
|
10
|
+
| `db.to_dataframe(query)` | `pandas.DataFrame` | `pip install "graphforge[pandas]"` |
|
|
11
|
+
| `db.to_networkx(...)` | `networkx.DiGraph` | `pip install "graphforge[networkx]"` |
|
|
12
|
+
| `db.to_igraph(...)` | `igraph.Graph` | `pip install "graphforge[igraph]"` |
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## `to_dicts()` — plain Python dicts
|
|
17
|
+
|
|
18
|
+
The simplest export. Runs a Cypher query and returns a list of dicts with all
|
|
19
|
+
`CypherValue` wrappers unwrapped to their Python equivalents.
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
from graphforge import GraphForge
|
|
23
|
+
|
|
24
|
+
db = GraphForge()
|
|
25
|
+
db.execute("CREATE (:Person {name: 'Alice', age: 30})-[:KNOWS]->(:Person {name: 'Bob', age: 25})")
|
|
26
|
+
|
|
27
|
+
rows = db.to_dicts("MATCH (n:Person) RETURN n.name AS name, n.age AS age ORDER BY name")
|
|
28
|
+
# [{'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}]
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`to_dicts()` is the preferred pattern for agent loops and LLM workflows — it saves
|
|
32
|
+
boilerplate `.value` accesses with zero overhead vs `execute()`.
|
|
33
|
+
|
|
34
|
+
Optional parameters dict:
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
rows = db.to_dicts(
|
|
38
|
+
"MATCH (n:Person) WHERE n.age > $min_age RETURN n.name AS name",
|
|
39
|
+
{"min_age": 28},
|
|
40
|
+
)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## `to_dataframe()` — pandas DataFrame
|
|
46
|
+
|
|
47
|
+
Runs a query and returns a `pandas.DataFrame`. Column names come from `RETURN`
|
|
48
|
+
aliases; types follow standard pandas inference.
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
import matplotlib.pyplot as plt
|
|
52
|
+
|
|
53
|
+
db = GraphForge("facebook.db")
|
|
54
|
+
|
|
55
|
+
df = db.to_dataframe("""
|
|
56
|
+
MATCH (n:Node)
|
|
57
|
+
WHERE n.degree IS NOT NULL
|
|
58
|
+
RETURN n.degree AS degree
|
|
59
|
+
ORDER BY degree
|
|
60
|
+
""")
|
|
61
|
+
|
|
62
|
+
df["degree"].value_counts().sort_index().plot(
|
|
63
|
+
kind="bar", logy=True,
|
|
64
|
+
title="Degree Distribution",
|
|
65
|
+
xlabel="Degree", ylabel="Nodes",
|
|
66
|
+
figsize=(12, 4),
|
|
67
|
+
)
|
|
68
|
+
plt.tight_layout()
|
|
69
|
+
plt.savefig("degree_distribution.png", dpi=150)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Aggregate statistics
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
stats = db.to_dataframe("""
|
|
76
|
+
MATCH (n:Node)
|
|
77
|
+
WHERE n.degree IS NOT NULL
|
|
78
|
+
RETURN
|
|
79
|
+
count(n) AS total_nodes,
|
|
80
|
+
avg(n.degree) AS avg_degree,
|
|
81
|
+
max(n.degree) AS max_degree,
|
|
82
|
+
stDev(n.degree) AS std_degree
|
|
83
|
+
""")
|
|
84
|
+
print(stats.to_string(index=False))
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## `to_networkx()` — NetworkX DiGraph
|
|
90
|
+
|
|
91
|
+
Exports the full graph (or a filtered subset) as a `networkx.DiGraph`. Node
|
|
92
|
+
attributes include all properties plus `_labels` (list of label strings). Edge
|
|
93
|
+
attributes include all properties plus `_type` (relationship type string).
|
|
94
|
+
|
|
95
|
+
```python
|
|
96
|
+
import networkx as nx
|
|
97
|
+
|
|
98
|
+
G = db.to_networkx()
|
|
99
|
+
print(f"Nodes: {G.number_of_nodes()}, Edges: {G.number_of_edges()}")
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Filter by label and relationship type
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
# Export only Person nodes and KNOWS edges
|
|
106
|
+
G_social = db.to_networkx(node_label="Person", rel_type="KNOWS")
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Run NetworkX algorithms
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
# Degree centrality
|
|
113
|
+
centrality = nx.degree_centrality(G_social)
|
|
114
|
+
|
|
115
|
+
# PageRank
|
|
116
|
+
pr = nx.pagerank(G_social)
|
|
117
|
+
|
|
118
|
+
# Clustering coefficient (undirected)
|
|
119
|
+
cc = nx.average_clustering(G_social.to_undirected())
|
|
120
|
+
print(f"Avg clustering: {cc:.4f}")
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Write algorithm results back to GraphForge
|
|
124
|
+
|
|
125
|
+
NetworkX node IDs are GraphForge internal integers. Use an UNWIND loop to
|
|
126
|
+
write results back:
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
import json
|
|
130
|
+
|
|
131
|
+
pr_list = [{"node_id": nid, "pagerank": score} for nid, score in pr.items()]
|
|
132
|
+
|
|
133
|
+
db.execute(
|
|
134
|
+
"UNWIND $rows AS row "
|
|
135
|
+
"MATCH (n) WHERE id(n) = row.node_id "
|
|
136
|
+
"SET n.pagerank = row.pagerank",
|
|
137
|
+
{"rows": pr_list},
|
|
138
|
+
)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
> **Performance note:** Per-node UNWIND write-back is slow above ~5 K nodes
|
|
142
|
+
> because each iteration parses and executes one `SET`. For large graphs,
|
|
143
|
+
> compute metrics in NetworkX/igraph and store aggregated summaries rather than
|
|
144
|
+
> per-node scores.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## `to_igraph()` — igraph Graph
|
|
149
|
+
|
|
150
|
+
igraph is significantly faster than NetworkX for most graph algorithms:
|
|
151
|
+
betweenness ~130× faster, Louvain ~12×, transitivity ~170×. Prefer igraph for
|
|
152
|
+
performance-sensitive analysis.
|
|
153
|
+
|
|
154
|
+
```python
|
|
155
|
+
import igraph as ig
|
|
156
|
+
|
|
157
|
+
G = db.to_igraph()
|
|
158
|
+
print(f"Nodes: {G.vcount()}, Edges: {G.ecount()}")
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Filter by label and relationship type
|
|
162
|
+
|
|
163
|
+
```python
|
|
164
|
+
G_social = db.to_igraph(node_label="Person", rel_type="KNOWS")
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Community detection (Louvain)
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
G_undirected = G_social.as_undirected()
|
|
171
|
+
communities = G_undirected.community_multilevel()
|
|
172
|
+
print(f"Found {len(communities)} communities")
|
|
173
|
+
print(f"Modularity: {communities.modularity:.4f}")
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Betweenness centrality
|
|
177
|
+
|
|
178
|
+
```python
|
|
179
|
+
betweenness = G_social.betweenness(directed=False)
|
|
180
|
+
top5 = sorted(zip(betweenness, range(G_social.vcount())), reverse=True)[:5]
|
|
181
|
+
for score, vid in top5:
|
|
182
|
+
print(f" vertex {vid} betweenness={score:.1f}")
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Choosing Between Methods
|
|
188
|
+
|
|
189
|
+
| Scenario | Method |
|
|
190
|
+
|----------|--------|
|
|
191
|
+
| Agent loop / LLM context building | `to_dicts()` |
|
|
192
|
+
| Tabular analysis, plotting | `to_dataframe()` |
|
|
193
|
+
| PageRank, shortest-path algorithms | `to_networkx()` |
|
|
194
|
+
| Betweenness, Louvain, large graphs | `to_igraph()` |
|
|
195
|
+
| Full graph → files / downstream systems | `to_json()` |
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## JSON Export and Import
|
|
200
|
+
|
|
201
|
+
`to_json()` / `from_json()` serialise the full graph to the JSON Graph Format
|
|
202
|
+
for sharing, archiving, or loading into other tools.
|
|
203
|
+
|
|
204
|
+
```python
|
|
205
|
+
# Export
|
|
206
|
+
db.to_json("graph.json", metadata={"source": "pipeline-v2", "date": "2026-05-05"})
|
|
207
|
+
|
|
208
|
+
# Import into a fresh instance
|
|
209
|
+
from graphforge import GraphForge
|
|
210
|
+
db2 = GraphForge.from_json("graph.json")
|
|
211
|
+
print(db2.node_count(), db2.relationship_count())
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Schema Introspection
|
|
217
|
+
|
|
218
|
+
```python
|
|
219
|
+
print(db.labels()) # ['Organisation', 'Person', 'Technology']
|
|
220
|
+
print(db.relationship_types()) # ['DEPENDS_ON', 'KNOWS', 'RUNS_ON']
|
|
221
|
+
print(db.node_count()) # 42
|
|
222
|
+
print(db.node_count("Person")) # 15
|
|
223
|
+
print(db.relationship_count()) # 67
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Next Steps
|
|
229
|
+
|
|
230
|
+
- [Network Analysis use case](../use-cases/network-analysis.md) — worked examples
|
|
231
|
+
on the SNAP ego-Facebook dataset
|
|
232
|
+
- [Knowledge Graph Construction](../use-cases/knowledge-graph-construction.md) —
|
|
233
|
+
LangChain integration and MERGE patterns
|
|
234
|
+
- [API Reference](../reference/api.md) — full method signatures
|