iris-vector-graph 1.87.0__tar.gz → 1.89.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 (556) hide show
  1. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/PKG-INFO +40 -1
  2. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/README.md +39 -0
  3. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/EdgeScan.cls +1 -1
  4. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/NKGAccel.cls +57 -8
  5. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/Traversal.cls +65 -0
  6. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/engine.py +37 -20
  7. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/pyproject.toml +1 -1
  8. iris_vector_graph-1.89.0/tests/e2e/test_arno_bfs_unified.py +137 -0
  9. iris_vector_graph-1.89.0/tests/e2e/test_ic3_exact_count.py +108 -0
  10. iris_vector_graph-1.89.0/tests/e2e/test_untested_methods.py +364 -0
  11. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/.gitignore +0 -0
  12. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/LICENSE +0 -0
  13. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/demo_biomedical.py +0 -0
  14. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/demo_fraud_detection.py +0 -0
  15. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/demo_fraud_detection_sql.py +0 -0
  16. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/demo_utils.py +0 -0
  17. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/demo_working_system.py +0 -0
  18. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/domains/__init__.py +0 -0
  19. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/domains/biomedical/__init__.py +0 -0
  20. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/domains/biomedical/loaders.py +0 -0
  21. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/domains/biomedical/resolver.py +0 -0
  22. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/domains/biomedical/types.py +0 -0
  23. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/domains/biomedical_legacy/__init__.py +0 -0
  24. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/domains/biomedical_legacy/biomedical_engine.py +0 -0
  25. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/domains/biomedical_legacy/biomedical_schema.py +0 -0
  26. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/domains/biomedical_legacy/legacy_wrapper.py +0 -0
  27. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/domains/fraud/__init__.py +0 -0
  28. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/domains/fraud/loaders.py +0 -0
  29. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/domains/fraud/resolver.py +0 -0
  30. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/domains/fraud/types.py +0 -0
  31. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/graphQL.http +0 -0
  32. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/hybrid_vector_graph_query.cypher +0 -0
  33. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/examples/rest.http +0 -0
  34. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/Algorithms.cls +0 -0
  35. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/ArnoAccel.cls +0 -0
  36. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/BM25Index.cls +0 -0
  37. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/BenchFormat.cls +0 -0
  38. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/BenchSeeder.cls +0 -0
  39. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/Benchmark.cls +0 -0
  40. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/Edge.cls +0 -0
  41. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/GraphIndex.cls +0 -0
  42. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/IVFIndex.cls +0 -0
  43. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/Loader.cls +0 -0
  44. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/MCPService.cls +0 -0
  45. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/MCPToolSet.cls +0 -0
  46. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/MCPTools.cls +0 -0
  47. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/Meta.cls +0 -0
  48. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/PLAIDSearch.cls +0 -0
  49. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/PageRank.cls +0 -0
  50. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/PyOps.cls +0 -0
  51. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/Service.cls +0 -0
  52. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/Snapshot.cls +0 -0
  53. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/Subgraph.cls +0 -0
  54. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/TemporalIndex.cls +0 -0
  55. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/TestEdge.cls +0 -0
  56. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/Graph/KG/VecIndex.cls +0 -0
  57. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/IVG/CypherEngine.cls +0 -0
  58. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/IVG/Percentile.cls +0 -0
  59. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/PageRankEmbedded.cls +0 -0
  60. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/User.Exec.cls +0 -0
  61. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_src/src/iris/vector/graph/GraphOperators.cls +0 -0
  62. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/__init__.py +0 -0
  63. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/_validate.py +0 -0
  64. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/bolt_server.py +0 -0
  65. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/0-b124e26129aa436b26fe.bundle.js +0 -0
  66. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/1-b124e26129aa436b26fe.bundle.js +0 -0
  67. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/10-b124e26129aa436b26fe.bundle.js +0 -0
  68. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/11-b124e26129aa436b26fe.bundle.js +0 -0
  69. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/12-b124e26129aa436b26fe.bundle.js +0 -0
  70. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/13-b124e26129aa436b26fe.bundle.js +0 -0
  71. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/14-b124e26129aa436b26fe.bundle.js +0 -0
  72. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/15-b124e26129aa436b26fe.bundle.js +0 -0
  73. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/16-b124e26129aa436b26fe.bundle.js +0 -0
  74. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/17-b124e26129aa436b26fe.bundle.js +0 -0
  75. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/18-b124e26129aa436b26fe.bundle.js +0 -0
  76. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/19-b124e26129aa436b26fe.bundle.js +0 -0
  77. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/20-b124e26129aa436b26fe.bundle.js +0 -0
  78. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/21-b124e26129aa436b26fe.bundle.js +0 -0
  79. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/22-b124e26129aa436b26fe.bundle.js +0 -0
  80. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/23-b124e26129aa436b26fe.bundle.js +0 -0
  81. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/24-b124e26129aa436b26fe.bundle.js +0 -0
  82. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/25-b124e26129aa436b26fe.bundle.js +0 -0
  83. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/26-b124e26129aa436b26fe.bundle.js +0 -0
  84. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/27-b124e26129aa436b26fe.bundle.js +0 -0
  85. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/28-b124e26129aa436b26fe.bundle.js +0 -0
  86. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/29-b124e26129aa436b26fe.bundle.js +0 -0
  87. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/30-b124e26129aa436b26fe.bundle.js +0 -0
  88. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/31-b124e26129aa436b26fe.bundle.js +0 -0
  89. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/32-b124e26129aa436b26fe.bundle.js +0 -0
  90. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/33-b124e26129aa436b26fe.bundle.js +0 -0
  91. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/34-b124e26129aa436b26fe.bundle.js +0 -0
  92. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/35-b124e26129aa436b26fe.bundle.js +0 -0
  93. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/36-b124e26129aa436b26fe.bundle.js +0 -0
  94. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/37-b124e26129aa436b26fe.bundle.js +0 -0
  95. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/38-b124e26129aa436b26fe.bundle.js +0 -0
  96. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/39-b124e26129aa436b26fe.bundle.js +0 -0
  97. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/40-b124e26129aa436b26fe.bundle.js +0 -0
  98. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/41-b124e26129aa436b26fe.bundle.js +0 -0
  99. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/42-b124e26129aa436b26fe.bundle.js +0 -0
  100. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/43-b124e26129aa436b26fe.bundle.js +0 -0
  101. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/44-b124e26129aa436b26fe.bundle.js +0 -0
  102. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/45-b124e26129aa436b26fe.bundle.js +0 -0
  103. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/46-b124e26129aa436b26fe.bundle.js +0 -0
  104. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/47-b124e26129aa436b26fe.bundle.js +0 -0
  105. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/48-b124e26129aa436b26fe.bundle.js +0 -0
  106. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/49-b124e26129aa436b26fe.bundle.js +0 -0
  107. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/50-b124e26129aa436b26fe.bundle.js +0 -0
  108. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/51-b124e26129aa436b26fe.bundle.js +0 -0
  109. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/52-b124e26129aa436b26fe.bundle.js +0 -0
  110. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/53-b124e26129aa436b26fe.bundle.js +0 -0
  111. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/54-b124e26129aa436b26fe.bundle.js +0 -0
  112. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/55-b124e26129aa436b26fe.bundle.js +0 -0
  113. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/56-b124e26129aa436b26fe.bundle.js +0 -0
  114. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/57-b124e26129aa436b26fe.bundle.js +0 -0
  115. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/58-b124e26129aa436b26fe.bundle.js +0 -0
  116. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/59-b124e26129aa436b26fe.bundle.js +0 -0
  117. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/6-b124e26129aa436b26fe.bundle.js +0 -0
  118. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/60-b124e26129aa436b26fe.bundle.js +0 -0
  119. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/61-b124e26129aa436b26fe.bundle.js +0 -0
  120. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/62-b124e26129aa436b26fe.bundle.js +0 -0
  121. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/63-b124e26129aa436b26fe.bundle.js +0 -0
  122. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/64-b124e26129aa436b26fe.bundle.js +0 -0
  123. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/65-b124e26129aa436b26fe.bundle.js +0 -0
  124. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/66-b124e26129aa436b26fe.bundle.js +0 -0
  125. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/67-b124e26129aa436b26fe.bundle.js +0 -0
  126. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/68-b124e26129aa436b26fe.bundle.js +0 -0
  127. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/69-b124e26129aa436b26fe.bundle.js +0 -0
  128. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/7-b124e26129aa436b26fe.bundle.js +0 -0
  129. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/70-b124e26129aa436b26fe.bundle.js +0 -0
  130. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/71-b124e26129aa436b26fe.bundle.js +0 -0
  131. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/72-b124e26129aa436b26fe.bundle.js +0 -0
  132. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/73-b124e26129aa436b26fe.bundle.js +0 -0
  133. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/74-b124e26129aa436b26fe.bundle.js +0 -0
  134. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/75-b124e26129aa436b26fe.bundle.js +0 -0
  135. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/8-b124e26129aa436b26fe.bundle.js +0 -0
  136. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/9-b124e26129aa436b26fe.bundle.js +0 -0
  137. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/app-b124e26129aa436b26fe.js +0 -0
  138. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/filter-a7c44e713bf19d31f6b2849160b1bba8.svg +0 -0
  139. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Bold.eot +0 -0
  140. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Bold.ttf +0 -0
  141. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Bold.woff +0 -0
  142. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Bold.woff2 +0 -0
  143. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Light.eot +0 -0
  144. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Light.ttf +0 -0
  145. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Light.woff +0 -0
  146. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Light.woff2 +0 -0
  147. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Medium.eot +0 -0
  148. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Medium.ttf +0 -0
  149. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Medium.woff +0 -0
  150. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Medium.woff2 +0 -0
  151. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Regular.eot +0 -0
  152. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Regular.ttf +0 -0
  153. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Regular.woff +0 -0
  154. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/FiraCode-Regular.woff2 +0 -0
  155. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/OpenSans-Bold.ttf +0 -0
  156. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/OpenSans-BoldItalic.ttf +0 -0
  157. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/OpenSans-ExtraBold.ttf +0 -0
  158. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
  159. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/OpenSans-Italic.ttf +0 -0
  160. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/OpenSans-Light.ttf +0 -0
  161. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/OpenSans-LightItalic.ttf +0 -0
  162. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/OpenSans-Regular.ttf +0 -0
  163. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/OpenSans-Semibold.ttf +0 -0
  164. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/OpenSans-SemiboldItalic.ttf +0 -0
  165. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/codicon.ttf +0 -0
  166. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/filter.svg +0 -0
  167. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/fontawesome-webfont.eot +0 -0
  168. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/fontawesome-webfont.svg +0 -0
  169. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/fontawesome-webfont.ttf +0 -0
  170. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/fontawesome-webfont.woff +0 -0
  171. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/fontawesome-webfont.woff2 +0 -0
  172. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/group-by.svg +0 -0
  173. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/neo4j-world.eot +0 -0
  174. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/neo4j-world.svg +0 -0
  175. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/neo4j-world.ttf +0 -0
  176. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/neo4j-world.woff +0 -0
  177. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/sort.svg +0 -0
  178. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/sort1.svg +0 -0
  179. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/sort2.svg +0 -0
  180. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/streamline.eot +0 -0
  181. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/streamline.svg +0 -0
  182. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/streamline.ttf +0 -0
  183. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/fonts/streamline.woff +0 -0
  184. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/group-by-89c6aaa756bc3548cc6ab3d2be4d2862.svg +0 -0
  185. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/Favorites.mp4 +0 -0
  186. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/Keystrokes.mp4 +0 -0
  187. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/ProjectFiles.mp4 +0 -0
  188. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/ReusableFrame.mp4 +0 -0
  189. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/SidebarDB_Iinfo.png +0 -0
  190. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/Stream.png +0 -0
  191. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/aura-logo-inverted.svg +0 -0
  192. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/aura-logo.svg +0 -0
  193. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/books.png +0 -0
  194. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/clusters.svg +0 -0
  195. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/community.jpg +0 -0
  196. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/android-icon-144x144.png +0 -0
  197. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/android-icon-192x192.png +0 -0
  198. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/android-icon-36x36.png +0 -0
  199. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/android-icon-48x48.png +0 -0
  200. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/android-icon-72x72.png +0 -0
  201. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/android-icon-96x96.png +0 -0
  202. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/apple-icon-114x114.png +0 -0
  203. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/apple-icon-120x120.png +0 -0
  204. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/apple-icon-144x144.png +0 -0
  205. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/apple-icon-152x152.png +0 -0
  206. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/apple-icon-180x180.png +0 -0
  207. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/apple-icon-57x57.png +0 -0
  208. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/apple-icon-60x60.png +0 -0
  209. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/apple-icon-72x72.png +0 -0
  210. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/apple-icon-76x76.png +0 -0
  211. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/apple-icon-precomposed.png +0 -0
  212. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/apple-icon.png +0 -0
  213. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/browserconfig.xml +0 -0
  214. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/favicon-16x16.png +0 -0
  215. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/favicon-32x32.png +0 -0
  216. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/favicon-96x96.png +0 -0
  217. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/favicon.ico +0 -0
  218. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/manifest.json +0 -0
  219. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/ms-icon-144x144.png +0 -0
  220. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/ms-icon-150x150.png +0 -0
  221. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/ms-icon-310x310.png +0 -0
  222. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/ms-icon-70x70.png +0 -0
  223. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/neo4j-browser-canary.svg +0 -0
  224. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/device-icons/neo4j-browser.svg +0 -0
  225. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/labeled_node.png +0 -0
  226. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/more_nodes.png +0 -0
  227. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/neo4j-favicon.ico +0 -0
  228. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/neo4j-logo-inverted.svg +0 -0
  229. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/neo4j-logo.svg +0 -0
  230. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/northwind/customer-orders.png +0 -0
  231. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/northwind/order-graph.png +0 -0
  232. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/northwind/product-category-supplier.png +0 -0
  233. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/northwind/product-graph.png +0 -0
  234. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/one_node.png +0 -0
  235. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/query-plan-operator-cost.svg +0 -0
  236. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/query-plan-operator-details.svg +0 -0
  237. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/query-plan-operator-rows.svg +0 -0
  238. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/query-plan.svg +0 -0
  239. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/rel-props.png +0 -0
  240. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/relationships.png +0 -0
  241. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/screen_code_frame.png +0 -0
  242. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/screen_cypher_warn.png +0 -0
  243. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/screen_editor.png +0 -0
  244. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/screen_sidebar.png +0 -0
  245. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/images/screen_stream.png +0 -0
  246. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/sort-8d6f482c21de572ceeb5ac93623e6c97.svg +0 -0
  247. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/sort1-d2dc515571213fc0ca99b0341b88e413.svg +0 -0
  248. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/assets/sort2-31050964e7eb2042325f7bcbba3d58ad.svg +0 -0
  249. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/bolt-worker-dfa551eb0861cc080843.js +0 -0
  250. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/cypher-editor-b124e26129aa436b26fe.bundle.js +0 -0
  251. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/editor-455af92e7e1dc39fdbc8060f6680ab32.worker.js +0 -0
  252. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/index.html +0 -0
  253. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/manifest.json +0 -0
  254. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/CoseBilkentLayout.worker-FEt6e_rV.js +0 -0
  255. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/HierarchicalLayout.worker-O6WHYssL.js +0 -0
  256. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/asciidoc.8O6YIVRy.js +0 -0
  257. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/auto-track.BlKugDvg.js +0 -0
  258. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/bash.CLAyaf9k.js +0 -0
  259. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/c.l4fEI10z.js +0 -0
  260. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/connect-icon-Br2hQy_e.svg +0 -0
  261. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/csharp.ChqrQYCS.js +0 -0
  262. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/css-extras.Bi-4v17d.js +0 -0
  263. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/css.B1LHiudN.js +0 -0
  264. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/cypher-editor-auto-completions.gif +0 -0
  265. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/cypher-editor-inline-help.png +0 -0
  266. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/cypher-editor-linting.png +0 -0
  267. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/cypher-editor-syntax-highlighting.png +0 -0
  268. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/cypher-reference.gif +0 -0
  269. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/cypher.C3qdyJ5B.js +0 -0
  270. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/docker.CF7EZT1T.js +0 -0
  271. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/fira-code-400-regular-normal-BzypJxJk.woff2 +0 -0
  272. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/fira-code-500-medium-normal-CRWzqcWa.woff2 +0 -0
  273. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/fira-code-700-bold-normal-hUmNV4O0.woff2 +0 -0
  274. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/go.FsJyBHVG.js +0 -0
  275. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/graphql.BlTzkzAJ.js +0 -0
  276. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/history-quick-search.gif +0 -0
  277. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/index-CY0cZcsW.js +0 -0
  278. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/index-H7L207gH.css +0 -0
  279. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/index.BpRu7Js3.js +0 -0
  280. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/index.C74acnU7.js +0 -0
  281. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/index.CHatcJcU.js +0 -0
  282. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/index.D6ZMQedT.js +0 -0
  283. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/index.DPZla5MT.js +0 -0
  284. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/index.dzIUqrzq.js +0 -0
  285. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/index.leyiHvaQ.js +0 -0
  286. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/index.qJ6VE118.js +0 -0
  287. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/index.umd.B9yhfa5Y.js +0 -0
  288. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/is-plan-event-enabled.DeNtQvA5.js +0 -0
  289. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/java.BBXwBh9f.js +0 -0
  290. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/java.CQ1iJ0-D.js +0 -0
  291. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/javadoc.UnquSOIj.js +0 -0
  292. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/javascript.CYTqTa0W.js +0 -0
  293. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/json.BIkJg-Cj.js +0 -0
  294. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/jsx.Cy_hP1z6.js +0 -0
  295. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/kotlin.D_6l0VkM.js +0 -0
  296. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/lintWorker-QNEp56W3.js +0 -0
  297. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/logo-aura-white-DCfUnkCN.svg +0 -0
  298. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/movie-model.png +0 -0
  299. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/movies-active-B2SzHIc1.svg +0 -0
  300. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/neo4j-logo-active-CieUxroh.svg +0 -0
  301. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/patterned-banner-background-C_nO-Yn8.svg +0 -0
  302. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/php.BKb6XVba.js +0 -0
  303. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/plan-graph-worker-s17nF19Q.js +0 -0
  304. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/public-sans-300-light-normal-CG9e8kLa.woff2 +0 -0
  305. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/public-sans-400-regular-italic-D9FlViiB.woff2 +0 -0
  306. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/public-sans-400-regular-normal-D4F9yfFi.woff2 +0 -0
  307. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/public-sans-500-medium-normal-ChZcBEnJ.woff2 +0 -0
  308. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/public-sans-600-semi-bold-normal-Ck6TyfRI.woff2 +0 -0
  309. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/public-sans-700-bold-normal-CGjRhW-d.woff2 +0 -0
  310. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/python.tCcUC3U7.js +0 -0
  311. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/query-fundamentals-active-jvTJU1K2.svg +0 -0
  312. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/query.snake-frame.DmvXOQIM.js +0 -0
  313. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/regex.C_VuIVtC.js +0 -0
  314. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/rust.CtSATZMt.js +0 -0
  315. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/saved-cypher.gif +0 -0
  316. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/scalable-graph-visualization.gif +0 -0
  317. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/sql.CfOAbw6n.js +0 -0
  318. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/syne-neo-500-medium-normal-A5GXmYUf.woff2 +0 -0
  319. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/table-visualization.gif +0 -0
  320. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/typescript.3Tbm37mD.js +0 -0
  321. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/xml-doc.h79Tu9Aw.js +0 -0
  322. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/assets/yaml.B-Jvd59g.js +0 -0
  323. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/favicons/android-chrome-192x192.png +0 -0
  324. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/favicons/apple-touch-icon.png +0 -0
  325. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/favicons/favicon-16x16.png +0 -0
  326. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/favicons/favicon-194x194.png +0 -0
  327. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/favicons/favicon-32x32.png +0 -0
  328. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/favicons/favicon.ico +0 -0
  329. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/favicons/safari-pinned-tab.svg +0 -0
  330. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/index.html +0 -0
  331. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/preview/manifest.json +0 -0
  332. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/ui-libs-b124e26129aa436b26fe.bundle.js +0 -0
  333. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/browser_static/vendor-b124e26129aa436b26fe.bundle.js +0 -0
  334. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/bulk_loader.py +0 -0
  335. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/capabilities.py +0 -0
  336. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/cypher/__init__.py +0 -0
  337. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/cypher/algorithms/__init__.py +0 -0
  338. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/cypher/algorithms/paths.py +0 -0
  339. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/cypher/ast.py +0 -0
  340. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/cypher/lexer.py +0 -0
  341. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/cypher/parser.py +0 -0
  342. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/cypher/translator.py +0 -0
  343. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/cypher_api.py +0 -0
  344. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/dbapi_utils.py +0 -0
  345. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/embedded.py +0 -0
  346. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/fusion.py +0 -0
  347. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/gql/__init__.py +0 -0
  348. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/gql/constants.py +0 -0
  349. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/gql/engine.py +0 -0
  350. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/gql/pooling.py +0 -0
  351. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/gql/resolvers.py +0 -0
  352. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/gql/schema.py +0 -0
  353. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/index_protocol.py +0 -0
  354. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/models.py +0 -0
  355. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/operators.py +0 -0
  356. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/py.typed +0 -0
  357. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/result.py +0 -0
  358. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/schema.py +0 -0
  359. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/security.py +0 -0
  360. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/status.py +0 -0
  361. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/text_search.py +0 -0
  362. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/utils.py +0 -0
  363. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/iris_vector_graph/vector_utils.py +0 -0
  364. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/sql/fhir_bridges.sql +0 -0
  365. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/sql/fraud_sample_data.sql +0 -0
  366. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/sql/globals_schema.sql +0 -0
  367. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/sql/graph_path_globals.sql +0 -0
  368. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/sql/graph_walk_tvf.sql +0 -0
  369. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/sql/migrations/000_base_schema_iris.sql +0 -0
  370. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/sql/migrations/001_add_nodepk_table.sql +0 -0
  371. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/sql/migrations/001_rollback_nodepk.sql +0 -0
  372. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/sql/migrations/002_add_fk_constraints.sql +0 -0
  373. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/sql/operators.sql +0 -0
  374. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/sql/operators_fixed.sql +0 -0
  375. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/sql/procedures/kg_PageRank.sql +0 -0
  376. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/sql/rdf_reifications.sql +0 -0
  377. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/sql/schema.sql +0 -0
  378. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/TESTING.md +0 -0
  379. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/benchmark_parser.py +0 -0
  380. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/benchmarks/README.md +0 -0
  381. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/benchmarks/bench.py +0 -0
  382. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/benchmarks/bench_utils.py +0 -0
  383. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/benchmarks/benchmark_neo4j.py +0 -0
  384. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/benchmarks/bfs_benchmark.py +0 -0
  385. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/benchmarks/establish_baseline.py +0 -0
  386. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/benchmarks/graph_gen.py +0 -0
  387. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/benchmarks/ic2_profile.py +0 -0
  388. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/benchmarks/iris_baseline_run.py +0 -0
  389. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/benchmarks/iris_os_run.py +0 -0
  390. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/benchmarks/ldbc_full_loader.py +0 -0
  391. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/benchmarks/load_neo4j.py +0 -0
  392. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/benchmarks/synthetic_baseline.csv +0 -0
  393. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/conftest.py +0 -0
  394. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/contract/__init__.py +0 -0
  395. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/contract/test_cypher_api.py +0 -0
  396. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/contract/test_cypher_api_errors.py +0 -0
  397. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/contract/test_graphql_queries.py +0 -0
  398. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/contract/test_graphql_schema.py +0 -0
  399. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/contract/test_ppr_api.py +0 -0
  400. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/curl_suite.sh +0 -0
  401. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/__init__.py +0 -0
  402. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/conftest.py +0 -0
  403. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_approx_count_distinct.py +0 -0
  404. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_arno_bfs_global.py +0 -0
  405. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_biomedical_demo.py +0 -0
  406. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_biomedical_ui.py +0 -0
  407. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_cypher_coerce_e2e.py +0 -0
  408. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_cypher_sprints_e2e.py +0 -0
  409. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_cypher_vector_search.py +0 -0
  410. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_cypher_vl_path_bfs.py +0 -0
  411. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_execution_contexts.py +0 -0
  412. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_execution_contexts_new.py +0 -0
  413. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_fhir_bridges_e2e.py +0 -0
  414. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_fraud_demo.py +0 -0
  415. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_fraud_ui.py +0 -0
  416. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_gql_autogen_startup.py +0 -0
  417. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_gql_cypher_passthrough.py +0 -0
  418. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_gql_node_queries.py +0 -0
  419. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_gql_semantic_search.py +0 -0
  420. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_gql_traversal.py +0 -0
  421. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_graph_kernels_e2e.py +0 -0
  422. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_hla_kg_e2e.py +0 -0
  423. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_ic13_shortest_path.py +0 -0
  424. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_index_protocol.py +0 -0
  425. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_introspection_api.py +0 -0
  426. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_ivf_insert.py +0 -0
  427. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_large_output_chunked.py +0 -0
  428. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_lazy_node_resolution.py +0 -0
  429. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_multi_query_engine_platform.py +0 -0
  430. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_named_paths_e2e.py +0 -0
  431. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_nkg_index_e2e.py +0 -0
  432. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_operator_wiring_e2e.py +0 -0
  433. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_pattern_comprehension_reduce.py +0 -0
  434. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_plaid.py +0 -0
  435. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_plaid_search_e2e.py +0 -0
  436. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_ppr_cls_fast_path.py +0 -0
  437. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_ppr_guided_e2e.py +0 -0
  438. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_procedure_installation.py +0 -0
  439. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_reification_e2e.py +0 -0
  440. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_schema_procedures_e2e.py +0 -0
  441. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_streaming_bfs.py +0 -0
  442. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_stress_api.py +0 -0
  443. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_stress_ingest.py +0 -0
  444. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_stress_multi_context.py +0 -0
  445. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_stress_search.py +0 -0
  446. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_stress_setup.py +0 -0
  447. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_stress_traversal.py +0 -0
  448. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_subgraph_e2e.py +0 -0
  449. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_subquery_call_e2e.py +0 -0
  450. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/e2e/test_vecindex_e2e.py +0 -0
  451. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/__init__.py +0 -0
  452. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/conftest.py +0 -0
  453. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/gql/__init__.py +0 -0
  454. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/gql/test_graphql_mutations.py +0 -0
  455. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/gql/test_graphql_nested_queries.py +0 -0
  456. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/gql/test_graphql_queries.py +0 -0
  457. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/gql/test_graphql_vector_search.py +0 -0
  458. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_bidirectional_ppr.py +0 -0
  459. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_cls_layer.py +0 -0
  460. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_cypher_advanced.py +0 -0
  461. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_cypher_enhancements.py +0 -0
  462. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_cypher_multi_type.py +0 -0
  463. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_cypher_rd.py +0 -0
  464. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_cypher_rel_vars.py +0 -0
  465. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_cypher_single_type.py +0 -0
  466. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_cypher_untyped.py +0 -0
  467. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_cypher_vector_search.py +0 -0
  468. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_embeddings_api.py +0 -0
  469. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_fastapi_graphql.py +0 -0
  470. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_fhir_bridges_integration.py +0 -0
  471. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_named_paths_integration.py +0 -0
  472. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_nodepk_advanced_benchmarks.py +0 -0
  473. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_nodepk_constraints.py +0 -0
  474. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_nodepk_graph_analytics.py +0 -0
  475. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_nodepk_migration.py +0 -0
  476. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_nodepk_performance.py +0 -0
  477. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_nodepk_production_scale.py +0 -0
  478. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_objectscript_classes.py +0 -0
  479. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_pagerank_sql_optimization.py +0 -0
  480. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_reification_integration.py +0 -0
  481. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_schema_migration.py +0 -0
  482. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_stored_procedure_install.py +0 -0
  483. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/integration/test_subquery_call_integration.py +0 -0
  484. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/performance/conftest.py +0 -0
  485. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/performance/scale_benchmark.py +0 -0
  486. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/performance/test_ppr_stress.py +0 -0
  487. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/performance/test_stress_v1_5.py +0 -0
  488. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/python/run_all_tests.py +0 -0
  489. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/python/test_iris_rest_api.py +0 -0
  490. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/python/test_networkx_loader.py +0 -0
  491. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/python/test_performance_benchmarks.py +0 -0
  492. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/python/test_pyops_vector_conversion.py +0 -0
  493. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/python/test_python_operators.py +0 -0
  494. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/python/test_python_sdk.py +0 -0
  495. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/python/test_schema_validation.py +0 -0
  496. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/python/test_sql_queries.py +0 -0
  497. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/python/test_vector_functions.py +0 -0
  498. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/cypher/__init__.py +0 -0
  499. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/cypher/test_lexer.py +0 -0
  500. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/cypher/test_lexer_advanced.py +0 -0
  501. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/cypher/test_parser.py +0 -0
  502. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/cypher/test_parser_advanced.py +0 -0
  503. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_batch_mutations.py +0 -0
  504. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_bfs_arno.py +0 -0
  505. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_bm25_index.py +0 -0
  506. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_bolt_server.py +0 -0
  507. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_cls_deployment.py +0 -0
  508. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_cypher_benchmark.py +0 -0
  509. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_cypher_benchmark_scale.py +0 -0
  510. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_cypher_case_when.py +0 -0
  511. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_cypher_e2e_new_features.py +0 -0
  512. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_cypher_functions.py +0 -0
  513. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_cypher_parser.py +0 -0
  514. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_cypher_posos_bugs.py +0 -0
  515. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_cypher_procedures.py +0 -0
  516. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_cypher_translator.py +0 -0
  517. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_cypher_union_exists.py +0 -0
  518. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_cypher_var_length.py +0 -0
  519. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_cypher_vector_search.py +0 -0
  520. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_edge_embeddings.py +0 -0
  521. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_edgeprop_ndjson.py +0 -0
  522. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_embed_nodes_params.py +0 -0
  523. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_embedded.py +0 -0
  524. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_engine_dimension_fix.py +0 -0
  525. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_engine_embeddings.py +0 -0
  526. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_engine_status.py +0 -0
  527. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_fhir_bridges.py +0 -0
  528. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_get_nodes.py +0 -0
  529. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_graph_kernels.py +0 -0
  530. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_graphql_dataloader.py +0 -0
  531. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_index_handle.py +0 -0
  532. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_index_protocol.py +0 -0
  533. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_ingest_formats.py +0 -0
  534. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_introspection_api.py +0 -0
  535. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_ivf_index.py +0 -0
  536. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_ivgresult.py +0 -0
  537. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_named_graphs.py +0 -0
  538. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_named_paths.py +0 -0
  539. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_operators_wiring.py +0 -0
  540. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_plaid_search.py +0 -0
  541. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_ppr_guided_subgraph.py +0 -0
  542. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_reification.py +0 -0
  543. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_schema_init.py +0 -0
  544. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_schema_procedures.py +0 -0
  545. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_shortest_path.py +0 -0
  546. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_snapshot.py +0 -0
  547. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_sql_splitter.py +0 -0
  548. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_sql_table_bridge.py +0 -0
  549. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_subgraph.py +0 -0
  550. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_subquery_call.py +0 -0
  551. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_temporal_cypher.py +0 -0
  552. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_temporal_edges.py +0 -0
  553. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_unified_edge_store.py +0 -0
  554. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_validation.py +0 -0
  555. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.0}/tests/unit/test_vector_search_routing.py +0 -0
  556. {iris_vector_graph-1.87.0 → iris_vector_graph-1.89.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.87.0
3
+ Version: 1.89.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
@@ -753,6 +753,45 @@ anchors = engine.get_kg_anchors(icd_codes=["J18.0", "E11.9"])
753
753
 
754
754
  ## Changelog
755
755
 
756
+ ### v1.88.0 (2026-05-07)
757
+ - **feat**: `ffi_kg_build_2hop_exact_int` Rust function — integer-indexed single-pass 2-hop dedup from `^KG("out")`. Writes results to `^ArnoKG("2h")` temp global; `DecodeBuildResults()` ObjectScript method converts to `^KG("deg2p_exact")`
758
+ - **feat**: `KHop2CountExact(src, pred)` ObjectScript method — O(1) `$Get(^KG("deg2p_exact"))`, fallback to `KHop2Count` when not populated. 0.14ms p50 on SF10 (was 70ms)
759
+ - **feat**: `Build2HopExactStats()` — Rust-first (tries `kg_build_2hop_exact_int`), ObjectScript fallback. Called automatically by `BuildNKG` and `engine.rebuild_nkg()`
760
+ - **feat**: `engine.khop2_count_exact(node_id, pred)` — public method with `KHop2Input` validation
761
+ - **feat**: `engine.backfill_deg2p_exact()` — populate `^KG("deg2p_exact")` for graphs loaded via `BulkIngestEdges`
762
+ - **feat**: `execute_cypher` `[:P*2] RETURN count(n)` fast path now routes to `KHop2CountExact` (exact, not upper bound)
763
+ - **test**: `tests/e2e/test_ic3_exact_count.py` — correctness + perf validation for 2-hop exact COUNT
764
+ - **test**: `tests/e2e/test_untested_methods.py` — 113/113 public engine methods now have at least one test (100% coverage)
765
+
766
+ ### v1.87.0 (2026-05-07)
767
+ - **feat**: `iris_vector_graph/_validate.py` — 10 Pydantic `BaseModel` input schemas for high-risk engine methods: `NodeIdInput`, `EdgeInput`, `CypherInput`, `IVFBuildInput`, `VectorSearchInput`, `BM25BuildInput`, `BM25SearchInput`, `KHop2Input`, `TemporalEdgeInput`, `VecSearchInput`
768
+ - **feat**: Input validation at call entry on `execute_cypher`, `create_node`, `create_edge`, `ivf_build`, `ivf_search`, `bm25_build`, `bm25_search`, `khop2_count_fast`, `create_edge_temporal`, `search_nodes_by_vector`
769
+ - All 10 schemas exported from `iris_vector_graph.__init__`; 44/44 unit tests in `test_validation.py`
770
+ - **chore**: `BulkIngestEdges` marked `[ Internal ]` in `EdgeScan.cls` — safe path is `engine.bulk_ingest_edges()`
771
+
772
+ ### v1.86.0 (2026-05-07)
773
+ - **feat**: `IVGResult` Pydantic `BaseModel` replaces `Dict[str, Any]` as return type of `execute_cypher`
774
+ - Backward-compatible: `result["columns"]`, `result.get("error")`, `"error" in result` all work
775
+ - `bool(result)` = `True` on success, `False` on error
776
+ - `result.columns`, `result.rows`, `result.error`, `result.metadata`, `result.sql` via dot notation
777
+ - 23 unit tests in `test_ivgresult.py`; all 189+ existing call sites pass unchanged
778
+ - **feat**: Fourth Pydantic increment — `IVGResult` joins `SQLQuery`, `QueryMetadata`, `IndexHandle`
779
+
780
+ ### v1.85.0 (2026-05-06)
781
+ - **fix**: Unbounded variable-length path queries (no LIMIT) now always route to `_bfs_stream_pages` (cursor-based `ReadBFSPage`) instead of `ReadBFSResults` (single JSON string that hits `<MAXSTRING>` at 93K+ results). Bounded queries (LIMIT present) keep `ReadBFSResults` fast path.
782
+ - **fix**: `test_sc003_results_match_bfs` — replaced raw `NKGAccel.BFSJson` call (bypassed engine, `^NKG` stale) with engine determinism check; `knows_data` fixture calls `engine.rebuild_nkg()` for sync guarantee
783
+ - **test**: `tests/e2e/test_streaming_bfs.py` — 3 e2e + 2 routing unit tests for streaming BFS
784
+
785
+ ### v1.84.0 (2026-05-06)
786
+ - **feat**: `engine.index(name)` → `IndexHandle` (Pydantic `BaseModel`) — unified entry point for all index types (`ivf`, `bm25`, `vec`, `plaid`) via `.search()`, `.insert()`, `.info()`, `.drop()`
787
+ - **feat**: `IVGIndex` `@runtime_checkable` Protocol — structural subtyping, no inheritance required
788
+ - **feat**: `_build_index_registry()` — auto-populates `{name: type}` from `^IVF`, `^VecIdx`, `^BM25Idx`, `^PLAID` on `IRISGraphEngine.__init__`; updated by `*_build` methods
789
+ - **feat**: `PLAIDSearch.Build` public ClassMethod — calls `StoreCentroids`+`StoreDocTokensBatch`+`BuildInvertedIndex` internally; helpers marked `[ Private ]`
790
+ - **feat**: `plaid_build()` now calls `PLAIDSearch.Build` (single round-trip); `plaid_info()` returns `{"type":"plaid","indexed":N,"nlist":L,"dim":D}`
791
+ - **feat**: All `*_info()` methods return `"type"` key — `ivf_info()`, `bm25_info()`, `vec_info()`, `plaid_info()`
792
+ - **feat**: `IVGIndex` and `IndexHandle` exported from `iris_vector_graph.__init__`
793
+ - **test**: Full PLAID e2e coverage (5/5); `engine.index()` dispatch tests (5 pass, 1 skip)
794
+
756
795
  ### v1.83.0 (2026-05-06)
757
796
  - **feat**: `KHop2Count` + `KHop2NeighborIds(maxResults)` on `Graph.KG.Traversal` — pure ObjectScript 2-hop traversal with process-private dedup, no JSON serialization
758
797
  - **feat**: `execute_cypher` routes `[:PRED*2]` COUNT and LIMIT patterns to fast paths — IC3 LIMIT 1000 now **1.2ms p50** (was 14-22ms; 3.5x faster than GES 4.19ms)
@@ -681,6 +681,45 @@ anchors = engine.get_kg_anchors(icd_codes=["J18.0", "E11.9"])
681
681
 
682
682
  ## Changelog
683
683
 
684
+ ### v1.88.0 (2026-05-07)
685
+ - **feat**: `ffi_kg_build_2hop_exact_int` Rust function — integer-indexed single-pass 2-hop dedup from `^KG("out")`. Writes results to `^ArnoKG("2h")` temp global; `DecodeBuildResults()` ObjectScript method converts to `^KG("deg2p_exact")`
686
+ - **feat**: `KHop2CountExact(src, pred)` ObjectScript method — O(1) `$Get(^KG("deg2p_exact"))`, fallback to `KHop2Count` when not populated. 0.14ms p50 on SF10 (was 70ms)
687
+ - **feat**: `Build2HopExactStats()` — Rust-first (tries `kg_build_2hop_exact_int`), ObjectScript fallback. Called automatically by `BuildNKG` and `engine.rebuild_nkg()`
688
+ - **feat**: `engine.khop2_count_exact(node_id, pred)` — public method with `KHop2Input` validation
689
+ - **feat**: `engine.backfill_deg2p_exact()` — populate `^KG("deg2p_exact")` for graphs loaded via `BulkIngestEdges`
690
+ - **feat**: `execute_cypher` `[:P*2] RETURN count(n)` fast path now routes to `KHop2CountExact` (exact, not upper bound)
691
+ - **test**: `tests/e2e/test_ic3_exact_count.py` — correctness + perf validation for 2-hop exact COUNT
692
+ - **test**: `tests/e2e/test_untested_methods.py` — 113/113 public engine methods now have at least one test (100% coverage)
693
+
694
+ ### v1.87.0 (2026-05-07)
695
+ - **feat**: `iris_vector_graph/_validate.py` — 10 Pydantic `BaseModel` input schemas for high-risk engine methods: `NodeIdInput`, `EdgeInput`, `CypherInput`, `IVFBuildInput`, `VectorSearchInput`, `BM25BuildInput`, `BM25SearchInput`, `KHop2Input`, `TemporalEdgeInput`, `VecSearchInput`
696
+ - **feat**: Input validation at call entry on `execute_cypher`, `create_node`, `create_edge`, `ivf_build`, `ivf_search`, `bm25_build`, `bm25_search`, `khop2_count_fast`, `create_edge_temporal`, `search_nodes_by_vector`
697
+ - All 10 schemas exported from `iris_vector_graph.__init__`; 44/44 unit tests in `test_validation.py`
698
+ - **chore**: `BulkIngestEdges` marked `[ Internal ]` in `EdgeScan.cls` — safe path is `engine.bulk_ingest_edges()`
699
+
700
+ ### v1.86.0 (2026-05-07)
701
+ - **feat**: `IVGResult` Pydantic `BaseModel` replaces `Dict[str, Any]` as return type of `execute_cypher`
702
+ - Backward-compatible: `result["columns"]`, `result.get("error")`, `"error" in result` all work
703
+ - `bool(result)` = `True` on success, `False` on error
704
+ - `result.columns`, `result.rows`, `result.error`, `result.metadata`, `result.sql` via dot notation
705
+ - 23 unit tests in `test_ivgresult.py`; all 189+ existing call sites pass unchanged
706
+ - **feat**: Fourth Pydantic increment — `IVGResult` joins `SQLQuery`, `QueryMetadata`, `IndexHandle`
707
+
708
+ ### v1.85.0 (2026-05-06)
709
+ - **fix**: Unbounded variable-length path queries (no LIMIT) now always route to `_bfs_stream_pages` (cursor-based `ReadBFSPage`) instead of `ReadBFSResults` (single JSON string that hits `<MAXSTRING>` at 93K+ results). Bounded queries (LIMIT present) keep `ReadBFSResults` fast path.
710
+ - **fix**: `test_sc003_results_match_bfs` — replaced raw `NKGAccel.BFSJson` call (bypassed engine, `^NKG` stale) with engine determinism check; `knows_data` fixture calls `engine.rebuild_nkg()` for sync guarantee
711
+ - **test**: `tests/e2e/test_streaming_bfs.py` — 3 e2e + 2 routing unit tests for streaming BFS
712
+
713
+ ### v1.84.0 (2026-05-06)
714
+ - **feat**: `engine.index(name)` → `IndexHandle` (Pydantic `BaseModel`) — unified entry point for all index types (`ivf`, `bm25`, `vec`, `plaid`) via `.search()`, `.insert()`, `.info()`, `.drop()`
715
+ - **feat**: `IVGIndex` `@runtime_checkable` Protocol — structural subtyping, no inheritance required
716
+ - **feat**: `_build_index_registry()` — auto-populates `{name: type}` from `^IVF`, `^VecIdx`, `^BM25Idx`, `^PLAID` on `IRISGraphEngine.__init__`; updated by `*_build` methods
717
+ - **feat**: `PLAIDSearch.Build` public ClassMethod — calls `StoreCentroids`+`StoreDocTokensBatch`+`BuildInvertedIndex` internally; helpers marked `[ Private ]`
718
+ - **feat**: `plaid_build()` now calls `PLAIDSearch.Build` (single round-trip); `plaid_info()` returns `{"type":"plaid","indexed":N,"nlist":L,"dim":D}`
719
+ - **feat**: All `*_info()` methods return `"type"` key — `ivf_info()`, `bm25_info()`, `vec_info()`, `plaid_info()`
720
+ - **feat**: `IVGIndex` and `IndexHandle` exported from `iris_vector_graph.__init__`
721
+ - **test**: Full PLAID e2e coverage (5/5); `engine.index()` dispatch tests (5 pass, 1 skip)
722
+
684
723
  ### v1.83.0 (2026-05-06)
685
724
  - **feat**: `KHop2Count` + `KHop2NeighborIds(maxResults)` on `Graph.KG.Traversal` — pure ObjectScript 2-hop traversal with process-private dedup, no JSON serialization
686
725
  - **feat**: `execute_cypher` routes `[:PRED*2]` COUNT and LIMIT patterns to fast paths — IC3 LIMIT 1000 now **1.2ms p50** (was 14-22ms; 3.5x faster than GES 4.19ms)
@@ -86,7 +86,7 @@ ClassMethod DeleteAdjacency(s As %String, p As %String, o As %String)
86
86
  /// edges_json: JSON array of [s, p, o] triples or {"s":..,"p":..,"o":..} objects.
87
87
  /// predicate: default predicate if using [s, o] pair format.
88
88
  /// Returns count of edges written.
89
- ClassMethod BulkIngestEdges(edgesJson As %String, predicate As %String = "R") As %Integer [ Language = python ]
89
+ ClassMethod BulkIngestEdges(edgesJson As %String, predicate As %String = "R") As %Integer [ Internal, Language = python ]
90
90
  {
91
91
  import iris, json, warnings
92
92
  data = json.loads(edgesJson)
@@ -559,7 +559,7 @@ ClassMethod BFSJson(seed As %String, predicatesJson As %String = "[]", maxHops A
559
559
  If '$Data(^||NKGAccel("compute_fn")) {
560
560
  Set dllid = $ZF(-4, 1, dllPath)
561
561
  If dllid = 0 {
562
- Return ##class(Graph.KG.Traversal).BFSFastJson(seed, predicatesJson, maxHops, "")
562
+ Return ##class(Graph.KG.Traversal).BFSFastJsonSorted(seed, predicatesJson, maxHops, "", "out", maxResults)
563
563
  }
564
564
  Set ^||NKGAccel("dllid") = dllid
565
565
  Set ^||NKGAccel("compute_fn") = $ZF(-4, 3, dllid, "kg_bfs_compute")
@@ -569,11 +569,11 @@ ClassMethod BFSJson(seed As %String, predicatesJson As %String = "[]", maxHops A
569
569
  Set dllid = ^||NKGAccel("dllid")
570
570
  Set computeFn = ^||NKGAccel("compute_fn")
571
571
  If computeFn = 0 {
572
- Return ##class(Graph.KG.Traversal).BFSFastJson(seed, predicatesJson, maxHops, "")
572
+ Return ##class(Graph.KG.Traversal).BFSFastJsonSorted(seed, predicatesJson, maxHops, "", "out", maxResults)
573
573
  }
574
574
  Do ..CacheNKGAdj()
575
575
  If '$Data(^ArnoKG("KG", "nkg_adj")) {
576
- Return ##class(Graph.KG.Traversal).BFSFastJson(seed, predicatesJson, maxHops, "")
576
+ Return ##class(Graph.KG.Traversal).BFSFastJsonSorted(seed, predicatesJson, maxHops, "", "out", maxResults)
577
577
  }
578
578
  Kill ^ArnoKG("bfs_result")
579
579
  Set raw = $ZF(-5, dllid, computeFn, "^ArnoKG", "^ArnoKG", seed, predicatesJson, maxHops, maxResults)
@@ -583,15 +583,27 @@ ClassMethod BFSJson(seed As %String, predicatesJson As %String = "[]", maxHops A
583
583
  Set n = +$Piece(raw, ":", 3)
584
584
  Set readFn = ^||NKGAccel("read_fn")
585
585
  If readFn = 0 {
586
- Return ##class(Graph.KG.Traversal).BFSFastJson(seed, predicatesJson, maxHops, "")
586
+ Return ##class(Graph.KG.Traversal).BFSFastJsonSorted(seed, predicatesJson, maxHops, "", "out", maxResults)
587
587
  }
588
- Set result = ""
588
+ Set assembled = ""
589
589
  For i = 1:1:n {
590
- Set chunk = $ZF(-5, dllid, readFn, "^ArnoKG", i)
591
- Set result = result _ chunk
590
+ Set assembled = assembled _ $ZF(-5, dllid, readFn, "^ArnoKG", i)
592
591
  }
593
592
  Kill ^ArnoKG("bfs_result")
594
- Return result
593
+ Set tag = $Job _ "_bfs"
594
+ Kill ^ArnoKG("bfs_r", tag)
595
+ Set arr = ##class(%DynamicArray).%FromJSON(assembled)
596
+ Set sz = arr.%Size()
597
+ For i = 0:1:(sz-1) {
598
+ Set item = arr.%Get(i)
599
+ Set step = +item.%Get("step")
600
+ Set o = item.%Get("o")
601
+ Set s = item.%Get("s")
602
+ Set p = item.%Get("p")
603
+ Set w = +item.%Get("w")
604
+ Set ^ArnoKG("bfs_r", tag, step, o) = $ListBuild(s, p, w)
605
+ }
606
+ Return "SORTED:" _ tag
595
607
  }
596
608
 
597
609
  ClassMethod InvalidateAdjCache()
@@ -1035,4 +1047,41 @@ ClassMethod CountDistinctKHop(srcId As %String, predsJson As %String = "", maxHo
1035
1047
  Return "{""estimate"":"_estimate_",""registers"":256,""std_error"":0.065}"
1036
1048
  }
1037
1049
 
1050
+ ClassMethod Build2HopExact() As %Boolean
1051
+ {
1052
+ If '..IsLoaded() {
1053
+ Do ..Load("/tmp/libarno_callout.so")
1054
+ If '..IsLoaded() {
1055
+ If ##class(Graph.KG.ArnoAccel).IsAvailable() {
1056
+ Set ^||NKGAccel("dllid") = $Get(^||ArnoAccel("dllid"), 0)
1057
+ }
1058
+ }
1059
+ }
1060
+ If '..IsLoaded() Return 0
1061
+ Set dllid = $Get(^||NKGAccel("dllid"), 0)
1062
+ If dllid = 0 Return 0
1063
+ Set fid = $ZF(-4, 3, dllid, "kg_build_2hop_exact_stream")
1064
+ If fid = 0 Return 0
1065
+ Kill ^ArnoKG("2hs")
1066
+ Set raw = $ZF(-5, dllid, fid)
1067
+ If $Extract(raw, 1, 8) '= "CHUNKED:" Return 0
1068
+ Set n = +$Piece(raw, ":", 3)
1069
+ Set data = ""
1070
+ For i = 1:1:n {
1071
+ Set data = data _ $Get(^ArnoKG("2hs", i), "")
1072
+ }
1073
+ Kill ^ArnoKG("2hs")
1074
+ For pos = 1:1:$Length(data, $Char(10)) {
1075
+ Set line = $Piece(data, $Char(10), pos)
1076
+ If line = "" Continue
1077
+ Set s = $Piece(line, $Char(31), 1)
1078
+ Set p = $Piece(line, $Char(31), 2)
1079
+ Set cnt = +$Piece(line, $Char(31), 3)
1080
+ If (s '= "") && (p '= "") && (cnt > 0) {
1081
+ Set ^KG("deg2p_exact", s, p) = cnt
1082
+ }
1083
+ }
1084
+ Return 1
1085
+ }
1086
+
1038
1087
  }
@@ -111,6 +111,7 @@ ClassMethod BuildNKG() As %Status
111
111
  Set tmp = $Increment(^NKG("$meta", "version"))
112
112
 
113
113
  Do ..Build2HopStats()
114
+ Do ..Build2HopExactStats()
114
115
 
115
116
  Return $$$OK
116
117
  }
@@ -1166,4 +1167,68 @@ ClassMethod KHop2CountFast(srcId As %String, pred As %String = "") As %Integer
1166
1167
  Return ..KHop2Count(srcId, pred)
1167
1168
  }
1168
1169
 
1170
+ ClassMethod KHop2CountExact(srcId As %String, pred As %String = "") As %Integer
1171
+ {
1172
+ If pred '= "" {
1173
+ Set cnt = $Get(^KG("deg2p_exact", srcId, pred), -1)
1174
+ If cnt >= 0 Return +cnt
1175
+ }
1176
+ Return ..KHop2Count(srcId, pred)
1177
+ }
1178
+
1179
+ ClassMethod Build2HopExactStats() As %Integer
1180
+ {
1181
+ Kill ^KG("deg2p_exact")
1182
+ If ##class(Graph.KG.NKGAccel).Build2HopExact() {
1183
+ Set n = ""
1184
+ Set cnt = 0
1185
+ For {
1186
+ Set n = $Order(^KG("deg2p_exact", n))
1187
+ Quit:n=""
1188
+ Set cnt = cnt + 1
1189
+ }
1190
+ Return cnt
1191
+ }
1192
+ Set src = ""
1193
+ Set cnt = 0
1194
+ For {
1195
+ Set src = $Order(^KG("out", 0, src))
1196
+ Quit:src=""
1197
+ Set pred = ""
1198
+ For {
1199
+ Set pred = $Order(^KG("out", 0, src, pred))
1200
+ Quit:pred=""
1201
+ Kill ^||h2s
1202
+ Set ^||h2s(src) = ""
1203
+ Set mid = ""
1204
+ For {
1205
+ Set mid = $Order(^KG("out", 0, src, pred, mid))
1206
+ Quit:mid=""
1207
+ Set ^||h2s(mid) = ""
1208
+ }
1209
+ Set exact = 0
1210
+ Set mid = ""
1211
+ For {
1212
+ Set mid = $Order(^KG("out", 0, src, pred, mid))
1213
+ Quit:mid=""
1214
+ Set o2 = ""
1215
+ For {
1216
+ Set o2 = $Order(^KG("out", 0, mid, pred, o2))
1217
+ Quit:o2=""
1218
+ If '$Data(^||h2s(o2)) {
1219
+ Set ^||h2s(o2) = ""
1220
+ Set exact = exact + 1
1221
+ }
1222
+ }
1223
+ }
1224
+ Kill ^||h2s
1225
+ If exact > 0 {
1226
+ Set ^KG("deg2p_exact", src, pred) = exact
1227
+ Set cnt = cnt + 1
1228
+ }
1229
+ }
1230
+ }
1231
+ Return cnt
1232
+ }
1233
+
1169
1234
  }
@@ -1536,12 +1536,26 @@ class IRISGraphEngine:
1536
1536
  max_hops,
1537
1537
  max_results,
1538
1538
  )
1539
- bfs_results = _json.loads(str(bfs_json)) if bfs_json else []
1539
+ bfs_str = str(bfs_json) if bfs_json else ""
1540
+ if bfs_str.startswith("SORTED:") and bfs_str != "SORTED:0":
1541
+ tag = bfs_str.split(":")[1]
1542
+ if max_results == 0:
1543
+ bfs_results = list(_bfs_stream_pages(self.conn, tag))
1544
+ else:
1545
+ try:
1546
+ results_str = str(_call_classmethod(
1547
+ self.conn, "Graph.KG.Traversal", "ReadBFSResults", tag
1548
+ ))
1549
+ bfs_results = _json.loads(results_str)
1550
+ except Exception:
1551
+ bfs_results = list(_bfs_stream_pages(self.conn, tag))
1552
+ elif bfs_str:
1553
+ bfs_results = _json.loads(bfs_str)
1554
+ else:
1555
+ bfs_results = []
1540
1556
  logger.debug("Arno BFSJson: %d results for %s", len(bfs_results), source_id)
1541
- if not bfs_results and not self._arno_capabilities.get("rust_callout"):
1542
- bfs_results = None
1543
1557
  except Exception as e:
1544
- logger.warning(f"Arno BFSJson failed, falling back to BFSFastJson: {e}")
1558
+ logger.warning(f"Arno BFSJson failed, falling back to BFSFastJsonSorted: {e}")
1545
1559
  bfs_results = None
1546
1560
 
1547
1561
  if bfs_results is None:
@@ -1566,21 +1580,8 @@ class IRISGraphEngine:
1566
1580
  else:
1567
1581
  bfs_results = []
1568
1582
  except Exception as e:
1569
- logger.warning(f"BFSFastJsonSorted failed ({e}), falling back to chunked")
1570
- try:
1571
- resp = str(_call_classmethod(
1572
- self.conn, "Graph.KG.Traversal", "BFSFastJsonChunked",
1573
- source_id, predicates_json, max_hops, "", direction, max_results,
1574
- ))
1575
- if resp.startswith("CHUNKED:") and resp != "CHUNKED:0":
1576
- tag, n_chunks = resp.split(":")[1], int(resp.split(":")[2])
1577
- parts = [str(_call_classmethod(self.conn, "Graph.KG.Traversal", "ReadBFSChunk", tag, str(i))) for i in range(1, n_chunks + 1)]
1578
- bfs_results = _json.loads("[" + "".join(parts) + "]")
1579
- else:
1580
- bfs_results = []
1581
- except Exception as e2:
1582
- logger.warning(f"BFSFastJsonChunked also failed: {e2}")
1583
- return IVGResult(columns=[], rows=[], sql="", params=[], metadata=sql_query.query_metadata)
1583
+ logger.warning(f"BFSFastJsonSorted failed: {e}")
1584
+ return IVGResult(columns=[], rows=[], sql="", params=[], metadata=sql_query.query_metadata)
1584
1585
 
1585
1586
 
1586
1587
  if min_hops > 1:
@@ -1743,7 +1744,7 @@ class IRISGraphEngine:
1743
1744
  return None
1744
1745
  try:
1745
1746
  cnt = int(self._iris_obj().classMethodValue(
1746
- "Graph.KG.Traversal", "KHop2Count", str(src_id), pred
1747
+ "Graph.KG.Traversal", "KHop2CountExact", str(src_id), pred
1747
1748
  ))
1748
1749
  return IVGResult(columns=[col], rows=[(cnt,)])
1749
1750
  except Exception:
@@ -3126,6 +3127,7 @@ class IRISGraphEngine:
3126
3127
  else:
3127
3128
  iris_obj.classMethodVoid("Graph.KG.Traversal", "BuildNKG")
3128
3129
  iris_obj.classMethodValue("Graph.KG.Traversal", "Build2HopStats")
3130
+ iris_obj.classMethodValue("Graph.KG.Traversal", "Build2HopExactStats")
3129
3131
  self._nkg_dirty = False
3130
3132
  return True
3131
3133
  except Exception as e:
@@ -3140,6 +3142,14 @@ class IRISGraphEngine:
3140
3142
  logger.warning("backfill_degp failed: %s", e)
3141
3143
  return 0
3142
3144
 
3145
+ def backfill_deg2p_exact(self) -> int:
3146
+ try:
3147
+ result = self._iris_obj().classMethodValue("Graph.KG.Traversal", "Build2HopExactStats")
3148
+ return int(result)
3149
+ except Exception as e:
3150
+ logger.warning("backfill_deg2p_exact failed: %s", e)
3151
+ return 0
3152
+
3143
3153
  def khop2_count_fast(self, node_id: str, predicate: str = "") -> int:
3144
3154
  KHop2Input(node_id=node_id)
3145
3155
  result = self._iris_obj().classMethodValue(
@@ -3147,6 +3157,13 @@ class IRISGraphEngine:
3147
3157
  )
3148
3158
  return int(result)
3149
3159
 
3160
+ def khop2_count_exact(self, node_id: str, predicate: str = "") -> int:
3161
+ KHop2Input(node_id=node_id)
3162
+ result = self._iris_obj().classMethodValue(
3163
+ "Graph.KG.Traversal", "KHop2CountExact", node_id, predicate
3164
+ )
3165
+ return int(result)
3166
+
3150
3167
  def bulk_ingest_edges(
3151
3168
  self,
3152
3169
  edges: List[Dict[str, Any]],
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "iris-vector-graph"
7
- version = "1.87.0"
7
+ version = "1.89.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"
@@ -0,0 +1,137 @@
1
+ import os
2
+ import time
3
+ import statistics
4
+ import pytest
5
+
6
+ IRIS_HOST = os.environ.get("IRIS_HOST", "localhost")
7
+ IRIS_ENT_PORT = int(os.environ.get("IRIS_ENT_PORT", "4972"))
8
+ IRIS_COM_PORT = int(os.environ.get("IRIS_COM_PORT", "1972"))
9
+ SKIP = os.environ.get("SKIP_IRIS_TESTS", "false").lower() == "true"
10
+ PRED = "KNOWS"
11
+
12
+
13
+ @pytest.fixture(scope="module")
14
+ def community_engine():
15
+ try:
16
+ import iris
17
+ from iris_vector_graph.engine import IRISGraphEngine
18
+ conn = iris.connect(IRIS_HOST, IRIS_COM_PORT, "USER", "_SYSTEM", "SYS")
19
+ yield IRISGraphEngine(conn), iris.createIRIS(conn)
20
+ conn.close()
21
+ except Exception as e:
22
+ pytest.skip(f"Community IRIS unavailable: {e}")
23
+
24
+
25
+ @pytest.fixture(scope="module")
26
+ def enterprise_engine():
27
+ try:
28
+ import iris
29
+ from iris_vector_graph.engine import IRISGraphEngine
30
+ conn = iris.connect(IRIS_HOST, IRIS_ENT_PORT, "USER", "_SYSTEM", "SYS")
31
+ o = iris.createIRIS(conn)
32
+ o.classMethodValue("Graph.KG.ArnoAccel", "Load")
33
+ eng = IRISGraphEngine(conn)
34
+ eng._detect_arno()
35
+ if not eng._arno_capabilities.get("rust_callout") or \
36
+ "bfs" not in eng._arno_capabilities.get("rust_algorithms", []):
37
+ pytest.skip("Arno Rust BFS not available on enterprise container")
38
+ cur = conn.cursor()
39
+ cur.execute("SELECT TOP 1 s FROM Graph_KG.rdf_edges WHERE p = ?", [PRED])
40
+ row = cur.fetchone()
41
+ if not row:
42
+ pytest.skip("No KNOWS edges in enterprise — LDBC data not loaded")
43
+ yield eng, o, str(row[0])
44
+ conn.close()
45
+ except Exception as e:
46
+ pytest.skip(f"Enterprise IRIS unavailable or Rust BFS inactive: {e}")
47
+
48
+
49
+ @pytest.fixture(scope="module")
50
+ def bfs_test_graph(community_engine):
51
+ eng, o = community_engine
52
+ cur = eng.conn.cursor()
53
+ nodes = ["bfs_hub", "bfs_a", "bfs_b", "bfs_c"]
54
+ for n in nodes:
55
+ cur.execute("SELECT COUNT(*) FROM Graph_KG.nodes WHERE node_id=?", [n])
56
+ if cur.fetchone()[0] == 0:
57
+ cur.execute("INSERT INTO Graph_KG.nodes (node_id) VALUES (?)", [n])
58
+ eng.conn.commit()
59
+ from iris_vector_graph.schema import _call_classmethod
60
+ for s, t in [("bfs_hub", "bfs_a"), ("bfs_hub", "bfs_b"), ("bfs_a", "bfs_c")]:
61
+ cur.execute("SELECT COUNT(*) FROM Graph_KG.rdf_edges WHERE s=? AND p=? AND o_id=?", [s, "BFS_R", t])
62
+ if cur.fetchone()[0] == 0:
63
+ cur.execute("INSERT INTO Graph_KG.rdf_edges (s,p,o_id) VALUES (?,?,?)", [s, "BFS_R", t])
64
+ eng.conn.commit()
65
+ _call_classmethod(eng.conn, "Graph.KG.Traversal", "BuildKG")
66
+ yield
67
+ for n in nodes:
68
+ cur.execute("DELETE FROM Graph_KG.rdf_edges WHERE s=? OR o_id=?", [n, n])
69
+ cur.execute("DELETE FROM Graph_KG.nodes WHERE node_id=?", [n])
70
+ eng.conn.commit()
71
+
72
+
73
+ @pytest.mark.skipif(SKIP, reason="SKIP_IRIS_TESTS=true")
74
+ @pytest.mark.e2e
75
+ def test_nkgaccel_bfs_json_output_format_is_sorted(enterprise_engine):
76
+ eng, o, seed = enterprise_engine
77
+ result = str(o.classMethodString("Graph.KG.NKGAccel", "BFSJson", seed, '["KNOWS"]', 2, 100))
78
+ assert result.startswith("SORTED:"), \
79
+ f"NKGAccel.BFSJson must return 'SORTED:tag' after spec 153, got: {result[:40]}"
80
+
81
+
82
+ @pytest.mark.skipif(SKIP, reason="SKIP_IRIS_TESTS=true")
83
+ @pytest.mark.e2e
84
+ def test_rust_bfs_result_matches_objectscript(enterprise_engine):
85
+ eng, o, seed = enterprise_engine
86
+ from iris_vector_graph.schema import _call_classmethod_large
87
+ import json
88
+
89
+ rust_raw = str(o.classMethodString("Graph.KG.NKGAccel", "BFSJson", seed, '["KNOWS"]', 2, 0))
90
+ if rust_raw.startswith("SORTED:"):
91
+ tag = rust_raw.split(":")[1]
92
+ rust_results = json.loads(str(o.classMethodString("Graph.KG.Traversal", "ReadBFSResults", tag)))
93
+ else:
94
+ rust_results = json.loads(rust_raw)
95
+
96
+ obj_results = json.loads(_call_classmethod_large(o, "Graph.KG.Traversal", "BFSFastJson", seed, "KNOWS", 2))
97
+ assert len(rust_results) > 0
98
+ assert abs(len(rust_results) - len(obj_results)) <= 1, \
99
+ f"Rust ({len(rust_results)}) and ObjectScript ({len(obj_results)}) BFS counts differ by >1"
100
+
101
+
102
+ @pytest.mark.skipif(SKIP, reason="SKIP_IRIS_TESTS=true")
103
+ @pytest.mark.e2e
104
+ def test_engine_execute_cypher_bfs_via_rust(enterprise_engine):
105
+ eng, o, seed = enterprise_engine
106
+ result = eng.execute_cypher(
107
+ "MATCH (s {node_id:$id})-[:KNOWS*1..2]->(n) RETURN n.node_id LIMIT 100",
108
+ {"id": seed}
109
+ )
110
+ assert result, "execute_cypher must succeed"
111
+ assert len(result.rows) > 0, "Must return results"
112
+ assert len(result.rows) <= 100
113
+
114
+
115
+ @pytest.mark.skipif(SKIP, reason="SKIP_IRIS_TESTS=true")
116
+ @pytest.mark.e2e
117
+ def test_engine_chunked_branch_removed():
118
+ import iris_vector_graph.engine as eng_mod
119
+ import inspect
120
+ src = inspect.getsource(eng_mod.IRISGraphEngine._execute_var_length_cypher)
121
+ assert "BFSFastJsonChunked" not in src, \
122
+ "Legacy BFSFastJsonChunked branch must be removed from _execute_var_length_cypher"
123
+
124
+
125
+ @pytest.mark.skipif(SKIP, reason="SKIP_IRIS_TESTS=true")
126
+ @pytest.mark.e2e
127
+ def test_objectscript_bfs_still_works_after_change(community_engine, bfs_test_graph):
128
+ eng, o = community_engine
129
+ result = eng.execute_cypher(
130
+ "MATCH (s {node_id:$id})-[:BFS_R*1..2]->(n) RETURN n.node_id",
131
+ {"id": "bfs_hub"}
132
+ )
133
+ assert result
134
+ ids = {r[0] for r in result.rows}
135
+ assert "bfs_a" in ids
136
+ assert "bfs_b" in ids
137
+ assert "bfs_c" in ids
@@ -0,0 +1,108 @@
1
+ import os
2
+ import statistics
3
+ import time
4
+
5
+ import pytest
6
+
7
+ ENTERPRISE_CONTAINER = "iris-enterprise-2026"
8
+ SEEDS = ["p_28587302384882", "p_10995116278184", "p_10995116279040"]
9
+ PRED = "KNOWS"
10
+
11
+
12
+ @pytest.fixture(scope="module")
13
+ def enterprise_engine():
14
+ try:
15
+ import iris
16
+ from iris_vector_graph.engine import IRISGraphEngine
17
+
18
+ conn = iris.connect("localhost", 4972, "USER", "_SYSTEM", "SYS")
19
+ o = iris.createIRIS(conn)
20
+ o.classMethodValue("Graph.KG.ArnoAccel", "Load")
21
+ cur = conn.cursor()
22
+ cur.execute("SELECT COUNT(*) FROM Graph_KG.nodes WHERE node_id LIKE 'p_%'")
23
+ if cur.fetchone()[0] < 1000:
24
+ pytest.skip("LDBC SF10 data not loaded on enterprise container")
25
+ eng = IRISGraphEngine(conn)
26
+ yield eng, o
27
+ conn.close()
28
+ except Exception as e:
29
+ pytest.skip(f"Enterprise IRIS unavailable: {e}")
30
+
31
+
32
+ @pytest.fixture(scope="module")
33
+ def with_exact_stats(enterprise_engine):
34
+ eng, o = enterprise_engine
35
+ o.classMethodValue("Graph.KG.Traversal", "Build2HopExactStats")
36
+ yield eng, o
37
+
38
+
39
+ @pytest.mark.e2e
40
+ def test_khop2_count_exact_matches_khop2_count(with_exact_stats):
41
+ eng, o = with_exact_stats
42
+ from iris_vector_graph.schema import _call_classmethod_large
43
+ for seed in SEEDS:
44
+ exact = int(o.classMethodValue("Graph.KG.Traversal", "KHop2CountExact", seed, PRED))
45
+ slow = int(_call_classmethod_large(o, "Graph.KG.Traversal", "KHop2Count", seed, PRED))
46
+ assert exact == slow, f"KHop2CountExact({seed}) = {exact} != KHop2Count = {slow}"
47
+
48
+
49
+ @pytest.mark.e2e
50
+ def test_khop2_count_exact_under_1ms(with_exact_stats):
51
+ eng, o = with_exact_stats
52
+ seed = SEEDS[0]
53
+ times = []
54
+ for _ in range(10):
55
+ o.classMethodValue("Graph.KG.Traversal", "KHop2CountExact", seed, PRED)
56
+ for _ in range(30):
57
+ t0 = time.perf_counter()
58
+ o.classMethodValue("Graph.KG.Traversal", "KHop2CountExact", seed, PRED)
59
+ times.append((time.perf_counter() - t0) * 1000)
60
+ p50 = statistics.median(times)
61
+ assert p50 < 1.0, f"KHop2CountExact p50={p50:.3f}ms exceeds 1ms target"
62
+
63
+
64
+ @pytest.mark.e2e
65
+ def test_execute_cypher_2hop_count_uses_exact(with_exact_stats):
66
+ eng, o = with_exact_stats
67
+ seed = SEEDS[0]
68
+ from iris_vector_graph.schema import _call_classmethod_large
69
+ expected = int(_call_classmethod_large(o, "Graph.KG.Traversal", "KHop2Count", seed, PRED))
70
+ times = []
71
+ for _ in range(5):
72
+ o.classMethodValue("Graph.KG.Traversal", "KHop2CountExact", seed, PRED)
73
+ for _ in range(20):
74
+ t0 = time.perf_counter()
75
+ result = eng.execute_cypher(
76
+ f"MATCH (s {{node_id:$id}})-[:{PRED}*2]->(n) RETURN count(n) AS cnt",
77
+ {"id": seed},
78
+ )
79
+ times.append((time.perf_counter() - t0) * 1000)
80
+ p50 = statistics.median(times)
81
+ cnt = result.rows[0][0]
82
+ assert int(cnt) == expected, f"execute_cypher returned {cnt}, expected {expected}"
83
+ assert p50 < 1.0, f"execute_cypher 2-hop COUNT p50={p50:.3f}ms exceeds 1ms"
84
+
85
+
86
+ @pytest.mark.e2e
87
+ def test_khop2_count_exact_fallback(enterprise_engine):
88
+ eng, o = enterprise_engine
89
+ import iris
90
+ conn = eng.conn
91
+ iris_obj = iris.createIRIS(conn)
92
+ iris_obj.classMethodVoid("Graph.KG.Traversal", "Build2HopExactStats")
93
+ iris_obj.classMethodValue("%SYSTEM.Process", "Xecute", 'Kill ^KG("deg2p_exact")')
94
+ seed = SEEDS[0]
95
+ from iris_vector_graph.schema import _call_classmethod_large
96
+ exact = int(iris_obj.classMethodValue("Graph.KG.Traversal", "KHop2CountExact", seed, PRED))
97
+ slow = int(_call_classmethod_large(iris_obj, "Graph.KG.Traversal", "KHop2Count", seed, PRED))
98
+ assert exact == slow, f"Fallback KHop2CountExact={exact} != KHop2Count={slow}"
99
+
100
+
101
+ @pytest.mark.e2e
102
+ def test_rebuild_nkg_under_30s(enterprise_engine):
103
+ eng, o = enterprise_engine
104
+ t0 = time.time()
105
+ ok = eng.rebuild_nkg()
106
+ elapsed = time.time() - t0
107
+ assert ok, "rebuild_nkg() returned False"
108
+ assert elapsed <= 30.0, f"rebuild_nkg took {elapsed:.1f}s, exceeds 30s target"