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.
Files changed (709) hide show
  1. {graphforge-0.3.9 → graphforge-0.3.10}/.github/workflows/docs.yml +12 -10
  2. {graphforge-0.3.9 → graphforge-0.3.10}/.github/workflows/test.yml +1 -1
  3. {graphforge-0.3.9 → graphforge-0.3.10}/.gitignore +4 -0
  4. {graphforge-0.3.9 → graphforge-0.3.10}/CHANGELOG.md +15 -0
  5. {graphforge-0.3.9 → graphforge-0.3.10}/Makefile +10 -1
  6. {graphforge-0.3.9 → graphforge-0.3.10}/PKG-INFO +11 -6
  7. {graphforge-0.3.9 → graphforge-0.3.10}/docs/getting-started/installation.md +23 -2
  8. graphforge-0.3.10/docs/guide/analytics-integration.md +234 -0
  9. graphforge-0.3.10/docs/research/agent-grounding.md +719 -0
  10. graphforge-0.3.10/docs/research/kg-construction.md +731 -0
  11. graphforge-0.3.10/docs/research/llm-workflows.md +794 -0
  12. graphforge-0.3.10/docs/research/network-analysis.md +796 -0
  13. {graphforge-0.3.9 → graphforge-0.3.10}/docs/use-cases/agent-grounding.md +69 -48
  14. {graphforge-0.3.9 → graphforge-0.3.10}/docs/use-cases/agent-tool-recall.md +112 -64
  15. {graphforge-0.3.9 → graphforge-0.3.10}/docs/use-cases/knowledge-graph-construction.md +60 -7
  16. {graphforge-0.3.9 → graphforge-0.3.10}/docs/use-cases/llm-workflows.md +100 -60
  17. {graphforge-0.3.9 → graphforge-0.3.10}/docs/use-cases/network-analysis.md +41 -58
  18. {graphforge-0.3.9 → graphforge-0.3.10}/examples/05_migration_from_networkx.py +40 -24
  19. {graphforge-0.3.9 → graphforge-0.3.10}/mkdocs.yml +2 -5
  20. {graphforge-0.3.9 → graphforge-0.3.10}/pyproject.toml +22 -10
  21. graphforge-0.3.10/scripts/benchmark_neighbourhood.py +421 -0
  22. graphforge-0.3.10/scripts/benchmark_tool_registry.py +329 -0
  23. {graphforge-0.3.9 → graphforge-0.3.10}/scripts/tck_perf_report.py +2 -2
  24. graphforge-0.3.10/scripts/validate_agent_snippets.py +1188 -0
  25. graphforge-0.3.10/scripts/validate_llm_snippets.py +916 -0
  26. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/__init__.py +3 -2
  27. graphforge-0.3.10/src/graphforge/_compat.py +14 -0
  28. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/api.py +744 -7
  29. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/ast/expression.py +17 -0
  30. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/exporters/json_graph.py +7 -2
  31. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/executor/executor.py +76 -1
  32. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/optimizer/optimizer.py +13 -2
  33. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/parser/cypher.lark +10 -1
  34. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/parser/parser.py +27 -0
  35. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/planner/planner.py +27 -3
  36. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/types/values.py +89 -0
  37. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_distinct_clause.py +45 -0
  38. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_exists_is_empty.py +76 -0
  39. graphforge-0.3.10/tests/integration/test_shortest_path.py +45 -0
  40. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_with_clause.py +69 -0
  41. graphforge-0.3.10/tests/unit/api/test_add_graph_documents.py +261 -0
  42. graphforge-0.3.10/tests/unit/api/test_analytics.py +366 -0
  43. graphforge-0.3.10/tests/unit/api/test_cache.py +220 -0
  44. graphforge-0.3.10/tests/unit/api/test_json_io.py +261 -0
  45. graphforge-0.3.10/tests/unit/api/test_merge_node.py +156 -0
  46. graphforge-0.3.10/tests/unit/api/test_schema_introspection.py +163 -0
  47. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_registry.py +21 -0
  48. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_unwind_limit_short_circuit.py +35 -1
  49. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_redundant_elimination.py +53 -1
  50. graphforge-0.3.10/tests/unit/parser/test_shortest_path_parser.py +63 -0
  51. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_syntax_error_validation.py +10 -0
  52. graphforge-0.3.10/tests/unit/types/test_unwrap.py +179 -0
  53. {graphforge-0.3.9 → graphforge-0.3.10}/uv.lock +437 -16
  54. {graphforge-0.3.9 → graphforge-0.3.10}/.codecov.yml +0 -0
  55. {graphforge-0.3.9 → graphforge-0.3.10}/.coderabbit.yaml +0 -0
  56. {graphforge-0.3.9 → graphforge-0.3.10}/.editorconfig +0 -0
  57. {graphforge-0.3.9 → graphforge-0.3.10}/.github/CODEOWNERS +0 -0
  58. {graphforge-0.3.9 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  59. {graphforge-0.3.9 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  60. {graphforge-0.3.9 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  61. {graphforge-0.3.9 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  62. {graphforge-0.3.9 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  63. {graphforge-0.3.9 → graphforge-0.3.10}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  64. {graphforge-0.3.9 → graphforge-0.3.10}/.github/ISSUE_WORKFLOW.md +0 -0
  65. {graphforge-0.3.9 → graphforge-0.3.10}/.github/SECURITY.md +0 -0
  66. {graphforge-0.3.9 → graphforge-0.3.10}/.github/dependabot.yml +0 -0
  67. {graphforge-0.3.9 → graphforge-0.3.10}/.github/pull_request_template.md +0 -0
  68. {graphforge-0.3.9 → graphforge-0.3.10}/.github/workflows/README.md +0 -0
  69. {graphforge-0.3.9 → graphforge-0.3.10}/.github/workflows/changelog-check.yml +0 -0
  70. {graphforge-0.3.9 → graphforge-0.3.10}/.github/workflows/pr-labeler.yml +0 -0
  71. {graphforge-0.3.9 → graphforge-0.3.10}/.github/workflows/publish.yaml +0 -0
  72. {graphforge-0.3.9 → graphforge-0.3.10}/.github/workflows/release-tracking.yml +0 -0
  73. {graphforge-0.3.9 → graphforge-0.3.10}/.pre-commit-config.yaml +0 -0
  74. {graphforge-0.3.9 → graphforge-0.3.10}/CHANGELOG_v0.3.0.md +0 -0
  75. {graphforge-0.3.9 → graphforge-0.3.10}/CLAUDE.md +0 -0
  76. {graphforge-0.3.9 → graphforge-0.3.10}/CODE_OF_CONDUCT.md +0 -0
  77. {graphforge-0.3.9 → graphforge-0.3.10}/CONTRIBUTING.md +0 -0
  78. {graphforge-0.3.9 → graphforge-0.3.10}/IMPLEMENTATION_PLAN.md +0 -0
  79. {graphforge-0.3.9 → graphforge-0.3.10}/LICENSE +0 -0
  80. {graphforge-0.3.9 → graphforge-0.3.10}/README.md +0 -0
  81. {graphforge-0.3.9 → graphforge-0.3.10}/RELEASING.md +0 -0
  82. {graphforge-0.3.9 → graphforge-0.3.10}/benchmarks/.gitkeep +0 -0
  83. {graphforge-0.3.9 → graphforge-0.3.10}/coverage.json +0 -0
  84. {graphforge-0.3.9 → graphforge-0.3.10}/docs/architecture/ast-and-planning.md +0 -0
  85. {graphforge-0.3.9 → graphforge-0.3.10}/docs/architecture/execution-model.md +0 -0
  86. {graphforge-0.3.9 → graphforge-0.3.10}/docs/architecture/overview.md +0 -0
  87. {graphforge-0.3.9 → graphforge-0.3.10}/docs/architecture/storage-analysis.md +0 -0
  88. {graphforge-0.3.9 → graphforge-0.3.10}/docs/architecture/storage.md +0 -0
  89. {graphforge-0.3.9 → graphforge-0.3.10}/docs/community/code-of-conduct.md +0 -0
  90. {graphforge-0.3.9 → graphforge-0.3.10}/docs/community/security.md +0 -0
  91. {graphforge-0.3.9 → graphforge-0.3.10}/docs/cypher-guide.md +0 -0
  92. {graphforge-0.3.9 → graphforge-0.3.10}/docs/datasets/cypher-script-loading.md +0 -0
  93. {graphforge-0.3.9 → graphforge-0.3.10}/docs/datasets/ldbc.md +0 -0
  94. {graphforge-0.3.9 → graphforge-0.3.10}/docs/datasets/neo4j-examples.md +0 -0
  95. {graphforge-0.3.9 → graphforge-0.3.10}/docs/datasets/networkrepository.md +0 -0
  96. {graphforge-0.3.9 → graphforge-0.3.10}/docs/datasets/overview.md +0 -0
  97. {graphforge-0.3.9 → graphforge-0.3.10}/docs/datasets/snap.md +0 -0
  98. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/QUICKSTART_V0.2.md +0 -0
  99. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/codecov-integration.md +0 -0
  100. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/contributing.md +0 -0
  101. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/documentation-update-summary.md +0 -0
  102. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/parser-performance-analysis.md +0 -0
  103. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/perf-baseline-findings-v0.3.9.md +0 -0
  104. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/perf-v038-to-v039-delta.md +0 -0
  105. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/phase-1a-completion-report.md +0 -0
  106. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/release-process.md +0 -0
  107. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/release-strategy.md +0 -0
  108. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/requirements.md +0 -0
  109. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/session-2026-01-31-cicd-infrastructure.md +0 -0
  110. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/session-2026-01-31-documentation.md +0 -0
  111. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/session-2026-01-31-regression-fix.md +0 -0
  112. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/session-2026-01-31-with-clause.md +0 -0
  113. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/session-2026-02-01-codecov-setup.md +0 -0
  114. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/session-2026-02-01-column-naming-investigation.md +0 -0
  115. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/session-summary.md +0 -0
  116. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/tck-session-2026-01-31-final.md +0 -0
  117. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/sessions/tck-session-2026-01-31.md +0 -0
  118. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/tck_baseline_analysis_v0.3.md +0 -0
  119. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/testing-setup-complete.md +0 -0
  120. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/testing.md +0 -0
  121. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/v0.2-plan-summary.md +0 -0
  122. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/v0.4-revised-plan.md +0 -0
  123. {graphforge-0.3.9 → graphforge-0.3.10}/docs/development/workflow.md +0 -0
  124. {graphforge-0.3.9 → graphforge-0.3.10}/docs/getting-started/quickstart.md +0 -0
  125. {graphforge-0.3.9 → graphforge-0.3.10}/docs/getting-started/tutorial.md +0 -0
  126. {graphforge-0.3.9 → graphforge-0.3.10}/docs/guide/cypher-guide.md +0 -0
  127. {graphforge-0.3.9 → graphforge-0.3.10}/docs/guide/graph-construction.md +0 -0
  128. {graphforge-0.3.9 → graphforge-0.3.10}/docs/guide/overview.md +0 -0
  129. {graphforge-0.3.9 → graphforge-0.3.10}/docs/index.md +0 -0
  130. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/INCOMPLETE_FEATURES_ISSUES.md +0 -0
  131. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/README.md +0 -0
  132. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/RELEASE_TRACKING.md +0 -0
  133. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/VALIDATION_REPORT.md +0 -0
  134. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/api.md +0 -0
  135. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/changelog.md +0 -0
  136. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/column-naming-behavior.md +0 -0
  137. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/feature-aggregation-functions.md +0 -0
  138. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/feature-graph-queries.md +0 -0
  139. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/feature-graph-schema.md +0 -0
  140. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/feature-mapping/clause-to-tck.md +0 -0
  141. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/feature-mapping/function-to-tck.md +0 -0
  142. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/feature-order-by.md +0 -0
  143. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/feature-return-aliasing.md +0 -0
  144. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/implementation-status/clauses.md +0 -0
  145. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/implementation-status/functions.md +0 -0
  146. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/implementation-status/operators.md +0 -0
  147. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/implementation-status/patterns.md +0 -0
  148. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/opencypher-compatibility-matrix.md +0 -0
  149. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/opencypher-compatibility.md +0 -0
  150. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/opencypher-features/01-clauses.md +0 -0
  151. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/opencypher-features/02-functions.md +0 -0
  152. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/opencypher-features/03-operators.md +0 -0
  153. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/opencypher-features/04-patterns.md +0 -0
  154. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/opencypher-features/05-data-types.md +0 -0
  155. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/scale-limits.md +0 -0
  156. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/tck-compliance.md +0 -0
  157. {graphforge-0.3.9 → graphforge-0.3.10}/docs/reference/tck-inventory.md +0 -0
  158. {graphforge-0.3.9 → graphforge-0.3.10}/docs/releases/implementation-summary.md +0 -0
  159. {graphforge-0.3.9 → graphforge-0.3.10}/docs/releases/next-steps.md +0 -0
  160. {graphforge-0.3.9 → graphforge-0.3.10}/docs/releases/phase-1-complete.md +0 -0
  161. {graphforge-0.3.9 → graphforge-0.3.10}/docs/releases/phase-2-complete.md +0 -0
  162. {graphforge-0.3.9 → graphforge-0.3.10}/docs/releases/phase-3-complete.md +0 -0
  163. {graphforge-0.3.9 → graphforge-0.3.10}/docs/releases/roadmap.md +0 -0
  164. {graphforge-0.3.9 → graphforge-0.3.10}/docs/stylesheets/extra.css +0 -0
  165. {graphforge-0.3.9 → graphforge-0.3.10}/examples/01_social_network.py +0 -0
  166. {graphforge-0.3.9 → graphforge-0.3.10}/examples/02_knowledge_graph.py +0 -0
  167. {graphforge-0.3.9 → graphforge-0.3.10}/examples/03_data_lineage.py +0 -0
  168. {graphforge-0.3.9 → graphforge-0.3.10}/examples/04_citation_network.py +0 -0
  169. {graphforge-0.3.9 → graphforge-0.3.10}/examples/agent_grounding/ecommerce_agent.ipynb +0 -0
  170. {graphforge-0.3.9 → graphforge-0.3.10}/examples/basic_graph.py +0 -0
  171. {graphforge-0.3.9 → graphforge-0.3.10}/examples/basic_usage.py +0 -0
  172. {graphforge-0.3.9 → graphforge-0.3.10}/scripts/build_feature_graph.py +0 -0
  173. {graphforge-0.3.9 → graphforge-0.3.10}/scripts/bump_version.py +0 -0
  174. {graphforge-0.3.9 → graphforge-0.3.10}/scripts/check_release_needed.py +0 -0
  175. {graphforge-0.3.9 → graphforge-0.3.10}/scripts/inventory_tck.py +0 -0
  176. {graphforge-0.3.9 → graphforge-0.3.10}/scripts/perf_report.py +0 -0
  177. {graphforge-0.3.9 → graphforge-0.3.10}/scripts/pre-push-check.sh +0 -0
  178. {graphforge-0.3.9 → graphforge-0.3.10}/scripts/tck_metrics.py +0 -0
  179. {graphforge-0.3.9 → graphforge-0.3.10}/scripts/validate_datasets.py +0 -0
  180. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/ast/__init__.py +0 -0
  181. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/ast/clause.py +0 -0
  182. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/ast/pattern.py +0 -0
  183. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/ast/query.py +0 -0
  184. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/__init__.py +0 -0
  185. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/base.py +0 -0
  186. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/data/__init__.py +0 -0
  187. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/data/networkrepository.json +0 -0
  188. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/data/snap.json +0 -0
  189. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/exporters/__init__.py +0 -0
  190. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/formats/__init__.py +0 -0
  191. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/formats/json_graph.py +0 -0
  192. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/__init__.py +0 -0
  193. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/compression.py +0 -0
  194. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/csv.py +0 -0
  195. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/cypher.py +0 -0
  196. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/graphml.py +0 -0
  197. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/json_graph.py +0 -0
  198. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/ldbc.py +0 -0
  199. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/loaders/ldbc_schema.py +0 -0
  200. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/registry.py +0 -0
  201. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/sources/__init__.py +0 -0
  202. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/sources/graphml.py +0 -0
  203. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/sources/json_graph.py +0 -0
  204. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/sources/ldbc.py +0 -0
  205. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/sources/networkrepository.py +0 -0
  206. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/datasets/sources/snap.py +0 -0
  207. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/executor/__init__.py +0 -0
  208. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/executor/evaluator.py +0 -0
  209. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/optimizer/__init__.py +0 -0
  210. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/optimizer/cost_model.py +0 -0
  211. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/optimizer/join_reorder.py +0 -0
  212. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/optimizer/predicate_utils.py +0 -0
  213. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/optimizer/statistics.py +0 -0
  214. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/parser/__init__.py +0 -0
  215. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/planner/__init__.py +0 -0
  216. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/planner/operators.py +0 -0
  217. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/planner/types.py +0 -0
  218. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/procedures/__init__.py +0 -0
  219. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/procedures/registry.py +0 -0
  220. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/storage/__init__.py +0 -0
  221. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/storage/memory.py +0 -0
  222. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/storage/pydantic_serialization.py +0 -0
  223. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/storage/serialization.py +0 -0
  224. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/storage/sqlite_backend.py +0 -0
  225. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/types/__init__.py +0 -0
  226. {graphforge-0.3.9 → graphforge-0.3.10}/src/graphforge/types/graph.py +0 -0
  227. {graphforge-0.3.9 → graphforge-0.3.10}/tests/README.md +0 -0
  228. {graphforge-0.3.9 → graphforge-0.3.10}/tests/__init__.py +0 -0
  229. {graphforge-0.3.9 → graphforge-0.3.10}/tests/conftest.py +0 -0
  230. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/__init__.py +0 -0
  231. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/conftest.py +0 -0
  232. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_compression.py +0 -0
  233. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_cypher_loader_docs.py +0 -0
  234. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_end_to_end_workflows.py +0 -0
  235. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_graphml_loader.py +0 -0
  236. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_json_graph_exporter.py +0 -0
  237. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_json_graph_loader.py +0 -0
  238. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_json_graph_roundtrip.py +0 -0
  239. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_ldbc_loader.py +0 -0
  240. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/datasets/test_networkrepository_loader.py +0 -0
  241. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/executor/test_graph_functions.py +0 -0
  242. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_aggregation_edge_cases.py +0 -0
  243. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_aggregation_functions_advanced.py +0 -0
  244. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_anonymous_relationships.py +0 -0
  245. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_arithmetic.py +0 -0
  246. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_builder_api.py +0 -0
  247. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_call_procedures.py +0 -0
  248. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_call_subqueries.py +0 -0
  249. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_case_expressions.py +0 -0
  250. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_collect.py +0 -0
  251. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_column_naming.py +0 -0
  252. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_compact_iso8601.py +0 -0
  253. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_complex_merge_patterns.py +0 -0
  254. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_complex_where_predicates.py +0 -0
  255. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_create_clause.py +0 -0
  256. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_create_edge_cases.py +0 -0
  257. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_delete_null.py +0 -0
  258. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_detach_delete.py +0 -0
  259. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_e2e_queries.py +0 -0
  260. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_executor_edge_cases.py +0 -0
  261. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_graph_element_comparison.py +0 -0
  262. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_hex_octal_literals.py +0 -0
  263. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_iana_timezones.py +0 -0
  264. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_id_function.py +0 -0
  265. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_issues_271_274.py +0 -0
  266. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_label_disjunction.py +0 -0
  267. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_label_predicate.py +0 -0
  268. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_list_comprehension.py +0 -0
  269. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_list_concatenation.py +0 -0
  270. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_list_functions.py +0 -0
  271. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_list_operations.py +0 -0
  272. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_list_path_overloading.py +0 -0
  273. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_list_subscript.py +0 -0
  274. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_logical_operators.py +0 -0
  275. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_map_subscript.py +0 -0
  276. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_match_create.py +0 -0
  277. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_math_functions.py +0 -0
  278. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_math_functions_extended.py +0 -0
  279. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_math_functions_new.py +0 -0
  280. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_merge_edge_cases.py +0 -0
  281. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_merge_on_create_real.py +0 -0
  282. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_merge_on_match_real.py +0 -0
  283. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_mixed_type_sort.py +0 -0
  284. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_nan_handling.py +0 -0
  285. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_null_handling.py +0 -0
  286. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_operator_precedence.py +0 -0
  287. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_optimizer_aggregate_pushdown.py +0 -0
  288. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_optimizer_integration.py +0 -0
  289. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_optimizer_redundant_elimination.py +0 -0
  290. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_optional_match.py +0 -0
  291. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_optional_match_delete.py +0 -0
  292. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_path_binding.py +0 -0
  293. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_path_binding_variable_length.py +0 -0
  294. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_path_functions.py +0 -0
  295. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_pattern_comprehension.py +0 -0
  296. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_pattern_predicates.py +0 -0
  297. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_persistence.py +0 -0
  298. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_power_operator.py +0 -0
  299. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_predicate_functions.py +0 -0
  300. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_properties_keys_functions.py +0 -0
  301. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_relationship_directions.py +0 -0
  302. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_relationship_uniqueness.py +0 -0
  303. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_remove_clause.py +0 -0
  304. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_set_delete_merge.py +0 -0
  305. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_size_function.py +0 -0
  306. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_skip_limit_expressions.py +0 -0
  307. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_snap_dataset_loading.py +0 -0
  308. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_sort_after_aggregation.py +0 -0
  309. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_spatial_api.py +0 -0
  310. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_sqlite_persistence.py +0 -0
  311. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_startnode_endnode_functions.py +0 -0
  312. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_string_functions.py +0 -0
  313. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_string_functions_new.py +0 -0
  314. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_string_matching.py +0 -0
  315. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_subquery_expressions.py +0 -0
  316. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_temporal_map_constructors.py +0 -0
  317. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_temporal_queries.py +0 -0
  318. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_temporal_select_into.py +0 -0
  319. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_transactions.py +0 -0
  320. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_type_conversion_fixes.py +0 -0
  321. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_type_functions.py +0 -0
  322. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_union.py +0 -0
  323. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_unwind.py +0 -0
  324. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_variable_length_paths.py +0 -0
  325. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_varlen_predicate_and_uniqueness.py +0 -0
  326. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_wildcard_execution.py +0 -0
  327. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_with_aggregation_real.py +0 -0
  328. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_with_clause_modifiers.py +0 -0
  329. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_with_clause_positions.py +0 -0
  330. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_with_distinct_skip_limit.py +0 -0
  331. {graphforge-0.3.9 → graphforge-0.3.10}/tests/integration/test_xor_operator.py +0 -0
  332. {graphforge-0.3.9 → graphforge-0.3.10}/tests/perf/__init__.py +0 -0
  333. {graphforge-0.3.9 → graphforge-0.3.10}/tests/perf/conftest.py +0 -0
  334. {graphforge-0.3.9 → graphforge-0.3.10}/tests/perf/test_real_datasets.py +0 -0
  335. {graphforge-0.3.9 → graphforge-0.3.10}/tests/property/__init__.py +0 -0
  336. {graphforge-0.3.9 → graphforge-0.3.10}/tests/property/strategies.py +0 -0
  337. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/__init__.py +0 -0
  338. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/conftest.py +0 -0
  339. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/coverage_matrix.json +0 -0
  340. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/download_tck.py +0 -0
  341. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/Aggregation1_BasicAggregation.feature +0 -0
  342. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/Match1_SimpleMatches.feature +0 -0
  343. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call1.feature +0 -0
  344. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call2.feature +0 -0
  345. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call3.feature +0 -0
  346. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call4.feature +0 -0
  347. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call5.feature +0 -0
  348. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/call/Call6.feature +0 -0
  349. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create1.feature +0 -0
  350. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create2.feature +0 -0
  351. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create3.feature +0 -0
  352. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create4.feature +0 -0
  353. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create5.feature +0 -0
  354. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/create/Create6.feature +0 -0
  355. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete1.feature +0 -0
  356. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete2.feature +0 -0
  357. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete3.feature +0 -0
  358. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete4.feature +0 -0
  359. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete5.feature +0 -0
  360. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/delete/Delete6.feature +0 -0
  361. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match1.feature +0 -0
  362. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match2.feature +0 -0
  363. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match3.feature +0 -0
  364. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match4.feature +0 -0
  365. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match5.feature +0 -0
  366. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match6.feature +0 -0
  367. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match7.feature +0 -0
  368. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match8.feature +0 -0
  369. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match/Match9.feature +0 -0
  370. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere1.feature +0 -0
  371. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere2.feature +0 -0
  372. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere3.feature +0 -0
  373. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere4.feature +0 -0
  374. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere5.feature +0 -0
  375. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/match-where/MatchWhere6.feature +0 -0
  376. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge1.feature +0 -0
  377. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge2.feature +0 -0
  378. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge3.feature +0 -0
  379. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge4.feature +0 -0
  380. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge5.feature +0 -0
  381. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge6.feature +0 -0
  382. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge7.feature +0 -0
  383. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge8.feature +0 -0
  384. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/merge/Merge9.feature +0 -0
  385. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/remove/Remove1.feature +0 -0
  386. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/remove/Remove2.feature +0 -0
  387. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/remove/Remove3.feature +0 -0
  388. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return1.feature +0 -0
  389. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return2.feature +0 -0
  390. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return3.feature +0 -0
  391. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return4.feature +0 -0
  392. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return5.feature +0 -0
  393. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return6.feature +0 -0
  394. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return7.feature +0 -0
  395. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return/Return8.feature +0 -0
  396. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy1.feature +0 -0
  397. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy2.feature +0 -0
  398. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy3.feature +0 -0
  399. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy4.feature +0 -0
  400. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy5.feature +0 -0
  401. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-orderby/ReturnOrderBy6.feature +0 -0
  402. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit1.feature +0 -0
  403. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit2.feature +0 -0
  404. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/return-skip-limit/ReturnSkipLimit3.feature +0 -0
  405. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set1.feature +0 -0
  406. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set2.feature +0 -0
  407. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set3.feature +0 -0
  408. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set4.feature +0 -0
  409. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set5.feature +0 -0
  410. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/set/Set6.feature +0 -0
  411. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/union/Union1.feature +0 -0
  412. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/union/Union2.feature +0 -0
  413. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/union/Union3.feature +0 -0
  414. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/unwind/Unwind1.feature +0 -0
  415. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With1.feature +0 -0
  416. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With2.feature +0 -0
  417. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With3.feature +0 -0
  418. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With4.feature +0 -0
  419. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With5.feature +0 -0
  420. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With6.feature +0 -0
  421. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with/With7.feature +0 -0
  422. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy1.feature +0 -0
  423. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy2.feature +0 -0
  424. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy3.feature +0 -0
  425. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-orderBy/WithOrderBy4.feature +0 -0
  426. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit1.feature +0 -0
  427. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit2.feature +0 -0
  428. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-skip-limit/WithSkipLimit3.feature +0 -0
  429. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere1.feature +0 -0
  430. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere2.feature +0 -0
  431. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere3.feature +0 -0
  432. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere4.feature +0 -0
  433. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere5.feature +0 -0
  434. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere6.feature +0 -0
  435. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/clauses/with-where/WithWhere7.feature +0 -0
  436. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation1.feature +0 -0
  437. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation2.feature +0 -0
  438. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation3.feature +0 -0
  439. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation4.feature +0 -0
  440. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation5.feature +0 -0
  441. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation6.feature +0 -0
  442. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation7.feature +0 -0
  443. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/aggregation/Aggregation8.feature +0 -0
  444. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean1.feature +0 -0
  445. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean2.feature +0 -0
  446. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean3.feature +0 -0
  447. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean4.feature +0 -0
  448. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/boolean/Boolean5.feature +0 -0
  449. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/comparison/Comparison1.feature +0 -0
  450. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/comparison/Comparison2.feature +0 -0
  451. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/comparison/Comparison3.feature +0 -0
  452. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/comparison/Comparison4.feature +0 -0
  453. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/conditional/Conditional1.feature +0 -0
  454. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/conditional/Conditional2.feature +0 -0
  455. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery1.feature +0 -0
  456. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery2.feature +0 -0
  457. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/existentialSubqueries/ExistentialSubquery3.feature +0 -0
  458. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph1.feature +0 -0
  459. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph2.feature +0 -0
  460. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph3.feature +0 -0
  461. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph4.feature +0 -0
  462. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph5.feature +0 -0
  463. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph6.feature +0 -0
  464. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph7.feature +0 -0
  465. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph8.feature +0 -0
  466. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/graph/Graph9.feature +0 -0
  467. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List1.feature +0 -0
  468. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List10.feature +0 -0
  469. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List11.feature +0 -0
  470. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List12.feature +0 -0
  471. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List2.feature +0 -0
  472. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List3.feature +0 -0
  473. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List4.feature +0 -0
  474. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List5.feature +0 -0
  475. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List6.feature +0 -0
  476. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List7.feature +0 -0
  477. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List8.feature +0 -0
  478. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/list/List9.feature +0 -0
  479. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals1.feature +0 -0
  480. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals2.feature +0 -0
  481. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals3.feature +0 -0
  482. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals4.feature +0 -0
  483. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals5.feature +0 -0
  484. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals6.feature +0 -0
  485. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals7.feature +0 -0
  486. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/literals/Literals8.feature +0 -0
  487. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/map/Map1.feature +0 -0
  488. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/map/Map2.feature +0 -0
  489. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/map/Map3.feature +0 -0
  490. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical1.feature +0 -0
  491. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical10.feature +0 -0
  492. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical11.feature +0 -0
  493. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical12.feature +0 -0
  494. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical13.feature +0 -0
  495. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical14.feature +0 -0
  496. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical15.feature +0 -0
  497. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical16.feature +0 -0
  498. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical17.feature +0 -0
  499. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical2.feature +0 -0
  500. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical3.feature +0 -0
  501. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical4.feature +0 -0
  502. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical5.feature +0 -0
  503. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical6.feature +0 -0
  504. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical7.feature +0 -0
  505. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical8.feature +0 -0
  506. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/mathematical/Mathematical9.feature +0 -0
  507. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/null/Null1.feature +0 -0
  508. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/null/Null2.feature +0 -0
  509. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/null/Null3.feature +0 -0
  510. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/path/Path1.feature +0 -0
  511. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/path/Path2.feature +0 -0
  512. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/path/Path3.feature +0 -0
  513. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/pattern/Pattern1.feature +0 -0
  514. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/pattern/Pattern2.feature +0 -0
  515. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/precedence/Precedence1.feature +0 -0
  516. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/precedence/Precedence2.feature +0 -0
  517. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/precedence/Precedence3.feature +0 -0
  518. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/precedence/Precedence4.feature +0 -0
  519. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier1.feature +0 -0
  520. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier10.feature +0 -0
  521. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier11.feature +0 -0
  522. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier12.feature +0 -0
  523. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier2.feature +0 -0
  524. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier3.feature +0 -0
  525. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier4.feature +0 -0
  526. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier5.feature +0 -0
  527. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier6.feature +0 -0
  528. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier7.feature +0 -0
  529. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier8.feature +0 -0
  530. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/quantifier/Quantifier9.feature +0 -0
  531. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String1.feature +0 -0
  532. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String10.feature +0 -0
  533. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String11.feature +0 -0
  534. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String12.feature +0 -0
  535. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String13.feature +0 -0
  536. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String14.feature +0 -0
  537. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String2.feature +0 -0
  538. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String3.feature +0 -0
  539. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String4.feature +0 -0
  540. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String5.feature +0 -0
  541. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String6.feature +0 -0
  542. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String7.feature +0 -0
  543. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String8.feature +0 -0
  544. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/string/String9.feature +0 -0
  545. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal1.feature +0 -0
  546. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal10.feature +0 -0
  547. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal2.feature +0 -0
  548. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal3.feature +0 -0
  549. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal4.feature +0 -0
  550. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal5.feature +0 -0
  551. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal6.feature +0 -0
  552. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal7.feature +0 -0
  553. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal8.feature +0 -0
  554. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/temporal/Temporal9.feature +0 -0
  555. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion1.feature +0 -0
  556. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion2.feature +0 -0
  557. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion3.feature +0 -0
  558. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion4.feature +0 -0
  559. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion5.feature +0 -0
  560. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/expressions/typeConversion/TypeConversion6.feature +0 -0
  561. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/useCases/countingSubgraphMatches/CountingSubgraphMatches1.feature +0 -0
  562. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/features/official/useCases/triadicSelection/TriadicSelection1.feature +0 -0
  563. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/graphs/binary-tree-1/binary-tree-1.cypher +0 -0
  564. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/graphs/binary-tree-1/binary-tree-1.json +0 -0
  565. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/graphs/binary-tree-2/binary-tree-2.cypher +0 -0
  566. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/graphs/binary-tree-2/binary-tree-2.json +0 -0
  567. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/graphs/named-graphs.adoc +0 -0
  568. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/tck_config.yaml +0 -0
  569. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/tck_markers.py +0 -0
  570. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/test_features.py +0 -0
  571. {graphforge-0.3.9 → graphforge-0.3.10}/tests/tck/test_tck_compliance.py +0 -0
  572. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/__init__.py +0 -0
  573. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/api/__init__.py +0 -0
  574. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/api/test_api_coverage.py +0 -0
  575. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/api/test_bulk_ingest.py +0 -0
  576. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/api/test_clear.py +0 -0
  577. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/api/test_clone.py +0 -0
  578. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/api/test_cypher_value_conversion.py +0 -0
  579. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/ast/__init__.py +0 -0
  580. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/ast/test_ast_nodes.py +0 -0
  581. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/ast/test_expression_coverage.py +0 -0
  582. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/__init__.py +0 -0
  583. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_compression_coverage.py +0 -0
  584. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_csv_loader.py +0 -0
  585. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_cypher_loader.py +0 -0
  586. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_graphml_loader.py +0 -0
  587. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_json_graph_exporter.py +0 -0
  588. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_json_graph_format.py +0 -0
  589. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_json_graph_loader.py +0 -0
  590. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_ldbc_schema.py +0 -0
  591. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_networkrepository.py +0 -0
  592. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_snap_datasets.py +0 -0
  593. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/datasets/test_sources_registration.py +0 -0
  594. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/__init__.py +0 -0
  595. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_aggregation_errors.py +0 -0
  596. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_aggregation_functions_advanced.py +0 -0
  597. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_arithmetic_evaluator.py +0 -0
  598. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_element_id.py +0 -0
  599. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_evaluator.py +0 -0
  600. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_evaluator_additional_coverage.py +0 -0
  601. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_evaluator_coverage_boost.py +0 -0
  602. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_evaluator_error_paths.py +0 -0
  603. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_executor_coverage_boost.py +0 -0
  604. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_executor_error_paths.py +0 -0
  605. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_expression_matching.py +0 -0
  606. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_expressions_match.py +0 -0
  607. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_graph_functions.py +0 -0
  608. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_id_function.py +0 -0
  609. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_in_operator.py +0 -0
  610. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_infer_rel_var.py +0 -0
  611. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_limit_short_circuit.py +0 -0
  612. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_list_functions.py +0 -0
  613. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_list_functions_errors.py +0 -0
  614. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_map_property_access.py +0 -0
  615. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_merge_on_create.py +0 -0
  616. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_merge_on_match.py +0 -0
  617. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_multihop_create.py +0 -0
  618. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_optional_expand_bound_dst.py +0 -0
  619. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_optional_scan_coverage.py +0 -0
  620. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_parenthesized_expr_coverage.py +0 -0
  621. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_path_functions.py +0 -0
  622. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_procedure_call_executor.py +0 -0
  623. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_properties_keys_errors.py +0 -0
  624. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_property_index_executor.py +0 -0
  625. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_set_extensions.py +0 -0
  626. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_sort_edge_cases.py +0 -0
  627. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_spatial_functions.py +0 -0
  628. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_startnode_endnode_errors.py +0 -0
  629. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_string_functions_new.py +0 -0
  630. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_string_matching_evaluator.py +0 -0
  631. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_subquery_planner_check.py +0 -0
  632. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_temporal_functions.py +0 -0
  633. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_temporal_truncate_arithmetic.py +0 -0
  634. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_three_valued_logic.py +0 -0
  635. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_type_conversion_complex.py +0 -0
  636. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_undirected_relationship_bugs.py +0 -0
  637. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/executor/test_with_aggregation.py +0 -0
  638. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/__init__.py +0 -0
  639. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_aggregate_pushdown.py +0 -0
  640. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_cost_model.py +0 -0
  641. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_filter_pushdown.py +0 -0
  642. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_join_reorder.py +0 -0
  643. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_join_reorder_coverage.py +0 -0
  644. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_optimizer_coverage.py +0 -0
  645. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_optimizer_reuse.py +0 -0
  646. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_predicate_reorder.py +0 -0
  647. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_predicate_utils.py +0 -0
  648. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_predicate_utils_coverage.py +0 -0
  649. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/optimizer/test_statistics.py +0 -0
  650. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/__init__.py +0 -0
  651. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_arithmetic_parser.py +0 -0
  652. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_call_procedure_parser.py +0 -0
  653. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_case_parser.py +0 -0
  654. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_collect_parser.py +0 -0
  655. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_delete_parser.py +0 -0
  656. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_float_literals.py +0 -0
  657. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_grammar.py +0 -0
  658. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_hex_octal_literals.py +0 -0
  659. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_label_predicate_parser.py +0 -0
  660. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_merge_on_create.py +0 -0
  661. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_merge_on_match.py +0 -0
  662. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_optional_match_delete.py +0 -0
  663. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_order_by_direction.py +0 -0
  664. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_parser.py +0 -0
  665. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_parser_caching.py +0 -0
  666. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_parser_coverage_boost.py +0 -0
  667. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_path_binding.py +0 -0
  668. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_pattern_comprehension_binding.py +0 -0
  669. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_pattern_predicates.py +0 -0
  670. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_remove_parser.py +0 -0
  671. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_string_matching_parser.py +0 -0
  672. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_wildcard_parsing.py +0 -0
  673. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_with_at_query_start.py +0 -0
  674. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/parser/test_with_clause_positions.py +0 -0
  675. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/__init__.py +0 -0
  676. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_call_procedure_planner.py +0 -0
  677. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_expand_multi_hop_operator.py +0 -0
  678. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_operator_validation.py +0 -0
  679. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_operators.py +0 -0
  680. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_planner_branch_coverage.py +0 -0
  681. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_planner_comprehensive.py +0 -0
  682. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_planner_edge_cases.py +0 -0
  683. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_remove_planner.py +0 -0
  684. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_type_tracking.py +0 -0
  685. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/planner/test_with_validation.py +0 -0
  686. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/procedures/__init__.py +0 -0
  687. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/procedures/test_registry.py +0 -0
  688. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/__init__.py +0 -0
  689. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_graph_edge_cases.py +0 -0
  690. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_memory_store.py +0 -0
  691. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_property_index.py +0 -0
  692. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_pydantic_serialization.py +0 -0
  693. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_serialization_edge_cases.py +0 -0
  694. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_spatial_serialization.py +0 -0
  695. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_sqlite_backend_adjacency.py +0 -0
  696. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_sqlite_backend_delete_bulk.py +0 -0
  697. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_storage_coverage.py +0 -0
  698. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/storage/test_temporal_serialization.py +0 -0
  699. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/test_graph_elements.py +0 -0
  700. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/test_iana_timezone_construction.py +0 -0
  701. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/test_procedure_registry_coverage.py +0 -0
  702. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/test_values.py +0 -0
  703. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/types/test_cypher_values_deep_equality.py +0 -0
  704. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/types/test_cypher_values_edge_cases.py +0 -0
  705. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/types/test_extreme_temporal_values.py +0 -0
  706. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/types/test_graph_element_edge_cases.py +0 -0
  707. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/types/test_path_values.py +0 -0
  708. {graphforge-0.3.9 → graphforge-0.3.10}/tests/unit/types/test_spatial_values.py +0 -0
  709. {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 code
34
+ - name: Checkout
34
35
  uses: actions/checkout@v6
35
36
  with:
36
- fetch-depth: 0 # Fetch all history for git info
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 documentation dependencies
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: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main'
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: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main'
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 5
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
@@ -173,6 +173,10 @@ profile_*
173
173
  *.log
174
174
  .temp/
175
175
  tmp/
176
+
177
+ # macOS Finder "keep both" duplicates (e.g. "file 2.py", "file 2.md", "file 3")
178
+ * [0-9]
179
+ * [0-9].*
176
180
  # MkDocs build output
177
181
  site/
178
182
  tck_*.txt
@@ -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.9
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: docs
43
- Requires-Dist: mkdocs-autorefs>=1.0.0; extra == 'docs'
44
- Requires-Dist: mkdocs-material>=9.5.0; extra == 'docs'
45
- Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
46
- Requires-Dist: mkdocstrings[python]>=0.24.0; extra == 'docs'
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.9
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