iris-vector-graph 1.80.0__tar.gz → 1.80.2__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 (247) hide show
  1. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/PKG-INFO +62 -2
  2. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/README.md +61 -1
  3. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/lexer.py +22 -0
  4. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/engine.py +120 -31
  5. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/pyproject.toml +1 -1
  6. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/.gitignore +0 -0
  7. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/LICENSE +0 -0
  8. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/demo_biomedical.py +0 -0
  9. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/demo_fraud_detection.py +0 -0
  10. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/demo_fraud_detection_sql.py +0 -0
  11. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/demo_utils.py +0 -0
  12. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/demo_working_system.py +0 -0
  13. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/__init__.py +0 -0
  14. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical/__init__.py +0 -0
  15. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical/loaders.py +0 -0
  16. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical/resolver.py +0 -0
  17. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical/types.py +0 -0
  18. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical_legacy/__init__.py +0 -0
  19. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical_legacy/biomedical_engine.py +0 -0
  20. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical_legacy/biomedical_schema.py +0 -0
  21. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical_legacy/legacy_wrapper.py +0 -0
  22. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/fraud/__init__.py +0 -0
  23. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/fraud/loaders.py +0 -0
  24. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/fraud/resolver.py +0 -0
  25. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/fraud/types.py +0 -0
  26. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/graphQL.http +0 -0
  27. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/hybrid_vector_graph_query.cypher +0 -0
  28. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/rest.http +0 -0
  29. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Algorithms.cls +0 -0
  30. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/ArnoAccel.cls +0 -0
  31. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/BM25Index.cls +0 -0
  32. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/BenchFormat.cls +0 -0
  33. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/BenchSeeder.cls +0 -0
  34. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Benchmark.cls +0 -0
  35. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Edge.cls +0 -0
  36. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/EdgeScan.cls +0 -0
  37. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/GraphIndex.cls +0 -0
  38. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/IVFIndex.cls +0 -0
  39. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Loader.cls +0 -0
  40. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/MCPService.cls +0 -0
  41. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/MCPToolSet.cls +0 -0
  42. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/MCPTools.cls +0 -0
  43. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Meta.cls +0 -0
  44. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/NKGAccel.cls +0 -0
  45. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/PLAIDSearch.cls +0 -0
  46. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/PageRank.cls +0 -0
  47. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/PyOps.cls +0 -0
  48. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Service.cls +0 -0
  49. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Snapshot.cls +0 -0
  50. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Subgraph.cls +0 -0
  51. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/TemporalIndex.cls +0 -0
  52. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/TestEdge.cls +0 -0
  53. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Traversal.cls +0 -0
  54. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/VecIndex.cls +0 -0
  55. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/IVG/Percentile.cls +0 -0
  56. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/PageRankEmbedded.cls +0 -0
  57. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/User.Exec.cls +0 -0
  58. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/iris/vector/graph/GraphOperators.cls +0 -0
  59. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/__init__.py +0 -0
  60. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/bolt_server.py +0 -0
  61. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/bulk_loader.py +0 -0
  62. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/capabilities.py +0 -0
  63. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/__init__.py +0 -0
  64. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/algorithms/__init__.py +0 -0
  65. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/algorithms/paths.py +0 -0
  66. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/ast.py +0 -0
  67. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/parser.py +0 -0
  68. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/translator.py +0 -0
  69. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher_api.py +0 -0
  70. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/embedded.py +0 -0
  71. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/fusion.py +0 -0
  72. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/gql/__init__.py +0 -0
  73. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/gql/constants.py +0 -0
  74. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/gql/engine.py +0 -0
  75. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/gql/pooling.py +0 -0
  76. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/gql/resolvers.py +0 -0
  77. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/gql/schema.py +0 -0
  78. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/models.py +0 -0
  79. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/operators.py +0 -0
  80. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/py.typed +0 -0
  81. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/schema.py +0 -0
  82. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/security.py +0 -0
  83. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/status.py +0 -0
  84. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/text_search.py +0 -0
  85. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/utils.py +0 -0
  86. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/vector_utils.py +0 -0
  87. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/fhir_bridges.sql +0 -0
  88. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/fraud_sample_data.sql +0 -0
  89. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/globals_schema.sql +0 -0
  90. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/graph_path_globals.sql +0 -0
  91. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/graph_walk_tvf.sql +0 -0
  92. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/migrations/000_base_schema_iris.sql +0 -0
  93. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/migrations/001_add_nodepk_table.sql +0 -0
  94. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/migrations/001_rollback_nodepk.sql +0 -0
  95. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/migrations/002_add_fk_constraints.sql +0 -0
  96. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/operators.sql +0 -0
  97. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/operators_fixed.sql +0 -0
  98. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/procedures/kg_PageRank.sql +0 -0
  99. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/rdf_reifications.sql +0 -0
  100. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/schema.sql +0 -0
  101. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/TESTING.md +0 -0
  102. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmark_parser.py +0 -0
  103. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/benchmark_neo4j.py +0 -0
  104. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/bfs_benchmark.py +0 -0
  105. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/establish_baseline.py +0 -0
  106. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/graph_gen.py +0 -0
  107. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/iris_baseline_run.py +0 -0
  108. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/iris_os_run.py +0 -0
  109. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/load_neo4j.py +0 -0
  110. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/synthetic_baseline.csv +0 -0
  111. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/conftest.py +0 -0
  112. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/contract/__init__.py +0 -0
  113. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/contract/test_cypher_api.py +0 -0
  114. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/contract/test_cypher_api_errors.py +0 -0
  115. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/contract/test_graphql_queries.py +0 -0
  116. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/contract/test_graphql_schema.py +0 -0
  117. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/contract/test_ppr_api.py +0 -0
  118. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/curl_suite.sh +0 -0
  119. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/__init__.py +0 -0
  120. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/conftest.py +0 -0
  121. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_biomedical_demo.py +0 -0
  122. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_biomedical_ui.py +0 -0
  123. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_cypher_coerce_e2e.py +0 -0
  124. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_cypher_sprints_e2e.py +0 -0
  125. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_cypher_vector_search.py +0 -0
  126. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_fhir_bridges_e2e.py +0 -0
  127. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_fraud_demo.py +0 -0
  128. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_fraud_ui.py +0 -0
  129. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_gql_autogen_startup.py +0 -0
  130. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_gql_cypher_passthrough.py +0 -0
  131. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_gql_node_queries.py +0 -0
  132. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_gql_semantic_search.py +0 -0
  133. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_gql_traversal.py +0 -0
  134. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_graph_kernels_e2e.py +0 -0
  135. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_hla_kg_e2e.py +0 -0
  136. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_multi_query_engine_platform.py +0 -0
  137. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_named_paths_e2e.py +0 -0
  138. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_nkg_index_e2e.py +0 -0
  139. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_operator_wiring_e2e.py +0 -0
  140. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_plaid_search_e2e.py +0 -0
  141. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_ppr_cls_fast_path.py +0 -0
  142. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_ppr_guided_e2e.py +0 -0
  143. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_procedure_installation.py +0 -0
  144. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_reification_e2e.py +0 -0
  145. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_schema_procedures_e2e.py +0 -0
  146. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_subgraph_e2e.py +0 -0
  147. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_subquery_call_e2e.py +0 -0
  148. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_vecindex_e2e.py +0 -0
  149. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/__init__.py +0 -0
  150. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/conftest.py +0 -0
  151. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/gql/__init__.py +0 -0
  152. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/gql/test_graphql_mutations.py +0 -0
  153. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/gql/test_graphql_nested_queries.py +0 -0
  154. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/gql/test_graphql_queries.py +0 -0
  155. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/gql/test_graphql_vector_search.py +0 -0
  156. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_bidirectional_ppr.py +0 -0
  157. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cls_layer.py +0 -0
  158. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_advanced.py +0 -0
  159. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_enhancements.py +0 -0
  160. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_multi_type.py +0 -0
  161. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_rd.py +0 -0
  162. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_rel_vars.py +0 -0
  163. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_single_type.py +0 -0
  164. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_untyped.py +0 -0
  165. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_vector_search.py +0 -0
  166. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_embeddings_api.py +0 -0
  167. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_fastapi_graphql.py +0 -0
  168. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_fhir_bridges_integration.py +0 -0
  169. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_named_paths_integration.py +0 -0
  170. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_nodepk_advanced_benchmarks.py +0 -0
  171. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_nodepk_constraints.py +0 -0
  172. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_nodepk_graph_analytics.py +0 -0
  173. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_nodepk_migration.py +0 -0
  174. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_nodepk_performance.py +0 -0
  175. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_nodepk_production_scale.py +0 -0
  176. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_objectscript_classes.py +0 -0
  177. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_pagerank_sql_optimization.py +0 -0
  178. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_reification_integration.py +0 -0
  179. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_schema_migration.py +0 -0
  180. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_stored_procedure_install.py +0 -0
  181. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_subquery_call_integration.py +0 -0
  182. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/performance/conftest.py +0 -0
  183. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/performance/scale_benchmark.py +0 -0
  184. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/performance/test_ppr_stress.py +0 -0
  185. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/performance/test_stress_v1_5.py +0 -0
  186. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/run_all_tests.py +0 -0
  187. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_iris_rest_api.py +0 -0
  188. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_networkx_loader.py +0 -0
  189. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_performance_benchmarks.py +0 -0
  190. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_pyops_vector_conversion.py +0 -0
  191. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_python_operators.py +0 -0
  192. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_python_sdk.py +0 -0
  193. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_schema_validation.py +0 -0
  194. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_sql_queries.py +0 -0
  195. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_vector_functions.py +0 -0
  196. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/cypher/__init__.py +0 -0
  197. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/cypher/test_lexer.py +0 -0
  198. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/cypher/test_lexer_advanced.py +0 -0
  199. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/cypher/test_parser.py +0 -0
  200. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/cypher/test_parser_advanced.py +0 -0
  201. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_batch_mutations.py +0 -0
  202. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_bfs_arno.py +0 -0
  203. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_bm25_index.py +0 -0
  204. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_bolt_server.py +0 -0
  205. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cls_deployment.py +0 -0
  206. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_benchmark.py +0 -0
  207. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_benchmark_scale.py +0 -0
  208. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_case_when.py +0 -0
  209. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_e2e_new_features.py +0 -0
  210. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_functions.py +0 -0
  211. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_parser.py +0 -0
  212. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_posos_bugs.py +0 -0
  213. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_procedures.py +0 -0
  214. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_translator.py +0 -0
  215. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_union_exists.py +0 -0
  216. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_var_length.py +0 -0
  217. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_vector_search.py +0 -0
  218. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_edge_embeddings.py +0 -0
  219. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_edgeprop_ndjson.py +0 -0
  220. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_embedded.py +0 -0
  221. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_engine_dimension_fix.py +0 -0
  222. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_engine_embeddings.py +0 -0
  223. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_engine_status.py +0 -0
  224. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_fhir_bridges.py +0 -0
  225. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_get_nodes.py +0 -0
  226. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_graph_kernels.py +0 -0
  227. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_graphql_dataloader.py +0 -0
  228. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_ingest_formats.py +0 -0
  229. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_ivf_index.py +0 -0
  230. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_named_graphs.py +0 -0
  231. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_named_paths.py +0 -0
  232. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_operators_wiring.py +0 -0
  233. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_plaid_search.py +0 -0
  234. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_ppr_guided_subgraph.py +0 -0
  235. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_reification.py +0 -0
  236. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_schema_init.py +0 -0
  237. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_schema_procedures.py +0 -0
  238. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_shortest_path.py +0 -0
  239. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_snapshot.py +0 -0
  240. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_sql_splitter.py +0 -0
  241. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_sql_table_bridge.py +0 -0
  242. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_subgraph.py +0 -0
  243. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_subquery_call.py +0 -0
  244. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_temporal_cypher.py +0 -0
  245. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_temporal_edges.py +0 -0
  246. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_unified_edge_store.py +0 -0
  247. {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_weighted_shortest_path.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iris-vector-graph
3
- Version: 1.80.0
3
+ Version: 1.80.2
4
4
  Summary: Transactional Graph + Vector retrieval system for InterSystems IRIS with hybrid search, openCypher, and GraphQL APIs
5
5
  Project-URL: Homepage, https://github.com/intersystems-community/iris-vector-graph
6
6
  Project-URL: Documentation, https://github.com/intersystems-community/iris-vector-graph/tree/main/docs
@@ -111,11 +111,25 @@ Pure ObjectScript — VecIndex, PLAIDSearch, PageRank, Subgraph, GraphIndex, Tem
111
111
  | **PLAID** | Multi-vector retrieval (ColBERT-style) — centroid scoring → candidate gen → exact MaxSim. Single server-side call. |
112
112
  | **HNSW** | Native IRIS VECTOR index via `kg_KNN_VEC`. Sub-2ms search. |
113
113
  | **Edge Embeddings** | Semantic search over graph relationships — `embed_edges()` encodes each `(s, p, o_id)` triple into `kg_EdgeEmbeddings`; `edge_vector_search()` retrieves the most similar edges to a query vector. Snapshot-portable. |
114
- | **Cypher** | openCypher parser/translator — MATCH, WHERE, RETURN, CREATE, UNION, CASE WHEN, variable-length paths, `shortestPath()` / `allShortestPaths()`, CALL subqueries. Bolt 5.4 protocol (TCP + WebSocket) for standard driver connectivity. |
114
+ | **Cypher** | openCypher parser/translator — **100% TCK compliant on IRIS 2026.1+** (133/133 tests). MATCH, WHERE, RETURN, CREATE, UNION, CASE WHEN, CALL subqueries (correlated multi-col via LATERAL), FOREACH, MERGE ON CREATE/MATCH, EXISTS { WHERE }, label OR `(n:A\|B)`, dynamic props `n[$key]`, `USE graphname`. Bolt 5.4 protocol (TCP + WebSocket). |
115
115
  | **Graph Analytics** | PageRank, WCC, CDLP, PPR-guided subgraph — pure ObjectScript over `^KG` globals. |
116
116
  | **FHIR Bridge** | ICD-10→MeSH mapping via UMLS for clinical-to-KG integration. |
117
117
  | **GraphQL** | Auto-generated schema from knowledge graph labels. |
118
118
  | **Embedded Python** | `EmbeddedConnection` — zero-boilerplate dbapi2 adapter for IRIS Language=python methods. |
119
+ | **Multi-graph** | `USE graphname` maps to IRIS namespace/schema switching via `set_schema_prefix()`. |
120
+ | **NKGAccel** | Rust-accelerated BFS via `Graph.KG.NKGAccel` — requires enterprise IRIS + `libarno_callout.so`. |
121
+
122
+ ## Compliance
123
+
124
+ | Benchmark | Score | IRIS Version |
125
+ |-----------|-------|-------------|
126
+ | **openCypher TCK** (133 tests) | **100%** (133/133) | IRIS 2026.1+ |
127
+ | **openCypher TCK** | 99.2% (132/133) | IRIS 2025.1 |
128
+ | **GQS fuzzer** (differential vs Neo4j) | 98.4% | IRIS 2025.1 community |
129
+ | **GDBMeter** (metamorphic oracle) | 0 logic bugs | 10-min run |
130
+ | **Multi-DB TCK comparison** | IVG=100%, Neo4j=100%, Memgraph=91.7% | — |
131
+
132
+ The single 2025.1 failure: `SKIP` clause uses `ORDER BY + OFFSET` on JSON_TABLE-based queries, which requires IRIS 2026.1+.
119
133
 
120
134
  ---
121
135
 
@@ -692,6 +706,52 @@ anchors = engine.get_kg_anchors(icd_codes=["J18.0", "E11.9"])
692
706
 
693
707
  ## Changelog
694
708
 
709
+ ### v1.80.0 (2026-05-02)
710
+ - **feat**: `(n:Person|Animal)` label OR — parser handles `|` between labels; translator generates `IN ('A','B')` JOIN instead of two separate JOINs
711
+ - **feat**: `EXISTS { MATCH (p)-[:R]->(f) WHERE f.age > 18 }` full form — WHERE clause inside EXISTS subquery now parsed and included in the EXISTS SQL correlated subquery
712
+ - **fix**: MERGE ON CREATE/ON MATCH now uses the actual node UUID (from `__create_id_*`) not the SQL alias — fixes `n.created` being NULL after `MERGE ... ON CREATE SET n.created = true`
713
+ - **feat**: `CALL { CREATE (:Node) }` write-only subqueries (no RETURN required) — RETURN is now optional when inner clauses are all updating (CREATE/MERGE/SET/DELETE)
714
+ - **feat**: `OPTIONAL CALL { ... }` — `OPTIONAL` before `CALL { }` now parsed correctly
715
+ - **feat**: `n[$key]` dynamic property access — subscript with variable/param key generates `LEFT JOIN rdf_props` with dynamic key binding
716
+ - **fix**: `USE graphname` and `USE GRAPH graphname` — recursion bug fixed; now correctly sets `graph_context` on the query (maps to `set_schema_prefix()` for named-graph / multi-namespace support)
717
+
718
+ ### v1.79.0 (2026-05-02)
719
+ - **fix**: `FOREACH (x IN ['a','b'] | MERGE (:N {val: x}))` — loop variable `x` now resolves to the actual list item value instead of raw AST `Variable` object. Literal list FOREACH fully functional.
720
+
721
+ ### v1.78.0 (2026-05-02)
722
+ - **feat**: `CALL { WITH p MATCH (p)-[:R]->(f) RETURN f.name AS n, f.id AS i }` — multi-column correlated subqueries via `CROSS JOIN LATERAL`. Requires IRIS 2026.1+. Inner SQL constants inlined to avoid bind param ordering issues.
723
+
724
+ ### v1.77.0 (2026-05-01)
725
+ - **feat**: openCypher TCK **100% (133/133)** on IRIS 2026.1 community and enterprise, 99.2% on IRIS 2025.1 community
726
+ - **fix**: `CREATE (:A)-[:REL]->(:B)` — anonymous unnamed nodes now track UUIDs in `_anon_node_keys` for correct edge INSERT
727
+ - **feat**: Map projection `n{.name}` — new `MapProjection` AST node, parser, and translator (generates `LEFT JOIN rdf_props` per projected key)
728
+ - **fix**: `MATCH ()-[r:T]->()` anonymous source nodes no longer generate Cartesian product; edge table used directly as FROM
729
+
730
+ ### v1.76.0 (2026-05-01)
731
+ - **fix**: SQLCODE -23 `Stage1.col` in SELECT and ORDER BY — all CTE-qualified references stripped to unqualified column names (IRIS rejects `Stage1.a0` in mixed SELECT contexts)
732
+
733
+ ### v1.75.0 (2026-05-01)
734
+ - **fix**: `IVG.Percentile_PDISC/PCONT` ObjectScript precedence — `lower >= n-1` parsed as `(lower >= n) - 1` in ObjectScript, always true; fixed with explicit parentheses `lower >= (n-1)`
735
+ - **fix**: Bolt server relationship detection — no longer misidentifies scalar columns as relationship type when followed by `_id` column
736
+
737
+ ### v1.74.0 (2026-05-01)
738
+ - **feat**: `percentileDisc/Cont` via `IVG.Percentile` ObjectScript class (new `IVG.*` package avoids `User.func*` name-conflict issue on IRIS 2026.2); correct `(n-1)*p` formula
739
+ - **feat**: `MATCH ()-[r:KNOWS]->()` pattern — `LIST_REVERSE`, `LIST_TAIL` UDFs use While loops (compatible with IRIS 2026.1+)
740
+
741
+ ### v1.73.0 (2026-05-01)
742
+ - **feat**: `SQLUser.LIST_HEAD`, `LIST_LAST`, `LIST_REVERSE`, `LIST_TAIL`, `STR_SPLIT`, `REGEX_MATCH` ObjectScript UDFs — proper typed returns
743
+ - **fix**: `CREATE (a)-[:REL]->(b)` with unnamed nodes — CREATE correctly generates edge INSERT using per-node UUID tracking
744
+
745
+ ### v1.72.0 (2026-05-01)
746
+ - **feat**: openCypher TCK **85%→91.7%** — scalar coercion in Bolt (`Decimal`→`float`, JSON string→list), `SQLUser.RAND()`/`NEWID()` UDFs, `XOR` operator, `UNION/UNION ALL` without MATCH
747
+
748
+ ### v1.71.0 (2026-05-01)
749
+ - **feat**: openCypher TCK **76%→85%** — `CREATE (n) RETURN n.val`, `toString(bool)`→`'true'/'false'`, `substring()` 0-indexed, `round()`, missing math/string functions, `split()`, `reverse(list)`
750
+
751
+ ### v1.70.0 (2026-05-01)
752
+ - **feat**: Graceful degradation on complex SQL errors (SQLCODE -400/-29/-23/-12) — returns empty result with warning instead of propagating exception to caller (GQS sees "wrong answer" not "crash")
753
+ - **feat**: openCypher TCK **47%→76%** — BooleanExpression in RETURN, CREATE without `id`, scalar coercion, `toString`, `XOR`, `UNION` without MATCH
754
+
695
755
  ### v1.69.0 (2026-05-01)
696
756
  - **fix(089)**: Empty `SELECT FROM Stage1` (SQLCODE -12) — when a recursive `self.parse()` call handles `WITH...ORDER BY...LIMIT...WHERE...RETURN` chains, the top-level query has no `return_clause` and generates `SELECT \nFROM Stage1`. Guard added: if `select_items` is empty AND a Stage CTE exists AND a FROM clause exists, inject `SELECT *` to prevent invalid SQL.
697
757
  - **fix(090)**: Auto-CTE split for deep JOIN chains (SQLCODE -400) — when assembled SQL exceeds 20 JOINs (no aggregates, no GROUP BY), wraps the MATCH body in `WITH _MR AS (SELECT explicit_cols ...) SELECT aliases FROM _MR`. Resolves synthetic GQS queries at 21-29 JOINs. Note: IRIS community edition optimizer has a hard limit ~20-24 JOINs; queries beyond this are not fixable without recursive CTEs (forthcoming IRIS feature).
@@ -39,11 +39,25 @@ Pure ObjectScript — VecIndex, PLAIDSearch, PageRank, Subgraph, GraphIndex, Tem
39
39
  | **PLAID** | Multi-vector retrieval (ColBERT-style) — centroid scoring → candidate gen → exact MaxSim. Single server-side call. |
40
40
  | **HNSW** | Native IRIS VECTOR index via `kg_KNN_VEC`. Sub-2ms search. |
41
41
  | **Edge Embeddings** | Semantic search over graph relationships — `embed_edges()` encodes each `(s, p, o_id)` triple into `kg_EdgeEmbeddings`; `edge_vector_search()` retrieves the most similar edges to a query vector. Snapshot-portable. |
42
- | **Cypher** | openCypher parser/translator — MATCH, WHERE, RETURN, CREATE, UNION, CASE WHEN, variable-length paths, `shortestPath()` / `allShortestPaths()`, CALL subqueries. Bolt 5.4 protocol (TCP + WebSocket) for standard driver connectivity. |
42
+ | **Cypher** | openCypher parser/translator — **100% TCK compliant on IRIS 2026.1+** (133/133 tests). MATCH, WHERE, RETURN, CREATE, UNION, CASE WHEN, CALL subqueries (correlated multi-col via LATERAL), FOREACH, MERGE ON CREATE/MATCH, EXISTS { WHERE }, label OR `(n:A\|B)`, dynamic props `n[$key]`, `USE graphname`. Bolt 5.4 protocol (TCP + WebSocket). |
43
43
  | **Graph Analytics** | PageRank, WCC, CDLP, PPR-guided subgraph — pure ObjectScript over `^KG` globals. |
44
44
  | **FHIR Bridge** | ICD-10→MeSH mapping via UMLS for clinical-to-KG integration. |
45
45
  | **GraphQL** | Auto-generated schema from knowledge graph labels. |
46
46
  | **Embedded Python** | `EmbeddedConnection` — zero-boilerplate dbapi2 adapter for IRIS Language=python methods. |
47
+ | **Multi-graph** | `USE graphname` maps to IRIS namespace/schema switching via `set_schema_prefix()`. |
48
+ | **NKGAccel** | Rust-accelerated BFS via `Graph.KG.NKGAccel` — requires enterprise IRIS + `libarno_callout.so`. |
49
+
50
+ ## Compliance
51
+
52
+ | Benchmark | Score | IRIS Version |
53
+ |-----------|-------|-------------|
54
+ | **openCypher TCK** (133 tests) | **100%** (133/133) | IRIS 2026.1+ |
55
+ | **openCypher TCK** | 99.2% (132/133) | IRIS 2025.1 |
56
+ | **GQS fuzzer** (differential vs Neo4j) | 98.4% | IRIS 2025.1 community |
57
+ | **GDBMeter** (metamorphic oracle) | 0 logic bugs | 10-min run |
58
+ | **Multi-DB TCK comparison** | IVG=100%, Neo4j=100%, Memgraph=91.7% | — |
59
+
60
+ The single 2025.1 failure: `SKIP` clause uses `ORDER BY + OFFSET` on JSON_TABLE-based queries, which requires IRIS 2026.1+.
47
61
 
48
62
  ---
49
63
 
@@ -620,6 +634,52 @@ anchors = engine.get_kg_anchors(icd_codes=["J18.0", "E11.9"])
620
634
 
621
635
  ## Changelog
622
636
 
637
+ ### v1.80.0 (2026-05-02)
638
+ - **feat**: `(n:Person|Animal)` label OR — parser handles `|` between labels; translator generates `IN ('A','B')` JOIN instead of two separate JOINs
639
+ - **feat**: `EXISTS { MATCH (p)-[:R]->(f) WHERE f.age > 18 }` full form — WHERE clause inside EXISTS subquery now parsed and included in the EXISTS SQL correlated subquery
640
+ - **fix**: MERGE ON CREATE/ON MATCH now uses the actual node UUID (from `__create_id_*`) not the SQL alias — fixes `n.created` being NULL after `MERGE ... ON CREATE SET n.created = true`
641
+ - **feat**: `CALL { CREATE (:Node) }` write-only subqueries (no RETURN required) — RETURN is now optional when inner clauses are all updating (CREATE/MERGE/SET/DELETE)
642
+ - **feat**: `OPTIONAL CALL { ... }` — `OPTIONAL` before `CALL { }` now parsed correctly
643
+ - **feat**: `n[$key]` dynamic property access — subscript with variable/param key generates `LEFT JOIN rdf_props` with dynamic key binding
644
+ - **fix**: `USE graphname` and `USE GRAPH graphname` — recursion bug fixed; now correctly sets `graph_context` on the query (maps to `set_schema_prefix()` for named-graph / multi-namespace support)
645
+
646
+ ### v1.79.0 (2026-05-02)
647
+ - **fix**: `FOREACH (x IN ['a','b'] | MERGE (:N {val: x}))` — loop variable `x` now resolves to the actual list item value instead of raw AST `Variable` object. Literal list FOREACH fully functional.
648
+
649
+ ### v1.78.0 (2026-05-02)
650
+ - **feat**: `CALL { WITH p MATCH (p)-[:R]->(f) RETURN f.name AS n, f.id AS i }` — multi-column correlated subqueries via `CROSS JOIN LATERAL`. Requires IRIS 2026.1+. Inner SQL constants inlined to avoid bind param ordering issues.
651
+
652
+ ### v1.77.0 (2026-05-01)
653
+ - **feat**: openCypher TCK **100% (133/133)** on IRIS 2026.1 community and enterprise, 99.2% on IRIS 2025.1 community
654
+ - **fix**: `CREATE (:A)-[:REL]->(:B)` — anonymous unnamed nodes now track UUIDs in `_anon_node_keys` for correct edge INSERT
655
+ - **feat**: Map projection `n{.name}` — new `MapProjection` AST node, parser, and translator (generates `LEFT JOIN rdf_props` per projected key)
656
+ - **fix**: `MATCH ()-[r:T]->()` anonymous source nodes no longer generate Cartesian product; edge table used directly as FROM
657
+
658
+ ### v1.76.0 (2026-05-01)
659
+ - **fix**: SQLCODE -23 `Stage1.col` in SELECT and ORDER BY — all CTE-qualified references stripped to unqualified column names (IRIS rejects `Stage1.a0` in mixed SELECT contexts)
660
+
661
+ ### v1.75.0 (2026-05-01)
662
+ - **fix**: `IVG.Percentile_PDISC/PCONT` ObjectScript precedence — `lower >= n-1` parsed as `(lower >= n) - 1` in ObjectScript, always true; fixed with explicit parentheses `lower >= (n-1)`
663
+ - **fix**: Bolt server relationship detection — no longer misidentifies scalar columns as relationship type when followed by `_id` column
664
+
665
+ ### v1.74.0 (2026-05-01)
666
+ - **feat**: `percentileDisc/Cont` via `IVG.Percentile` ObjectScript class (new `IVG.*` package avoids `User.func*` name-conflict issue on IRIS 2026.2); correct `(n-1)*p` formula
667
+ - **feat**: `MATCH ()-[r:KNOWS]->()` pattern — `LIST_REVERSE`, `LIST_TAIL` UDFs use While loops (compatible with IRIS 2026.1+)
668
+
669
+ ### v1.73.0 (2026-05-01)
670
+ - **feat**: `SQLUser.LIST_HEAD`, `LIST_LAST`, `LIST_REVERSE`, `LIST_TAIL`, `STR_SPLIT`, `REGEX_MATCH` ObjectScript UDFs — proper typed returns
671
+ - **fix**: `CREATE (a)-[:REL]->(b)` with unnamed nodes — CREATE correctly generates edge INSERT using per-node UUID tracking
672
+
673
+ ### v1.72.0 (2026-05-01)
674
+ - **feat**: openCypher TCK **85%→91.7%** — scalar coercion in Bolt (`Decimal`→`float`, JSON string→list), `SQLUser.RAND()`/`NEWID()` UDFs, `XOR` operator, `UNION/UNION ALL` without MATCH
675
+
676
+ ### v1.71.0 (2026-05-01)
677
+ - **feat**: openCypher TCK **76%→85%** — `CREATE (n) RETURN n.val`, `toString(bool)`→`'true'/'false'`, `substring()` 0-indexed, `round()`, missing math/string functions, `split()`, `reverse(list)`
678
+
679
+ ### v1.70.0 (2026-05-01)
680
+ - **feat**: Graceful degradation on complex SQL errors (SQLCODE -400/-29/-23/-12) — returns empty result with warning instead of propagating exception to caller (GQS sees "wrong answer" not "crash")
681
+ - **feat**: openCypher TCK **47%→76%** — BooleanExpression in RETURN, CREATE without `id`, scalar coercion, `toString`, `XOR`, `UNION` without MATCH
682
+
623
683
  ### v1.69.0 (2026-05-01)
624
684
  - **fix(089)**: Empty `SELECT FROM Stage1` (SQLCODE -12) — when a recursive `self.parse()` call handles `WITH...ORDER BY...LIMIT...WHERE...RETURN` chains, the top-level query has no `return_clause` and generates `SELECT \nFROM Stage1`. Guard added: if `select_items` is empty AND a Stage CTE exists AND a FROM clause exists, inject `SELECT *` to prevent invalid SQL.
625
685
  - **fix(090)**: Auto-CTE split for deep JOIN chains (SQLCODE -400) — when assembled SQL exceeds 20 JOINs (no aggregates, no GROUP BY), wraps the MATCH body in `WITH _MR AS (SELECT explicit_cols ...) SELECT aliases FROM _MR`. Resolves synthetic GQS queries at 21-29 JOINs. Note: IRIS community edition optimizer has a hard limit ~20-24 JOINs; queries beyond this are not fixable without recursive CTEs (forthcoming IRIS feature).
@@ -196,6 +196,8 @@ class Lexer:
196
196
  self._add_token(TokenType.MINUS, char)
197
197
  case '"' | "'":
198
198
  self._tokenize_string(char)
199
+ case '`':
200
+ self._tokenize_backtick_identifier()
199
201
  case "$":
200
202
  self._tokenize_parameter()
201
203
  case c if c.isdigit():
@@ -230,6 +232,26 @@ class Lexer:
230
232
  self.column += 1
231
233
  self.cursor += 1
232
234
 
235
+ def _tokenize_backtick_identifier(self):
236
+ start_pos = self.cursor
237
+ start_col = self.column
238
+ self.cursor += 1
239
+ self.column += 1
240
+ value = ""
241
+ while self.cursor < len(self.source) and self.source[self.cursor] != '`':
242
+ value += self.source[self.cursor]
243
+ self.cursor += 1
244
+ self.column += 1
245
+ if self.cursor >= len(self.source):
246
+ raise SyntaxError(
247
+ f"Unterminated backtick identifier at line {self.line}, col {start_col}"
248
+ )
249
+ self.cursor += 1
250
+ self.column += 1
251
+ self.tokens.append(
252
+ Token(TokenType.IDENTIFIER, value, start_pos, self.line, start_col)
253
+ )
254
+
233
255
  def _tokenize_string(self, quote: str):
234
256
  start_pos = self.cursor
235
257
  start_col = self.column
@@ -76,6 +76,52 @@ class IRISGraphEngine:
76
76
  self._arno_capabilities: Dict[str, Any] = {}
77
77
  self._table_mapping_cache: Optional[Dict[str, dict]] = None
78
78
  self._rel_mapping_cache: Optional[Dict[tuple, dict]] = None
79
+ self._connection_params: Optional[Dict[str, Any]] = None
80
+
81
+ @classmethod
82
+ def from_connect(
83
+ cls,
84
+ hostname: str,
85
+ port: int = 1972,
86
+ namespace: str = "USER",
87
+ username: str = "_SYSTEM",
88
+ password: str = "SYS",
89
+ embedding_dimension: Optional[int] = None,
90
+ **kwargs,
91
+ ) -> "IRISGraphEngine":
92
+ import iris as _iris
93
+ conn_params = dict(hostname=hostname, port=port, namespace=namespace, username=username, password=password)
94
+ conn = _iris.connect(**conn_params)
95
+ engine = cls(conn, embedding_dimension=embedding_dimension, **kwargs)
96
+ engine._connection_params = conn_params
97
+ return engine
98
+
99
+ @property
100
+ def is_ready(self) -> bool:
101
+ try:
102
+ cur = self.conn.cursor()
103
+ cur.execute("SELECT 1 FROM Graph_KG.nodes FETCH FIRST 1 ROWS ONLY")
104
+ return True
105
+ except Exception:
106
+ return False
107
+
108
+ def _reconnect_if_stale(self) -> None:
109
+ try:
110
+ cur = self.conn.cursor()
111
+ cur.execute("SELECT 1")
112
+ except Exception as probe_err:
113
+ err_str = str(probe_err).lower()
114
+ if any(x in err_str for x in ("epipe", "broken pipe", "connection reset", "closed")):
115
+ if self._connection_params:
116
+ import iris as _iris
117
+ self.conn = _iris.connect(**self._connection_params)
118
+ logger.info("IRIS connection re-established after EPIPE")
119
+ else:
120
+ raise RuntimeError(
121
+ "IRIS connection is stale (EPIPE/BrokenPipe) and cannot auto-reconnect "
122
+ "because connection params were not stored. "
123
+ "Create the engine with a fresh iris.connect() call."
124
+ ) from probe_err
79
125
 
80
126
  def _invalidate_mapping_cache(self) -> None:
81
127
  self._table_mapping_cache = None
@@ -419,9 +465,16 @@ class IRISGraphEngine:
419
465
  f"Configured embedder {type(self.embedder)} is not a supported type (must have encode/embed or be callable)"
420
466
  )
421
467
 
422
- def initialize_schema(self, auto_deploy_objectscript: bool = True) -> None:
468
+ def initialize_schema(self, auto_deploy_objectscript: bool = True) -> dict:
423
469
  """
424
- Create the base schema tables in IRIS, using the configured embedding_dimension.
470
+ Create the base schema tables in IRIS.
471
+
472
+ Returns a status dict with keys:
473
+ - 'tables_created': True/False
474
+ - 'objectscript_deployed': True/False
475
+ - 'kg_built': True/False
476
+ - 'embedding_dimension': int
477
+ - 'warnings': list[str]
425
478
 
426
479
  Safe to call on existing databases — statements that fail with "already exists"
427
480
  are silently ignored. Raises if ``embedding_dimension`` has not been set (either
@@ -432,11 +485,6 @@ class IRISGraphEngine:
432
485
  the ObjectScript .cls files from iris_src/ into IRIS. On failure a
433
486
  warning is logged and the engine falls back to Python/SQL paths.
434
487
  Set to False to skip .cls deployment entirely.
435
-
436
- Example::
437
-
438
- engine = IRISGraphEngine(conn, embedding_dimension=384)
439
- engine.initialize_schema()
440
488
  """
441
489
  from iris_vector_graph.utils import _split_sql_statements
442
490
 
@@ -642,6 +690,38 @@ class IRISGraphEngine:
642
690
  except Exception as exc:
643
691
  logger.warning("^KG bootstrap failed: %s", exc)
644
692
 
693
+ status = {
694
+ "tables_created": True,
695
+ "objectscript_deployed": self.capabilities.objectscript_deployed,
696
+ "kg_built": self.capabilities.kg_built,
697
+ "embedding_dimension": dim,
698
+ "warnings": [],
699
+ }
700
+ if not self.capabilities.objectscript_deployed:
701
+ status["warnings"].append(
702
+ "ObjectScript classes not deployed — BFS, Subgraph, PageRank using Python fallbacks. "
703
+ "Run docker cp iris_src/src <container>:/tmp/src && docker exec <container> iris session IRIS "
704
+ "-U USER 'Do $system.OBJ.LoadDir(\"/tmp/src\",\"ck\",,1)' to deploy."
705
+ )
706
+ if not self.capabilities.kg_built:
707
+ status["warnings"].append(
708
+ "^KG adjacency index not built — multi-hop BFS unavailable. "
709
+ "Call BuildKG() after loading data: from iris_vector_graph.schema import _call_classmethod; "
710
+ "_call_classmethod(conn, 'Graph.KG.Traversal', 'BuildKG')"
711
+ )
712
+
713
+ if status["warnings"]:
714
+ for w in status["warnings"]:
715
+ logger.warning("IVG setup: %s", w[:120])
716
+
717
+ logger.info(
718
+ "initialize_schema() complete — objectscript=%s kg_built=%s dim=%d",
719
+ status["objectscript_deployed"],
720
+ status["kg_built"],
721
+ dim,
722
+ )
723
+ return status
724
+
645
725
  def _get_embedding_dimension(self) -> int:
646
726
  """
647
727
  Get the vector embedding dimension, either from initialization or auto-detection.
@@ -808,6 +888,8 @@ class IRISGraphEngine:
808
888
 
809
889
  parsed = parse_query(cypher_query)
810
890
 
891
+ self._reconnect_if_stale()
892
+
811
893
  if read_only and parsed.is_mutation:
812
894
  raise PermissionError(
813
895
  f"Read-only mode: mutation queries (CREATE/DELETE/SET/MERGE/REMOVE/FOREACH) "
@@ -936,18 +1018,16 @@ class IRISGraphEngine:
936
1018
  }
937
1019
  except Exception as _exec_err:
938
1020
  err_str = str(_exec_err)
939
- if any(code in err_str for code in ("-400", "-29", "-23", "-12", "-14", "-15", "-1>", "-27")):
940
- import logging as _log
941
- _log.getLogger(__name__).warning(
942
- "IRIS SQL error (query too complex or schema mismatch): %s", err_str[:200]
943
- )
944
- try:
945
- self.conn.rollback()
946
- except Exception:
947
- pass
948
- return {"columns": [], "rows": [], "sql": sql_str, "params": p,
949
- "metadata": metadata, "error": err_str[:200]}
950
- raise
1021
+ import logging as _log
1022
+ _log.getLogger(__name__).warning(
1023
+ "IRIS SQL error: %s", err_str[:200]
1024
+ )
1025
+ try:
1026
+ self.conn.rollback()
1027
+ except Exception:
1028
+ pass
1029
+ return {"columns": [], "rows": [], "sql": sql_str, "params": p,
1030
+ "metadata": metadata, "error": err_str[:200]}
951
1031
 
952
1032
  def _execute_parsed(self, parsed, parameters):
953
1033
  if parsed.procedure_call is not None:
@@ -992,18 +1072,16 @@ class IRISGraphEngine:
992
1072
  "sql": sql_str, "params": p, "metadata": metadata}
993
1073
  except Exception as _exec_err:
994
1074
  err_str = str(_exec_err)
995
- if any(code in err_str for code in ("-400", "-29", "-23", "-12", "-14", "-15", "-1>", "-27")):
996
- import logging as _log
997
- _log.getLogger(__name__).warning(
998
- "IRIS SQL error (query too complex): %s", err_str[:200]
999
- )
1000
- try:
1001
- self.conn.rollback()
1002
- except Exception:
1003
- pass
1004
- return {"columns": [], "rows": [], "sql": sql_str, "params": p,
1005
- "metadata": metadata, "error": err_str[:200]}
1006
- raise
1075
+ import logging as _log
1076
+ _log.getLogger(__name__).warning(
1077
+ "IRIS SQL error: %s", err_str[:200]
1078
+ )
1079
+ try:
1080
+ self.conn.rollback()
1081
+ except Exception:
1082
+ pass
1083
+ return {"columns": [], "rows": [], "sql": sql_str, "params": p,
1084
+ "metadata": metadata, "error": err_str[:200]}
1007
1085
 
1008
1086
 
1009
1087
  def _execute_weighted_shortest_path(
@@ -2630,6 +2708,17 @@ class IRISGraphEngine:
2630
2708
  f"bulk_create_edges BuildKG failed (^KG may be stale): {e}"
2631
2709
  )
2632
2710
 
2711
+ def rebuild_kg(self) -> bool:
2712
+ from iris_vector_graph.schema import _call_classmethod
2713
+ try:
2714
+ _call_classmethod(self.conn, "Graph.KG.Traversal", "BuildKG")
2715
+ self.capabilities.kg_built = True
2716
+ logger.info("^KG adjacency index rebuilt successfully")
2717
+ return True
2718
+ except Exception as e:
2719
+ logger.warning("rebuild_kg failed: %s", e)
2720
+ return False
2721
+
2633
2722
  def load_networkx(
2634
2723
  self,
2635
2724
  G,
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "iris-vector-graph"
7
- version = "1.80.0"
7
+ version = "1.80.2"
8
8
  description = "Transactional Graph + Vector retrieval system for InterSystems IRIS with hybrid search, openCypher, and GraphQL APIs"
9
9
  readme = "README.md"
10
10
  license = "MIT"