iris-vector-graph 1.59.2__tar.gz → 1.60.0__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 (239) hide show
  1. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/PKG-INFO +12 -1
  2. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/README.md +11 -0
  3. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/ast.py +30 -0
  4. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/parser.py +37 -0
  5. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/translator.py +90 -5
  6. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/pyproject.toml +1 -1
  7. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/.gitignore +0 -0
  8. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/LICENSE +0 -0
  9. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/demo_biomedical.py +0 -0
  10. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/demo_fraud_detection.py +0 -0
  11. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/demo_fraud_detection_sql.py +0 -0
  12. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/demo_utils.py +0 -0
  13. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/demo_working_system.py +0 -0
  14. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/__init__.py +0 -0
  15. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical/__init__.py +0 -0
  16. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical/loaders.py +0 -0
  17. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical/resolver.py +0 -0
  18. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical/types.py +0 -0
  19. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical_legacy/__init__.py +0 -0
  20. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical_legacy/biomedical_engine.py +0 -0
  21. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical_legacy/biomedical_schema.py +0 -0
  22. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical_legacy/legacy_wrapper.py +0 -0
  23. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/fraud/__init__.py +0 -0
  24. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/fraud/loaders.py +0 -0
  25. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/fraud/resolver.py +0 -0
  26. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/fraud/types.py +0 -0
  27. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/graphQL.http +0 -0
  28. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/hybrid_vector_graph_query.cypher +0 -0
  29. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/rest.http +0 -0
  30. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Algorithms.cls +0 -0
  31. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/ArnoAccel.cls +0 -0
  32. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/BM25Index.cls +0 -0
  33. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/BenchFormat.cls +0 -0
  34. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/BenchSeeder.cls +0 -0
  35. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Benchmark.cls +0 -0
  36. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Edge.cls +0 -0
  37. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/EdgeScan.cls +0 -0
  38. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/GraphIndex.cls +0 -0
  39. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/IVFIndex.cls +0 -0
  40. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Loader.cls +0 -0
  41. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/MCPService.cls +0 -0
  42. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/MCPToolSet.cls +0 -0
  43. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/MCPTools.cls +0 -0
  44. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Meta.cls +0 -0
  45. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/PLAIDSearch.cls +0 -0
  46. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/PageRank.cls +0 -0
  47. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/PyOps.cls +0 -0
  48. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Service.cls +0 -0
  49. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Snapshot.cls +0 -0
  50. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Subgraph.cls +0 -0
  51. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/TemporalIndex.cls +0 -0
  52. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/TestEdge.cls +0 -0
  53. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Traversal.cls +0 -0
  54. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/VecIndex.cls +0 -0
  55. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/PageRankEmbedded.cls +0 -0
  56. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/User.Exec.cls +0 -0
  57. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/iris/vector/graph/GraphOperators.cls +0 -0
  58. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/__init__.py +0 -0
  59. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/bolt_server.py +0 -0
  60. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/bulk_loader.py +0 -0
  61. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/capabilities.py +0 -0
  62. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/__init__.py +0 -0
  63. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/algorithms/__init__.py +0 -0
  64. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/algorithms/paths.py +0 -0
  65. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/lexer.py +0 -0
  66. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher_api.py +0 -0
  67. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/embedded.py +0 -0
  68. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/engine.py +0 -0
  69. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/fusion.py +0 -0
  70. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/gql/__init__.py +0 -0
  71. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/gql/constants.py +0 -0
  72. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/gql/engine.py +0 -0
  73. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/gql/pooling.py +0 -0
  74. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/gql/resolvers.py +0 -0
  75. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/gql/schema.py +0 -0
  76. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/models.py +0 -0
  77. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/operators.py +0 -0
  78. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/py.typed +0 -0
  79. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/schema.py +0 -0
  80. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/security.py +0 -0
  81. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/text_search.py +0 -0
  82. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/utils.py +0 -0
  83. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/vector_utils.py +0 -0
  84. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/fhir_bridges.sql +0 -0
  85. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/fraud_sample_data.sql +0 -0
  86. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/globals_schema.sql +0 -0
  87. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/graph_path_globals.sql +0 -0
  88. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/graph_walk_tvf.sql +0 -0
  89. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/migrations/000_base_schema_iris.sql +0 -0
  90. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/migrations/001_add_nodepk_table.sql +0 -0
  91. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/migrations/001_rollback_nodepk.sql +0 -0
  92. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/migrations/002_add_fk_constraints.sql +0 -0
  93. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/operators.sql +0 -0
  94. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/operators_fixed.sql +0 -0
  95. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/procedures/kg_PageRank.sql +0 -0
  96. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/rdf_reifications.sql +0 -0
  97. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/schema.sql +0 -0
  98. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/TESTING.md +0 -0
  99. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmark_parser.py +0 -0
  100. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/benchmark_neo4j.py +0 -0
  101. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/bfs_benchmark.py +0 -0
  102. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/establish_baseline.py +0 -0
  103. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/graph_gen.py +0 -0
  104. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/iris_baseline_run.py +0 -0
  105. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/iris_os_run.py +0 -0
  106. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/load_neo4j.py +0 -0
  107. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/synthetic_baseline.csv +0 -0
  108. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/conftest.py +0 -0
  109. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/contract/__init__.py +0 -0
  110. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/contract/test_cypher_api.py +0 -0
  111. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/contract/test_cypher_api_errors.py +0 -0
  112. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/contract/test_graphql_queries.py +0 -0
  113. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/contract/test_graphql_schema.py +0 -0
  114. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/contract/test_ppr_api.py +0 -0
  115. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/curl_suite.sh +0 -0
  116. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/__init__.py +0 -0
  117. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/conftest.py +0 -0
  118. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_biomedical_demo.py +0 -0
  119. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_biomedical_ui.py +0 -0
  120. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_cypher_coerce_e2e.py +0 -0
  121. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_cypher_sprints_e2e.py +0 -0
  122. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_cypher_vector_search.py +0 -0
  123. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_fhir_bridges_e2e.py +0 -0
  124. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_fraud_demo.py +0 -0
  125. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_fraud_ui.py +0 -0
  126. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_gql_autogen_startup.py +0 -0
  127. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_gql_cypher_passthrough.py +0 -0
  128. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_gql_node_queries.py +0 -0
  129. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_gql_semantic_search.py +0 -0
  130. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_gql_traversal.py +0 -0
  131. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_graph_kernels_e2e.py +0 -0
  132. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_hla_kg_e2e.py +0 -0
  133. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_multi_query_engine_platform.py +0 -0
  134. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_named_paths_e2e.py +0 -0
  135. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_nkg_index_e2e.py +0 -0
  136. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_operator_wiring_e2e.py +0 -0
  137. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_plaid_search_e2e.py +0 -0
  138. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_ppr_cls_fast_path.py +0 -0
  139. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_ppr_guided_e2e.py +0 -0
  140. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_procedure_installation.py +0 -0
  141. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_reification_e2e.py +0 -0
  142. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_schema_procedures_e2e.py +0 -0
  143. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_subgraph_e2e.py +0 -0
  144. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_subquery_call_e2e.py +0 -0
  145. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_vecindex_e2e.py +0 -0
  146. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/__init__.py +0 -0
  147. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/conftest.py +0 -0
  148. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/gql/__init__.py +0 -0
  149. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/gql/test_graphql_mutations.py +0 -0
  150. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/gql/test_graphql_nested_queries.py +0 -0
  151. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/gql/test_graphql_queries.py +0 -0
  152. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/gql/test_graphql_vector_search.py +0 -0
  153. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_bidirectional_ppr.py +0 -0
  154. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cls_layer.py +0 -0
  155. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_advanced.py +0 -0
  156. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_enhancements.py +0 -0
  157. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_multi_type.py +0 -0
  158. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_rd.py +0 -0
  159. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_rel_vars.py +0 -0
  160. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_single_type.py +0 -0
  161. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_untyped.py +0 -0
  162. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_vector_search.py +0 -0
  163. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_embeddings_api.py +0 -0
  164. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_fastapi_graphql.py +0 -0
  165. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_fhir_bridges_integration.py +0 -0
  166. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_named_paths_integration.py +0 -0
  167. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_nodepk_advanced_benchmarks.py +0 -0
  168. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_nodepk_constraints.py +0 -0
  169. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_nodepk_graph_analytics.py +0 -0
  170. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_nodepk_migration.py +0 -0
  171. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_nodepk_performance.py +0 -0
  172. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_nodepk_production_scale.py +0 -0
  173. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_objectscript_classes.py +0 -0
  174. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_pagerank_sql_optimization.py +0 -0
  175. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_reification_integration.py +0 -0
  176. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_schema_migration.py +0 -0
  177. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_stored_procedure_install.py +0 -0
  178. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_subquery_call_integration.py +0 -0
  179. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/performance/conftest.py +0 -0
  180. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/performance/scale_benchmark.py +0 -0
  181. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/performance/test_ppr_stress.py +0 -0
  182. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/performance/test_stress_v1_5.py +0 -0
  183. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/run_all_tests.py +0 -0
  184. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_iris_rest_api.py +0 -0
  185. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_networkx_loader.py +0 -0
  186. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_performance_benchmarks.py +0 -0
  187. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_pyops_vector_conversion.py +0 -0
  188. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_python_operators.py +0 -0
  189. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_python_sdk.py +0 -0
  190. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_schema_validation.py +0 -0
  191. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_sql_queries.py +0 -0
  192. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_vector_functions.py +0 -0
  193. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/cypher/__init__.py +0 -0
  194. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/cypher/test_lexer.py +0 -0
  195. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/cypher/test_lexer_advanced.py +0 -0
  196. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/cypher/test_parser.py +0 -0
  197. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/cypher/test_parser_advanced.py +0 -0
  198. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_batch_mutations.py +0 -0
  199. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_bm25_index.py +0 -0
  200. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_bolt_server.py +0 -0
  201. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cls_deployment.py +0 -0
  202. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_case_when.py +0 -0
  203. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_functions.py +0 -0
  204. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_parser.py +0 -0
  205. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_posos_bugs.py +0 -0
  206. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_procedures.py +0 -0
  207. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_translator.py +0 -0
  208. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_union_exists.py +0 -0
  209. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_var_length.py +0 -0
  210. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_vector_search.py +0 -0
  211. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_edge_embeddings.py +0 -0
  212. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_edgeprop_ndjson.py +0 -0
  213. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_embedded.py +0 -0
  214. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_engine_dimension_fix.py +0 -0
  215. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_engine_embeddings.py +0 -0
  216. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_fhir_bridges.py +0 -0
  217. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_get_nodes.py +0 -0
  218. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_graph_kernels.py +0 -0
  219. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_graphql_dataloader.py +0 -0
  220. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_ingest_formats.py +0 -0
  221. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_ivf_index.py +0 -0
  222. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_named_graphs.py +0 -0
  223. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_named_paths.py +0 -0
  224. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_operators_wiring.py +0 -0
  225. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_plaid_search.py +0 -0
  226. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_ppr_guided_subgraph.py +0 -0
  227. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_reification.py +0 -0
  228. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_schema_init.py +0 -0
  229. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_schema_procedures.py +0 -0
  230. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_shortest_path.py +0 -0
  231. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_snapshot.py +0 -0
  232. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_sql_splitter.py +0 -0
  233. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_sql_table_bridge.py +0 -0
  234. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_subgraph.py +0 -0
  235. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_subquery_call.py +0 -0
  236. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_temporal_cypher.py +0 -0
  237. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_temporal_edges.py +0 -0
  238. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_unified_edge_store.py +0 -0
  239. {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/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.59.2
3
+ Version: 1.60.0
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
@@ -655,6 +655,17 @@ anchors = engine.get_kg_anchors(icd_codes=["J18.0", "E11.9"])
655
655
 
656
656
  ## Changelog
657
657
 
658
+ ### v1.60.0 (2026-04-24)
659
+
660
+ Four openCypher gaps closed, all from structured gap analysis against the openCypher grammar spec:
661
+
662
+ - feat: `WHERE n:Label` predicate — `MATCH (n) WHERE n:Gene AND n.id = 'x'` now works; translates to `EXISTS (SELECT 1 FROM rdf_labels WHERE label = ?)` (spec 068)
663
+ - feat: Map literal expressions — `RETURN {id: n.id, score: 0.9} AS obj` translates to `JSON_OBJECT(...)` (spec 069)
664
+ - feat: `WITH agg-alias HAVING filter` — `WITH n, count(r) AS cnt WHERE cnt > 2` now emits SQL `HAVING cnt > 2` correctly; was `ValueError: Undefined: cnt` (spec 070)
665
+ - feat: Subscript/slice/property-access postfix — `list[n]`, `list[start..end]`, `expr.key` on any expression; translates to `JSON_ARRAYGET`, `JSON_ARRAY_SLICE`, `JSON_VALUE` (spec 071)
666
+ - fix: `DELETE r` by relationship variable now emits `WHERE (s,p,o_id) IN (SELECT ...)` instead of broken correlated subquery (spec 071)
667
+
668
+
658
669
  ### v1.59.2 (2026-04-24)
659
670
  - fix: Cypher `WHERE x IN $param` and `WHERE x IN [list]` now correctly emit `IN (?,?,?)` — previously emitted `IN ?` which IRIS DBAPI can't expand. Enables batch multi-node queries like `MATCH (a)-[r]-(b) WHERE a.id IN $node_ids RETURN ...` (20× speedup for 2-hop expansion vs N sequential queries).
660
671
 
@@ -583,6 +583,17 @@ anchors = engine.get_kg_anchors(icd_codes=["J18.0", "E11.9"])
583
583
 
584
584
  ## Changelog
585
585
 
586
+ ### v1.60.0 (2026-04-24)
587
+
588
+ Four openCypher gaps closed, all from structured gap analysis against the openCypher grammar spec:
589
+
590
+ - feat: `WHERE n:Label` predicate — `MATCH (n) WHERE n:Gene AND n.id = 'x'` now works; translates to `EXISTS (SELECT 1 FROM rdf_labels WHERE label = ?)` (spec 068)
591
+ - feat: Map literal expressions — `RETURN {id: n.id, score: 0.9} AS obj` translates to `JSON_OBJECT(...)` (spec 069)
592
+ - feat: `WITH agg-alias HAVING filter` — `WITH n, count(r) AS cnt WHERE cnt > 2` now emits SQL `HAVING cnt > 2` correctly; was `ValueError: Undefined: cnt` (spec 070)
593
+ - feat: Subscript/slice/property-access postfix — `list[n]`, `list[start..end]`, `expr.key` on any expression; translates to `JSON_ARRAYGET`, `JSON_ARRAY_SLICE`, `JSON_VALUE` (spec 071)
594
+ - fix: `DELETE r` by relationship variable now emits `WHERE (s,p,o_id) IN (SELECT ...)` instead of broken correlated subquery (spec 071)
595
+
596
+
586
597
  ### v1.59.2 (2026-04-24)
587
598
  - fix: Cypher `WHERE x IN $param` and `WHERE x IN [list]` now correctly emit `IN (?,?,?)` — previously emitted `IN ?` which IRIS DBAPI can't expand. Enables batch multi-node queries like `MATCH (a)-[r]-(b) WHERE a.id IN $node_ids RETURN ...` (20× speedup for 2-hop expansion vs N sequential queries).
588
599
 
@@ -198,6 +198,36 @@ class WhereClause:
198
198
  expression: BooleanExpression
199
199
 
200
200
 
201
+ @dataclass(slots=True)
202
+ class LabelPredicate:
203
+ variable: str
204
+ label: str
205
+
206
+
207
+ @dataclass(slots=True)
208
+ class MapLiteral:
209
+ entries: dict
210
+
211
+
212
+ @dataclass(slots=True)
213
+ class SubscriptExpression:
214
+ expression: Any
215
+ index: Any
216
+
217
+
218
+ @dataclass(slots=True)
219
+ class SliceExpression:
220
+ expression: Any
221
+ start: Any
222
+ end: Any
223
+
224
+
225
+ @dataclass(slots=True)
226
+ class PropertyAccessExpression:
227
+ expression: Any
228
+ property_name: str
229
+
230
+
201
231
  @dataclass(slots=True)
202
232
  class MatchClause:
203
233
  """MATCH clause with one or more patterns"""
@@ -802,11 +802,42 @@ class Parser:
802
802
  self.eat()
803
803
  exp = self.parse_power_expression()
804
804
  return ast.FunctionCall(function_name="__arith_^", arguments=[base, exp])
805
+ while self.peek().kind in (TokenType.LBRACKET, TokenType.DOT):
806
+ if self.peek().kind == TokenType.LBRACKET:
807
+ self.eat()
808
+ if self.peek().kind == TokenType.DOT and self.lexer.peek_ahead(1).kind == TokenType.DOT:
809
+ self.eat()
810
+ self.eat()
811
+ end = self.parse_primary_expression()
812
+ self.expect(TokenType.RBRACKET)
813
+ base = ast.SliceExpression(expression=base, start=ast.Literal(0), end=end)
814
+ else:
815
+ first = self.parse_primary_expression()
816
+ if self.peek().kind == TokenType.DOT and self.lexer.peek_ahead(1).kind == TokenType.DOT:
817
+ self.eat()
818
+ self.eat()
819
+ second = self.parse_primary_expression()
820
+ self.expect(TokenType.RBRACKET)
821
+ base = ast.SliceExpression(expression=base, start=first, end=second)
822
+ else:
823
+ self.expect(TokenType.RBRACKET)
824
+ base = ast.SubscriptExpression(expression=base, index=first)
825
+ elif self.peek().kind == TokenType.DOT:
826
+ self.eat()
827
+ prop_tok = self.expect(TokenType.IDENTIFIER)
828
+ base = ast.PropertyAccessExpression(
829
+ expression=base, property_name=prop_tok.value or ""
830
+ )
805
831
  return base
806
832
 
807
833
  def parse_comparison_expression(self) -> Any:
808
834
  left = self.parse_additive_expression()
809
835
 
836
+ if isinstance(left, ast.Variable) and self.peek().kind == TokenType.COLON:
837
+ self.eat()
838
+ label_tok = self.expect(TokenType.IDENTIFIER)
839
+ return ast.LabelPredicate(variable=left.name, label=label_tok.value or "")
840
+
810
841
  # Binary comparisons
811
842
  tok = self.peek()
812
843
  op = None
@@ -873,6 +904,12 @@ class Parser:
873
904
  self.expect(TokenType.RPAREN)
874
905
  return expr
875
906
 
907
+ if tok.kind == TokenType.LBRACE:
908
+ self.eat()
909
+ entries = self.parse_map_literal()
910
+ self.expect(TokenType.RBRACE)
911
+ return ast.MapLiteral(entries=entries)
912
+
876
913
  if tok.kind == TokenType.IDENTIFIER:
877
914
  name = self.eat().value
878
915
  if name is None:
@@ -149,6 +149,7 @@ class TranslationContext:
149
149
  self.from_clauses: List[str] = []
150
150
  self.join_clauses: List[str] = []
151
151
  self.where_conditions: List[str] = []
152
+ self.having_conditions: List[str] = []
152
153
  self.group_by_items: List[str] = []
153
154
 
154
155
  self.select_params: List[Any] = []
@@ -228,6 +229,8 @@ class TranslationContext:
228
229
  parts.append(f"WHERE {' AND '.join(self.where_conditions)}")
229
230
  if self.group_by_items:
230
231
  parts.append(f"GROUP BY {', '.join(self.group_by_items)}")
232
+ if self.having_conditions:
233
+ parts.append(f"HAVING {' AND '.join(self.having_conditions)}")
231
234
  sql = "\n".join(parts)
232
235
  params = (
233
236
  (self.select_params if not select_override else [])
@@ -1354,9 +1357,12 @@ def translate_delete_clause(delete, context, metadata):
1354
1357
  subparams,
1355
1358
  )
1356
1359
  else:
1360
+ subquery_spo, subparams_spo = context.build_stage_sql(
1361
+ select_override=f"SELECT {alias}.s, {alias}.p, {alias}.o_id"
1362
+ )
1357
1363
  context.add_dml(
1358
- f"DELETE FROM {_table('rdf_edges')} WHERE s = (SELECT s FROM {_table('rdf_edges')} {alias}) AND p = (SELECT p FROM {_table('rdf_edges')} {alias}) AND o_id = (SELECT o_id FROM {_table('rdf_edges')} {alias})",
1359
- [],
1364
+ f"DELETE FROM {_table('rdf_edges')} WHERE (s, p, o_id) IN ({subquery_spo})",
1365
+ subparams_spo,
1360
1366
  )
1361
1367
 
1362
1368
 
@@ -1999,6 +2005,15 @@ def translate_boolean_expression(expr, context) -> str:
1999
2005
  prefix = "NOT " if expr.negated else ""
2000
2006
  return f"{prefix}EXISTS ({sub})"
2001
2007
  return "1=1"
2008
+ if isinstance(expr, ast.LabelPredicate):
2009
+ alias = context.variable_aliases.get(expr.variable)
2010
+ node_col = f"{alias}.node_id" if alias else "node_id"
2011
+ labels_tbl = _table("rdf_labels")
2012
+ safe_label = context.add_where_param(expr.label)
2013
+ return (
2014
+ f"EXISTS (SELECT 1 FROM {labels_tbl} _lp WHERE _lp.s = {node_col}"
2015
+ f" AND _lp.label = {safe_label})"
2016
+ )
2002
2017
  if not isinstance(expr, ast.BooleanExpression):
2003
2018
  return translate_expression(expr, context, segment="where")
2004
2019
  op = expr.operator
@@ -2343,6 +2358,28 @@ def translate_expression(expr, context, segment="select") -> str:
2343
2358
  f'LEFT JOIN {_table("rdf_props")} {p_alias} ON {p_alias}.s = {alias}.node_id AND {p_alias}."key" = {context.add_join_param(expr.property_name)}'
2344
2359
  )
2345
2360
  return f"{p_alias}.val"
2361
+ if isinstance(expr, ast.MapLiteral):
2362
+ if not expr.entries:
2363
+ return "JSON_OBJECT()"
2364
+ parts = []
2365
+ for k, v in expr.entries.items():
2366
+ key_sql = f"'{k}'"
2367
+ val_sql = translate_expression(v, context, segment=segment)
2368
+ parts.append(f"{key_sql}, {val_sql}")
2369
+ return f"JSON_OBJECT({', '.join(parts)})"
2370
+ if isinstance(expr, ast.SubscriptExpression):
2371
+ base_sql = translate_expression(expr.expression, context, segment=segment)
2372
+ idx_sql = translate_expression(expr.index, context, segment=segment)
2373
+ return f"JSON_ARRAYGET({base_sql}, {idx_sql})"
2374
+ if isinstance(expr, ast.SliceExpression):
2375
+ base_sql = translate_expression(expr.expression, context, segment=segment)
2376
+ start_sql = translate_expression(expr.start, context, segment=segment)
2377
+ end_sql = translate_expression(expr.end, context, segment=segment)
2378
+ return f"JSON_ARRAY_SLICE({base_sql}, {start_sql}, {end_sql})"
2379
+ if isinstance(expr, ast.PropertyAccessExpression):
2380
+ base_sql = translate_expression(expr.expression, context, segment=segment)
2381
+ prop = expr.property_name.replace("'", "''")
2382
+ return f"JSON_VALUE({base_sql}, '$.{prop}')"
2346
2383
  if isinstance(expr, ast.Variable):
2347
2384
  alias = context.variable_aliases.get(expr.name)
2348
2385
  if not alias:
@@ -2615,6 +2652,7 @@ def translate_with_clause(with_clause, context):
2615
2652
  has_agg = any(
2616
2653
  isinstance(i.expression, ast.AggregationFunction) for i in with_clause.items
2617
2654
  )
2655
+ agg_aliases: set = set()
2618
2656
  for item in with_clause.items:
2619
2657
  sql = translate_expression(item.expression, context, segment="select")
2620
2658
  alias = item.alias
@@ -2630,7 +2668,54 @@ def translate_with_clause(with_clause, context):
2630
2668
  context.select_items.append(f"{sql} AS {alias.replace('.', '_')}")
2631
2669
  if has_agg and not isinstance(item.expression, ast.AggregationFunction):
2632
2670
  context.group_by_items.append(sql)
2671
+ if isinstance(item.expression, ast.AggregationFunction):
2672
+ agg_aliases.add(alias)
2633
2673
  if with_clause.where_clause:
2634
- context.where_conditions.append(
2635
- translate_boolean_expression(with_clause.where_clause.expression, context)
2636
- )
2674
+ expr = with_clause.where_clause.expression
2675
+ if has_agg and agg_aliases and _references_agg_alias(expr, agg_aliases):
2676
+ context.having_conditions.append(
2677
+ _translate_having_expr(expr, agg_aliases, context)
2678
+ )
2679
+ else:
2680
+ context.where_conditions.append(
2681
+ translate_boolean_expression(expr, context)
2682
+ )
2683
+
2684
+
2685
+ def _references_agg_alias(expr, agg_aliases: set) -> bool:
2686
+ if isinstance(expr, ast.Variable) and expr.name in agg_aliases:
2687
+ return True
2688
+ if isinstance(expr, ast.BooleanExpression):
2689
+ return any(_references_agg_alias(o, agg_aliases) for o in expr.operands)
2690
+ return False
2691
+
2692
+
2693
+ def _translate_having_expr(expr, agg_aliases: set, context) -> str:
2694
+ if isinstance(expr, ast.Variable) and expr.name in agg_aliases:
2695
+ return expr.name
2696
+ if isinstance(expr, ast.BooleanExpression):
2697
+ op = expr.operator
2698
+ if op == ast.BooleanOperator.AND:
2699
+ return "(" + " AND ".join(
2700
+ _translate_having_expr(o, agg_aliases, context) for o in expr.operands
2701
+ ) + ")"
2702
+ if op == ast.BooleanOperator.OR:
2703
+ return "(" + " OR ".join(
2704
+ _translate_having_expr(o, agg_aliases, context) for o in expr.operands
2705
+ ) + ")"
2706
+ if op == ast.BooleanOperator.NOT:
2707
+ return f"NOT ({_translate_having_expr(expr.operands[0], agg_aliases, context)})"
2708
+ left = _translate_having_expr(expr.operands[0], agg_aliases, context)
2709
+ right_expr = expr.operands[1] if len(expr.operands) > 1 else None
2710
+ right = translate_expression(right_expr, context, segment="where") if right_expr is not None else ""
2711
+ op_map = {
2712
+ ast.BooleanOperator.EQUALS: "=",
2713
+ ast.BooleanOperator.NOT_EQUALS: "<>",
2714
+ ast.BooleanOperator.LESS_THAN: "<",
2715
+ ast.BooleanOperator.LESS_THAN_OR_EQUAL: "<=",
2716
+ ast.BooleanOperator.GREATER_THAN: ">",
2717
+ ast.BooleanOperator.GREATER_THAN_OR_EQUAL: ">=",
2718
+ }
2719
+ if op in op_map:
2720
+ return f"{left} {op_map[op]} {right}"
2721
+ return translate_boolean_expression(expr, context)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "iris-vector-graph"
7
- version = "1.59.2"
7
+ version = "1.60.0"
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"