iris-vector-graph 1.63.3__tar.gz → 1.63.4__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 (246) hide show
  1. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/PKG-INFO +5 -1
  2. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/README.md +4 -0
  3. iris_vector_graph-1.63.4/iris_src/src/Graph/KG/NKGAccel.cls +560 -0
  4. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/pyproject.toml +1 -1
  5. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/.gitignore +0 -0
  6. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/LICENSE +0 -0
  7. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/demo_biomedical.py +0 -0
  8. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/demo_fraud_detection.py +0 -0
  9. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/demo_fraud_detection_sql.py +0 -0
  10. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/demo_utils.py +0 -0
  11. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/demo_working_system.py +0 -0
  12. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/__init__.py +0 -0
  13. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical/__init__.py +0 -0
  14. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical/loaders.py +0 -0
  15. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical/resolver.py +0 -0
  16. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical/types.py +0 -0
  17. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical_legacy/__init__.py +0 -0
  18. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical_legacy/biomedical_engine.py +0 -0
  19. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical_legacy/biomedical_schema.py +0 -0
  20. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical_legacy/legacy_wrapper.py +0 -0
  21. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/fraud/__init__.py +0 -0
  22. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/fraud/loaders.py +0 -0
  23. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/fraud/resolver.py +0 -0
  24. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/fraud/types.py +0 -0
  25. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/graphQL.http +0 -0
  26. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/hybrid_vector_graph_query.cypher +0 -0
  27. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/rest.http +0 -0
  28. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Algorithms.cls +0 -0
  29. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/ArnoAccel.cls +0 -0
  30. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/BM25Index.cls +0 -0
  31. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/BenchFormat.cls +0 -0
  32. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/BenchSeeder.cls +0 -0
  33. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Benchmark.cls +0 -0
  34. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Edge.cls +0 -0
  35. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/EdgeScan.cls +0 -0
  36. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/GraphIndex.cls +0 -0
  37. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/IVFIndex.cls +0 -0
  38. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Loader.cls +0 -0
  39. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/MCPService.cls +0 -0
  40. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/MCPToolSet.cls +0 -0
  41. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/MCPTools.cls +0 -0
  42. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Meta.cls +0 -0
  43. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/PLAIDSearch.cls +0 -0
  44. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/PageRank.cls +0 -0
  45. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/PyOps.cls +0 -0
  46. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Service.cls +0 -0
  47. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Snapshot.cls +0 -0
  48. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Subgraph.cls +0 -0
  49. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/TemporalIndex.cls +0 -0
  50. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/TestEdge.cls +0 -0
  51. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Traversal.cls +0 -0
  52. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/VecIndex.cls +0 -0
  53. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/PageRankEmbedded.cls +0 -0
  54. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/User.Exec.cls +0 -0
  55. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/iris/vector/graph/GraphOperators.cls +0 -0
  56. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/__init__.py +0 -0
  57. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/bolt_server.py +0 -0
  58. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/bulk_loader.py +0 -0
  59. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/capabilities.py +0 -0
  60. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/__init__.py +0 -0
  61. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/algorithms/__init__.py +0 -0
  62. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/algorithms/paths.py +0 -0
  63. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/ast.py +0 -0
  64. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/lexer.py +0 -0
  65. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/parser.py +0 -0
  66. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/translator.py +0 -0
  67. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher_api.py +0 -0
  68. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/embedded.py +0 -0
  69. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/engine.py +0 -0
  70. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/fusion.py +0 -0
  71. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/__init__.py +0 -0
  72. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/constants.py +0 -0
  73. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/engine.py +0 -0
  74. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/pooling.py +0 -0
  75. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/resolvers.py +0 -0
  76. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/schema.py +0 -0
  77. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/models.py +0 -0
  78. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/operators.py +0 -0
  79. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/py.typed +0 -0
  80. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/schema.py +0 -0
  81. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/security.py +0 -0
  82. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/status.py +0 -0
  83. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/text_search.py +0 -0
  84. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/utils.py +0 -0
  85. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/vector_utils.py +0 -0
  86. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/fhir_bridges.sql +0 -0
  87. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/fraud_sample_data.sql +0 -0
  88. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/globals_schema.sql +0 -0
  89. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/graph_path_globals.sql +0 -0
  90. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/graph_walk_tvf.sql +0 -0
  91. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/migrations/000_base_schema_iris.sql +0 -0
  92. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/migrations/001_add_nodepk_table.sql +0 -0
  93. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/migrations/001_rollback_nodepk.sql +0 -0
  94. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/migrations/002_add_fk_constraints.sql +0 -0
  95. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/operators.sql +0 -0
  96. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/operators_fixed.sql +0 -0
  97. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/procedures/kg_PageRank.sql +0 -0
  98. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/rdf_reifications.sql +0 -0
  99. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/schema.sql +0 -0
  100. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/TESTING.md +0 -0
  101. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmark_parser.py +0 -0
  102. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/benchmark_neo4j.py +0 -0
  103. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/bfs_benchmark.py +0 -0
  104. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/establish_baseline.py +0 -0
  105. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/graph_gen.py +0 -0
  106. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/iris_baseline_run.py +0 -0
  107. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/iris_os_run.py +0 -0
  108. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/load_neo4j.py +0 -0
  109. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/synthetic_baseline.csv +0 -0
  110. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/conftest.py +0 -0
  111. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/contract/__init__.py +0 -0
  112. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/contract/test_cypher_api.py +0 -0
  113. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/contract/test_cypher_api_errors.py +0 -0
  114. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/contract/test_graphql_queries.py +0 -0
  115. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/contract/test_graphql_schema.py +0 -0
  116. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/contract/test_ppr_api.py +0 -0
  117. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/curl_suite.sh +0 -0
  118. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/__init__.py +0 -0
  119. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/conftest.py +0 -0
  120. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_biomedical_demo.py +0 -0
  121. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_biomedical_ui.py +0 -0
  122. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_cypher_coerce_e2e.py +0 -0
  123. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_cypher_sprints_e2e.py +0 -0
  124. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_cypher_vector_search.py +0 -0
  125. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_fhir_bridges_e2e.py +0 -0
  126. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_fraud_demo.py +0 -0
  127. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_fraud_ui.py +0 -0
  128. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_autogen_startup.py +0 -0
  129. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_cypher_passthrough.py +0 -0
  130. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_node_queries.py +0 -0
  131. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_semantic_search.py +0 -0
  132. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_traversal.py +0 -0
  133. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_graph_kernels_e2e.py +0 -0
  134. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_hla_kg_e2e.py +0 -0
  135. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_multi_query_engine_platform.py +0 -0
  136. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_named_paths_e2e.py +0 -0
  137. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_nkg_index_e2e.py +0 -0
  138. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_operator_wiring_e2e.py +0 -0
  139. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_plaid_search_e2e.py +0 -0
  140. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_ppr_cls_fast_path.py +0 -0
  141. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_ppr_guided_e2e.py +0 -0
  142. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_procedure_installation.py +0 -0
  143. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_reification_e2e.py +0 -0
  144. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_schema_procedures_e2e.py +0 -0
  145. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_subgraph_e2e.py +0 -0
  146. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_subquery_call_e2e.py +0 -0
  147. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_vecindex_e2e.py +0 -0
  148. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/__init__.py +0 -0
  149. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/conftest.py +0 -0
  150. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/gql/__init__.py +0 -0
  151. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/gql/test_graphql_mutations.py +0 -0
  152. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/gql/test_graphql_nested_queries.py +0 -0
  153. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/gql/test_graphql_queries.py +0 -0
  154. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/gql/test_graphql_vector_search.py +0 -0
  155. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_bidirectional_ppr.py +0 -0
  156. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cls_layer.py +0 -0
  157. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_advanced.py +0 -0
  158. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_enhancements.py +0 -0
  159. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_multi_type.py +0 -0
  160. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_rd.py +0 -0
  161. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_rel_vars.py +0 -0
  162. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_single_type.py +0 -0
  163. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_untyped.py +0 -0
  164. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_vector_search.py +0 -0
  165. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_embeddings_api.py +0 -0
  166. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_fastapi_graphql.py +0 -0
  167. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_fhir_bridges_integration.py +0 -0
  168. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_named_paths_integration.py +0 -0
  169. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_advanced_benchmarks.py +0 -0
  170. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_constraints.py +0 -0
  171. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_graph_analytics.py +0 -0
  172. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_migration.py +0 -0
  173. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_performance.py +0 -0
  174. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_production_scale.py +0 -0
  175. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_objectscript_classes.py +0 -0
  176. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_pagerank_sql_optimization.py +0 -0
  177. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_reification_integration.py +0 -0
  178. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_schema_migration.py +0 -0
  179. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_stored_procedure_install.py +0 -0
  180. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_subquery_call_integration.py +0 -0
  181. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/performance/conftest.py +0 -0
  182. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/performance/scale_benchmark.py +0 -0
  183. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/performance/test_ppr_stress.py +0 -0
  184. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/performance/test_stress_v1_5.py +0 -0
  185. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/run_all_tests.py +0 -0
  186. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_iris_rest_api.py +0 -0
  187. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_networkx_loader.py +0 -0
  188. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_performance_benchmarks.py +0 -0
  189. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_pyops_vector_conversion.py +0 -0
  190. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_python_operators.py +0 -0
  191. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_python_sdk.py +0 -0
  192. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_schema_validation.py +0 -0
  193. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_sql_queries.py +0 -0
  194. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_vector_functions.py +0 -0
  195. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/cypher/__init__.py +0 -0
  196. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/cypher/test_lexer.py +0 -0
  197. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/cypher/test_lexer_advanced.py +0 -0
  198. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/cypher/test_parser.py +0 -0
  199. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/cypher/test_parser_advanced.py +0 -0
  200. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_batch_mutations.py +0 -0
  201. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_bfs_arno.py +0 -0
  202. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_bm25_index.py +0 -0
  203. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_bolt_server.py +0 -0
  204. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cls_deployment.py +0 -0
  205. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_benchmark.py +0 -0
  206. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_benchmark_scale.py +0 -0
  207. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_case_when.py +0 -0
  208. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_e2e_new_features.py +0 -0
  209. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_functions.py +0 -0
  210. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_parser.py +0 -0
  211. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_posos_bugs.py +0 -0
  212. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_procedures.py +0 -0
  213. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_translator.py +0 -0
  214. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_union_exists.py +0 -0
  215. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_var_length.py +0 -0
  216. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_vector_search.py +0 -0
  217. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_edge_embeddings.py +0 -0
  218. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_edgeprop_ndjson.py +0 -0
  219. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_embedded.py +0 -0
  220. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_engine_dimension_fix.py +0 -0
  221. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_engine_embeddings.py +0 -0
  222. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_engine_status.py +0 -0
  223. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_fhir_bridges.py +0 -0
  224. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_get_nodes.py +0 -0
  225. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_graph_kernels.py +0 -0
  226. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_graphql_dataloader.py +0 -0
  227. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_ingest_formats.py +0 -0
  228. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_ivf_index.py +0 -0
  229. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_named_graphs.py +0 -0
  230. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_named_paths.py +0 -0
  231. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_operators_wiring.py +0 -0
  232. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_plaid_search.py +0 -0
  233. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_ppr_guided_subgraph.py +0 -0
  234. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_reification.py +0 -0
  235. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_schema_init.py +0 -0
  236. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_schema_procedures.py +0 -0
  237. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_shortest_path.py +0 -0
  238. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_snapshot.py +0 -0
  239. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_sql_splitter.py +0 -0
  240. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_sql_table_bridge.py +0 -0
  241. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_subgraph.py +0 -0
  242. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_subquery_call.py +0 -0
  243. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_temporal_cypher.py +0 -0
  244. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_temporal_edges.py +0 -0
  245. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_unified_edge_store.py +0 -0
  246. {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/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.63.3
3
+ Version: 1.63.4
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
@@ -692,6 +692,10 @@ anchors = engine.get_kg_anchors(icd_codes=["J18.0", "E11.9"])
692
692
 
693
693
  ## Changelog
694
694
 
695
+ ### v1.63.4 (2026-04-26)
696
+ - chore: merge 080-engine-status to main; NKGAccel.cls added to iris_src from arno upstream
697
+
698
+
695
699
  ### v1.63.3 (2026-04-26)
696
700
  - feat: `engine.status() -> EngineStatus` — structured runtime snapshot: SQL row counts, `^KG`/`^NKG` population, ObjectScript classes, Arno capabilities, HNSW/IVF/BM25/PLAID index inventory. Readiness properties: `ready_for_bfs`, `ready_for_vector_search`, `ready_for_edge_search`, `ready_for_full_text`. Detects `^KG`/`rdf_edges` predicate mismatch (stale ^KG from different data snapshot). (spec 080)
697
701
  - fix: `BuildKG()` `Traversal.cls` SQL cursors now use fully-qualified `Graph_KG.rdf_edges`, `Graph_KG.rdf_labels`, `Graph_KG.rdf_props` — fixes predicate mismatch when IRIS namespace default SQL schema is not `Graph_KG` (e.g. MINDWALK namespace with `SQLUser` default)
@@ -620,6 +620,10 @@ anchors = engine.get_kg_anchors(icd_codes=["J18.0", "E11.9"])
620
620
 
621
621
  ## Changelog
622
622
 
623
+ ### v1.63.4 (2026-04-26)
624
+ - chore: merge 080-engine-status to main; NKGAccel.cls added to iris_src from arno upstream
625
+
626
+
623
627
  ### v1.63.3 (2026-04-26)
624
628
  - feat: `engine.status() -> EngineStatus` — structured runtime snapshot: SQL row counts, `^KG`/`^NKG` population, ObjectScript classes, Arno capabilities, HNSW/IVF/BM25/PLAID index inventory. Readiness properties: `ready_for_bfs`, `ready_for_vector_search`, `ready_for_edge_search`, `ready_for_full_text`. Detects `^KG`/`rdf_edges` predicate mismatch (stale ^KG from different data snapshot). (spec 080)
625
629
  - fix: `BuildKG()` `Traversal.cls` SQL cursors now use fully-qualified `Graph_KG.rdf_edges`, `Graph_KG.rdf_labels`, `Graph_KG.rdf_props` — fixes predicate mismatch when IRIS namespace default SQL schema is not `Graph_KG` (e.g. MINDWALK namespace with `SQLUser` default)
@@ -0,0 +1,560 @@
1
+ /// Graph.KG.NKGAccel — NICHE Knowledge Graph accelerated analytics.
2
+ /// Seed-local algorithms run in ObjectScript at $ORDER speed.
3
+ /// Full-graph algorithms export adjacency for Rust consumption.
4
+ ///
5
+ /// Auto-detects ^NKG (integer-encoded) vs ^KG (string-subscripted).
6
+ Class Graph.KG.NKGAccel Extends %RegisteredObject
7
+ {
8
+
9
+ /// Detect whether ^NKG is available. Cache per-process.
10
+ ClassMethod UseNKG() As %Boolean
11
+ {
12
+ If $Data(^||NKGAccel("useNKG")) Return ^||NKGAccel("useNKG")
13
+ Set use = ($Data(^NKG("$meta")) > 0)
14
+ Set ^||NKGAccel("useNKG") = use
15
+ Return use
16
+ }
17
+
18
+ /// Clear cached detection (call after BuildKG or schema change)
19
+ ClassMethod ResetCache()
20
+ {
21
+ Kill ^||NKGAccel
22
+ }
23
+
24
+ /// Load arno callout library and register all function IDs for this process.
25
+ /// Call once at startup: Do ##class(Graph.KG.NKGAccel).Load("/path/to/libarno_callout.so")
26
+ /// Returns 1 on success, 0 if library not found or load failed.
27
+ /// Safe to call multiple times — no-ops if already loaded in this process.
28
+ ClassMethod Load(libPath As %String = "/usr/irissys/mgr/libarno_callout.so") As %Boolean
29
+ {
30
+ If $Data(^||NKGAccel("dllid")) Return 1
31
+ Set dllid = $ZF(-4, 1, libPath)
32
+ If dllid = 0 Return 0
33
+ Set ^||NKGAccel("dllid") = dllid
34
+ Set ^||NKGAccel("libPath") = libPath
35
+ Set ^||NKGAccel("bfs_fn") = $ZF(-4, 3, dllid, "kg_bfs_global")
36
+ Return 1
37
+ }
38
+
39
+ /// Returns 1 if arno is loaded and bfs function is available in this process.
40
+ ClassMethod IsLoaded() As %Boolean
41
+ {
42
+ If '$Data(^||NKGAccel("dllid")) Return 0
43
+ Return (^||NKGAccel("bfs_fn") > 0)
44
+ }
45
+
46
+ // ============================================================
47
+ // T015: ExportAdjacency — full graph for Rust consumption
48
+ // ============================================================
49
+
50
+ /// Export full graph adjacency as integer-indexed lines.
51
+ /// Format: srcIdx:dstIdx1,dstIdx2,...\n
52
+ /// Returns string directly if < 3MB, otherwise chunks to ^||adj.
53
+ ClassMethod ExportAdjacency() As %String
54
+ {
55
+ If ..UseNKG() Return ..ExportAdjacencyNKG()
56
+ Return ..ExportAdjacencyKG()
57
+ }
58
+
59
+ /// Export from ^NKG (integer subscripts — zero string overhead)
60
+ ClassMethod ExportAdjacencyNKG() As %String [ Private ]
61
+ {
62
+ Set result = "", chunk = "", chunkNum = 0
63
+ Set src = ""
64
+ For {
65
+ Set src = $Order(^NKG(-3, src))
66
+ Quit:src=""
67
+ Set nbrs = "", pred = ""
68
+ For {
69
+ Set pred = $Order(^NKG(-1, src, pred))
70
+ Quit:pred=""
71
+ Set dst = ""
72
+ For {
73
+ Set dst = $Order(^NKG(-1, src, pred, dst))
74
+ Quit:dst=""
75
+ Set:nbrs'="" nbrs = nbrs _ ","
76
+ Set nbrs = nbrs _ dst
77
+ }
78
+ }
79
+ Set line = src _ ":" _ nbrs _ $Char(10)
80
+ If $Length(result) + $Length(line) > 3000000 {
81
+ // Switch to chunked mode
82
+ If chunkNum = 0 {
83
+ Set chunkNum = 1
84
+ Set ^||adj(1) = result
85
+ Set result = ""
86
+ }
87
+ If $Length(chunk) + $Length(line) > 32000 {
88
+ Set chunkNum = chunkNum + 1
89
+ Set ^||adj(chunkNum) = chunk
90
+ Set chunk = ""
91
+ }
92
+ Set chunk = chunk _ line
93
+ } Else {
94
+ Set result = result _ line
95
+ }
96
+ }
97
+ If chunkNum > 0 {
98
+ If chunk '= "" { Set chunkNum = chunkNum + 1, ^||adj(chunkNum) = chunk }
99
+ Set ^||adj = chunkNum
100
+ Return "CHUNKED:" _ chunkNum
101
+ }
102
+ Return result
103
+ }
104
+
105
+ /// Export from ^KG (string subscripts — builds node index on the fly)
106
+ ClassMethod ExportAdjacencyKG() As %String [ Private ]
107
+ {
108
+ // Pass 1: assign integer indices to all nodes
109
+ Kill ^||nodeIdx
110
+ Set n = 0, node = ""
111
+ For {
112
+ Set node = $Order(^KG("deg", node))
113
+ Quit:node=""
114
+ Set ^||nodeIdx(node) = n
115
+ Set ^||nodeMap(n) = node
116
+ Set n = n + 1
117
+ }
118
+ // Also pick up nodes only in "in" (no outgoing edges)
119
+ Set node = ""
120
+ For {
121
+ Set node = $Order(^KG("in", node))
122
+ Quit:node=""
123
+ If '$Data(^||nodeIdx(node)) {
124
+ Set ^||nodeIdx(node) = n
125
+ Set ^||nodeMap(n) = node
126
+ Set n = n + 1
127
+ }
128
+ }
129
+
130
+ // Pass 2: build adjacency
131
+ Set result = "", chunk = "", chunkNum = 0
132
+ Set src = ""
133
+ For {
134
+ Set src = $Order(^KG("out", src))
135
+ Quit:src=""
136
+ Set sIdx = $Get(^||nodeIdx(src))
137
+ If sIdx = "" Continue
138
+ Set nbrs = "", pred = ""
139
+ For {
140
+ Set pred = $Order(^KG("out", src, pred))
141
+ Quit:pred=""
142
+ Set dst = ""
143
+ For {
144
+ Set dst = $Order(^KG("out", src, pred, dst))
145
+ Quit:dst=""
146
+ Set dIdx = $Get(^||nodeIdx(dst))
147
+ If dIdx = "" Continue
148
+ Set:nbrs'="" nbrs = nbrs _ ","
149
+ Set nbrs = nbrs _ dIdx
150
+ }
151
+ }
152
+ Set line = sIdx _ ":" _ nbrs _ $Char(10)
153
+ If $Length(result) + $Length(line) > 3000000 {
154
+ If chunkNum = 0 {
155
+ Set chunkNum = 1
156
+ Set ^||adj(1) = result
157
+ Set result = ""
158
+ }
159
+ If $Length(chunk) + $Length(line) > 32000 {
160
+ Set chunkNum = chunkNum + 1
161
+ Set ^||adj(chunkNum) = chunk
162
+ Set chunk = ""
163
+ }
164
+ Set chunk = chunk _ line
165
+ } Else {
166
+ Set result = result _ line
167
+ }
168
+ }
169
+ If chunkNum > 0 {
170
+ If chunk '= "" { Set chunkNum = chunkNum + 1, ^||adj(chunkNum) = chunk }
171
+ Set ^||adj = chunkNum
172
+ Return "CHUNKED:" _ chunkNum _ "|NODEMAP"
173
+ }
174
+ // Append node map header so Rust can resolve indices to strings
175
+ Set header = "NODEMAP:" _ n _ $Char(10)
176
+ For i = 0:1:n-1 { Set header = header _ i _ "=" _ ^||nodeMap(i) _ $Char(10) }
177
+ Return header _ "---" _ $Char(10) _ result
178
+ }
179
+
180
+ // ============================================================
181
+ // T019: KHopNeighbors — seed-local BFS at $ORDER speed
182
+ // ============================================================
183
+
184
+ /// k-hop BFS from a seed node. Returns JSON with visited nodes and distances.
185
+ /// Runs entirely in ObjectScript — no Rust, no graph serialization.
186
+ /// Cost: ~0.5ms for 2-hop fanout-16 regardless of graph size.
187
+ ClassMethod KHopNeighbors(seedId As %String, k As %Integer = 2, maxNodes As %Integer = 1000) As %String
188
+ {
189
+ Set useNKG = ..UseNKG()
190
+ If useNKG {
191
+ Set seedIdx = $Get(^NKG("$NI", seedId))
192
+ If seedIdx = "" Return "{""error"":""node not found"",""node"":"""_seedId_"""}"
193
+ }
194
+
195
+ Kill ^||visited, ^||frontier, ^||nextFrontier
196
+ If useNKG {
197
+ Set ^||visited(seedIdx) = 0
198
+ Set ^||frontier(seedIdx) = ""
199
+ } Else {
200
+ Set ^||visited(seedId) = 0
201
+ Set ^||frontier(seedId) = ""
202
+ }
203
+ Set totalNodes = 1
204
+
205
+ For hop = 1:1:k {
206
+ Kill ^||nextFrontier
207
+ Set node = ""
208
+ For {
209
+ Set node = $Order(^||frontier(node))
210
+ Quit:node=""
211
+ If useNKG {
212
+ Set pred = ""
213
+ For {
214
+ Set pred = $Order(^NKG(-1, node, pred))
215
+ Quit:pred=""
216
+ Set dst = ""
217
+ For {
218
+ Set dst = $Order(^NKG(-1, node, pred, dst))
219
+ Quit:dst=""
220
+ If '$Data(^||visited(dst)) {
221
+ Set ^||visited(dst) = hop
222
+ Set ^||nextFrontier(dst) = ""
223
+ Set totalNodes = totalNodes + 1
224
+ If totalNodes >= maxNodes Goto KHDone
225
+ }
226
+ }
227
+ }
228
+ } Else {
229
+ Set pred = ""
230
+ For {
231
+ Set pred = $Order(^KG("out", node, pred))
232
+ Quit:pred=""
233
+ Set dst = ""
234
+ For {
235
+ Set dst = $Order(^KG("out", node, pred, dst))
236
+ Quit:dst=""
237
+ If '$Data(^||visited(dst)) {
238
+ Set ^||visited(dst) = hop
239
+ Set ^||nextFrontier(dst) = ""
240
+ Set totalNodes = totalNodes + 1
241
+ If totalNodes >= maxNodes Goto KHDone
242
+ }
243
+ }
244
+ }
245
+ }
246
+ }
247
+ Kill ^||frontier
248
+ Merge ^||frontier = ^||nextFrontier
249
+ }
250
+
251
+ KHDone
252
+ // Serialize result
253
+ Set result = "{""seed"":"""_seedId_""",""hops"":"_k_",""totalNodes"":"_totalNodes_",""nodes"":["
254
+ Set node = "", first = 1
255
+ For {
256
+ Set node = $Order(^||visited(node), 1, dist)
257
+ Quit:node=""
258
+ Set:'first result = result _ ","
259
+ Set first = 0
260
+ If useNKG {
261
+ Set nodeStr = $Get(^NKG("$ND", node), node)
262
+ } Else {
263
+ Set nodeStr = node
264
+ }
265
+ Set result = result _ "{""id"":"""_nodeStr_""",""dist"":"_dist_"}"
266
+ }
267
+ Set result = result _ "]}"
268
+ Return result
269
+ }
270
+
271
+ // ============================================================
272
+ // T020: PPRNative — Personalized PageRank via power iteration
273
+ // ============================================================
274
+
275
+ /// Personalized PageRank from seed node(s). Runs in ObjectScript.
276
+ /// Returns top-K nodes with scores as JSON.
277
+ ClassMethod PPRNative(seedId As %String, alpha As %Double = 0.85, maxIter As %Integer = 20, topK As %Integer = 20) As %String
278
+ {
279
+ Set useNKG = ..UseNKG()
280
+
281
+ // Initialize: collect seed's local neighborhood (2-hop)
282
+ // and run PPR only on the subgraph
283
+ Set khJson = ..KHopNeighbors(seedId, 2, 5000)
284
+ Set kh = ##class(%DynamicObject).%FromJSON(khJson)
285
+ If kh.%IsDefined("error") Return khJson
286
+
287
+ // Build local adjacency from the visited nodes
288
+ Kill ^||pprAdj, ^||pprScore, ^||pprNext
289
+ Set nodes = kh.nodes
290
+ Set n = nodes.%Size()
291
+
292
+ // Index the local nodes
293
+ Kill ^||localIdx
294
+ For i = 0:1:n-1 {
295
+ Set nodeId = nodes.%Get(i).id
296
+ Set ^||localIdx(nodeId) = i
297
+ }
298
+
299
+ // Build local adjacency
300
+ For i = 0:1:n-1 {
301
+ Set nodeId = nodes.%Get(i).id
302
+ Set deg = 0
303
+ If useNKG {
304
+ Set nkgIdx = $Get(^NKG("$NI", nodeId), "")
305
+ If nkgIdx '= "" {
306
+ Set pred = ""
307
+ For {
308
+ Set pred = $Order(^NKG(-1, nkgIdx, pred))
309
+ Quit:pred=""
310
+ Set dst = ""
311
+ For {
312
+ Set dst = $Order(^NKG(-1, nkgIdx, pred, dst))
313
+ Quit:dst=""
314
+ Set dstStr = $Get(^NKG("$ND", dst), "")
315
+ If $Data(^||localIdx(dstStr)) {
316
+ Set ^||pprAdj(i, deg) = ^||localIdx(dstStr)
317
+ Set deg = deg + 1
318
+ }
319
+ }
320
+ }
321
+ }
322
+ } Else {
323
+ Set pred = ""
324
+ For {
325
+ Set pred = $Order(^KG("out", nodeId, pred))
326
+ Quit:pred=""
327
+ Set dst = ""
328
+ For {
329
+ Set dst = $Order(^KG("out", nodeId, pred, dst))
330
+ Quit:dst=""
331
+ If $Data(^||localIdx(dst)) {
332
+ Set ^||pprAdj(i, deg) = ^||localIdx(dst)
333
+ Set deg = deg + 1
334
+ }
335
+ }
336
+ }
337
+ }
338
+ Set ^||pprAdj(i) = deg
339
+ }
340
+
341
+ // Find seed index
342
+ Set seedLocalIdx = $Get(^||localIdx(seedId), 0)
343
+
344
+ // Initialize scores: teleport vector = 1 for seed, 0 for others
345
+ For i = 0:1:n-1 { Set ^||pprScore(i) = 0 }
346
+ Set ^||pprScore(seedLocalIdx) = 1
347
+
348
+ // Power iteration
349
+ For iter = 1:1:maxIter {
350
+ For i = 0:1:n-1 { Set ^||pprNext(i) = 0 }
351
+ For i = 0:1:n-1 {
352
+ Set deg = $Get(^||pprAdj(i), 0)
353
+ If deg = 0 Continue
354
+ Set contrib = ^||pprScore(i) / deg
355
+ For j = 0:1:deg-1 {
356
+ Set nbr = ^||pprAdj(i, j)
357
+ Set ^||pprNext(nbr) = ^||pprNext(nbr) + (alpha * contrib)
358
+ }
359
+ }
360
+ // Add teleport
361
+ For i = 0:1:n-1 {
362
+ Set ^||pprNext(i) = ^||pprNext(i) + ((1 - alpha) * $Select(i=seedLocalIdx:1, 1:0))
363
+ }
364
+ // Swap
365
+ For i = 0:1:n-1 { Set ^||pprScore(i) = ^||pprNext(i) }
366
+ }
367
+
368
+ // Collect top-K by score (simple selection)
369
+ Kill ^||ranked
370
+ For i = 0:1:n-1 {
371
+ Set score = ^||pprScore(i)
372
+ Set ^||ranked(-score, i) = ""
373
+ }
374
+
375
+ Set result = "{""seed"":"""_seedId_""",""alpha"":"_alpha_",""iterations"":"_maxIter_",""scores"":["
376
+ Set first = 1, count = 0
377
+ Set sk = ""
378
+ For {
379
+ Set sk = $Order(^||ranked(sk))
380
+ Quit:sk=""
381
+ Set idx = ""
382
+ For {
383
+ Set idx = $Order(^||ranked(sk, idx))
384
+ Quit:idx=""
385
+ Set nodeId = nodes.%Get(idx).id
386
+ Set score = -sk
387
+ Set:'first result = result _ ","
388
+ Set first = 0
389
+ Set result = result _ "{""id"":"""_nodeId_""",""score"":"_$FNumber(score,"",6)_"}"
390
+ Set count = count + 1
391
+ If count >= topK Goto PPRDone
392
+ }
393
+ }
394
+
395
+ PPRDone
396
+ Set result = result _ "]}"
397
+ Return result
398
+ }
399
+
400
+ // ============================================================
401
+ // Wrappers that replace CacheGraphJson path for seed-local
402
+ // ============================================================
403
+
404
+ /// K-hop neighborhood — pure ObjectScript, no Rust needed
405
+ ClassMethod KHopJson(seedId As %String, k As %Integer = 2, maxNodes As %Integer = 1000) As %String
406
+ {
407
+ Return ..KHopNeighbors(seedId, k, maxNodes)
408
+ }
409
+
410
+ /// Personalized PageRank — pure ObjectScript on local subgraph
411
+ ClassMethod PPRJson(seedId As %String, alpha As %Double = 0.85, maxIter As %Integer = 20) As %String
412
+ {
413
+ Return ..PPRNative(seedId, alpha, maxIter)
414
+ }
415
+
416
+ /// Random walk — pure ObjectScript
417
+ ClassMethod RandomWalkJson(seedId As %String, walkLength As %Integer = 20, numWalks As %Integer = 10) As %String
418
+ {
419
+ Set useNKG = ..UseNKG()
420
+ Set result = "["
421
+ For w = 1:1:numWalks {
422
+ Set:'(w=1) result = result _ ","
423
+ Set result = result _ "["
424
+ Set current = seedId
425
+ If useNKG { Set currentIdx = $Get(^NKG("$NI", seedId), "") }
426
+ Set result = result _ """" _ seedId _ """"
427
+ For step = 1:1:walkLength {
428
+ // Collect neighbors
429
+ Kill ^||walkNbrs
430
+ Set nbrCount = 0
431
+ If useNKG && (currentIdx '= "") {
432
+ Set pred = "" For { Set pred=$Order(^NKG(-1,currentIdx,pred)) Quit:pred="" Set dst="" For { Set dst=$Order(^NKG(-1,currentIdx,pred,dst)) Quit:dst="" Set nbrCount=nbrCount+1, ^||walkNbrs(nbrCount)=dst } }
433
+ } Else {
434
+ Set pred="" For { Set pred=$Order(^KG("out",current,pred)) Quit:pred="" Set dst="" For { Set dst=$Order(^KG("out",current,pred,dst)) Quit:dst="" Set nbrCount=nbrCount+1, ^||walkNbrs(nbrCount)=dst } }
435
+ }
436
+ If nbrCount = 0 Quit
437
+ // Pick random neighbor
438
+ Set pick = $Random(nbrCount) + 1
439
+ If useNKG {
440
+ Set currentIdx = ^||walkNbrs(pick)
441
+ Set current = $Get(^NKG("$ND", currentIdx), currentIdx)
442
+ } Else {
443
+ Set current = ^||walkNbrs(pick)
444
+ }
445
+ Set result = result _ ",""" _ current _ """"
446
+ }
447
+ Set result = result _ "]"
448
+ }
449
+ Set result = result _ "]"
450
+ Return result
451
+ }
452
+
453
+ ClassMethod BFSJson(seed As %String, predicatesJson As %String = "[]", maxHops As %Integer = 3, maxResults As %Integer = 0) As %String
454
+ {
455
+ Set dllPath = $Get(^||NKGAccel("libPath"), "/usr/irissys/mgr/libarno_callout.so")
456
+ If '$Data(^||NKGAccel("bfs_fn")) {
457
+ Set dllid = $ZF(-4, 1, dllPath)
458
+ If dllid = 0 {
459
+ Return ##class(Graph.KG.Traversal).BFSFastJson(seed, predicatesJson, maxHops, "")
460
+ }
461
+ Set ^||NKGAccel("dllid") = dllid
462
+ Set ^||NKGAccel("bfs_fn") = $ZF(-4, 3, dllid, "kg_bfs_global")
463
+ }
464
+ Set dllid = ^||NKGAccel("dllid")
465
+ Set fnid = ^||NKGAccel("bfs_fn")
466
+ If fnid = 0 {
467
+ Return ##class(Graph.KG.Traversal).BFSFastJson(seed, predicatesJson, maxHops, "")
468
+ }
469
+ Set adjStr = ..ExportAdjacencyWithPreds()
470
+ If $Extract(adjStr, 1, 8) = "CHUNKED:" {
471
+ Set nChunks = $Piece(adjStr, ":", 2)
472
+ Set adjStr = ""
473
+ For i = 1:1:nChunks {
474
+ Set adjStr = adjStr _ ^||adjWP(i)
475
+ If $Length(adjStr) > 3500000 {
476
+ Kill ^||adjWP
477
+ Return ##class(Graph.KG.Traversal).BFSFastJson(seed, predicatesJson, maxHops, "")
478
+ }
479
+ }
480
+ Kill ^||adjWP
481
+ }
482
+ If $Length(adjStr) = 0 {
483
+ Return ##class(Graph.KG.Traversal).BFSFastJson(seed, predicatesJson, maxHops, "")
484
+ }
485
+ Return $ZF(-5, dllid, fnid, adjStr, seed, predicatesJson, maxHops, maxResults)
486
+ }
487
+
488
+ ClassMethod ExportAdjacencyWithPreds() As %String [ Private ]
489
+ {
490
+ Set result = "", chunk = "", chunkNum = 0
491
+ Set src = ""
492
+ For {
493
+ Set src = $Order(^NKG(-1, src))
494
+ Quit:src=""
495
+ Set srcStr = $Get(^NKG("$ND", src), src)
496
+ Set pred = ""
497
+ For {
498
+ Set pred = $Order(^NKG(-1, src, pred))
499
+ Quit:pred=""
500
+ Set predStr = $Get(^NKG("$LS", -pred - 1), pred)
501
+ Set dst = ""
502
+ For {
503
+ Set dst = $Order(^NKG(-1, src, pred, dst))
504
+ Quit:dst=""
505
+ Set dstStr = $Get(^NKG("$ND", dst), dst)
506
+ Set line = srcStr _ $Char(31) _ predStr _ $Char(31) _ dstStr _ $Char(10)
507
+ If $Length(result) + $Length(line) > 3000000 {
508
+ If chunkNum = 0 {
509
+ Set chunkNum = 1
510
+ Set ^||adjWP(1) = result
511
+ Set result = ""
512
+ }
513
+ If $Length(chunk) + $Length(line) > 32000 {
514
+ Set chunkNum = chunkNum + 1
515
+ Set ^||adjWP(chunkNum) = chunk
516
+ Set chunk = ""
517
+ }
518
+ Set chunk = chunk _ line
519
+ } Else {
520
+ Set result = result _ line
521
+ }
522
+ }
523
+ }
524
+ }
525
+ If chunkNum > 0 {
526
+ If chunk '= "" { Set chunkNum = chunkNum + 1, ^||adjWP(chunkNum) = chunk }
527
+ Set ^||adjWP = chunkNum
528
+ Return "CHUNKED:" _ chunkNum
529
+ }
530
+ Return result
531
+ }
532
+
533
+ ClassMethod Capabilities() As %String
534
+ {
535
+ Set cap = {}
536
+ Do cap.%Set("version", "0.1.0")
537
+ Do cap.%Set("nkg_accel", 1, "boolean")
538
+ Do cap.%Set("nkg_data", ..UseNKG(), "boolean")
539
+ Do cap.%Set("global_set", ##class(%Dictionary.ClassDefinition).%ExistsId("User.GlobalSet"), "boolean")
540
+ Do cap.%Set("vec_index", ##class(%Dictionary.ClassDefinition).%ExistsId("Graph.KG.VecIndex"), "boolean")
541
+ Set hasRust = 0
542
+ Try {
543
+ If ##class(Graph.KG.ArnoAccel).IsAvailable() Set hasRust = 1
544
+ } Catch {}
545
+ Do cap.%Set("rust_callout", hasRust, "boolean")
546
+ Set algos = ["khop", "ppr", "random_walk", "export_adjacency", "bfs"]
547
+ Do cap.%Set("algorithms", algos)
548
+ Set rustAlgos = []
549
+ If hasRust {
550
+ Do rustAlgos.%Push("pagerank")
551
+ Do rustAlgos.%Push("wcc")
552
+ Do rustAlgos.%Push("cdlp")
553
+ Do rustAlgos.%Push("bfs")
554
+ }
555
+ Do cap.%Set("rust_algorithms", rustAlgos)
556
+ Do cap.%Set("bfs", 1, "boolean")
557
+ Return cap.%ToJSON()
558
+ }
559
+
560
+ }
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "iris-vector-graph"
7
- version = "1.63.3"
7
+ version = "1.63.4"
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"