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.
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/PKG-INFO +5 -1
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/README.md +4 -0
- iris_vector_graph-1.63.4/iris_src/src/Graph/KG/NKGAccel.cls +560 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/pyproject.toml +1 -1
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/.gitignore +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/LICENSE +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/demo_biomedical.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/demo_fraud_detection.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/demo_fraud_detection_sql.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/demo_utils.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/demo_working_system.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/__init__.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical/__init__.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical/loaders.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical/resolver.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical/types.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical_legacy/__init__.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical_legacy/biomedical_engine.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical_legacy/biomedical_schema.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical_legacy/legacy_wrapper.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/fraud/__init__.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/fraud/loaders.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/fraud/resolver.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/fraud/types.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/graphQL.http +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/hybrid_vector_graph_query.cypher +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/rest.http +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Algorithms.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/ArnoAccel.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/BM25Index.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/BenchFormat.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/BenchSeeder.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Benchmark.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Edge.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/EdgeScan.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/GraphIndex.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/IVFIndex.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Loader.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/MCPService.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/MCPToolSet.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/MCPTools.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Meta.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/PLAIDSearch.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/PageRank.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/PyOps.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Service.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Snapshot.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Subgraph.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/TemporalIndex.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/TestEdge.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Traversal.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/VecIndex.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/PageRankEmbedded.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/User.Exec.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_src/src/iris/vector/graph/GraphOperators.cls +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/__init__.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/bolt_server.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/bulk_loader.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/capabilities.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/__init__.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/algorithms/__init__.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/algorithms/paths.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/ast.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/lexer.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/parser.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/translator.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher_api.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/embedded.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/engine.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/fusion.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/__init__.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/constants.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/engine.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/pooling.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/resolvers.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/schema.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/models.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/operators.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/py.typed +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/schema.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/security.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/status.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/text_search.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/utils.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/iris_vector_graph/vector_utils.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/fhir_bridges.sql +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/fraud_sample_data.sql +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/globals_schema.sql +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/graph_path_globals.sql +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/graph_walk_tvf.sql +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/migrations/000_base_schema_iris.sql +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/migrations/001_add_nodepk_table.sql +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/migrations/001_rollback_nodepk.sql +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/migrations/002_add_fk_constraints.sql +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/operators.sql +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/operators_fixed.sql +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/procedures/kg_PageRank.sql +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/rdf_reifications.sql +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/sql/schema.sql +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/TESTING.md +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmark_parser.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/benchmark_neo4j.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/bfs_benchmark.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/establish_baseline.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/graph_gen.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/iris_baseline_run.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/iris_os_run.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/load_neo4j.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/benchmarks/synthetic_baseline.csv +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/conftest.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/contract/__init__.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/contract/test_cypher_api.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/contract/test_cypher_api_errors.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/contract/test_graphql_queries.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/contract/test_graphql_schema.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/contract/test_ppr_api.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/curl_suite.sh +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/__init__.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/conftest.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_biomedical_demo.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_biomedical_ui.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_cypher_coerce_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_cypher_sprints_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_cypher_vector_search.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_fhir_bridges_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_fraud_demo.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_fraud_ui.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_autogen_startup.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_cypher_passthrough.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_node_queries.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_semantic_search.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_traversal.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_graph_kernels_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_hla_kg_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_multi_query_engine_platform.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_named_paths_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_nkg_index_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_operator_wiring_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_plaid_search_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_ppr_cls_fast_path.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_ppr_guided_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_procedure_installation.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_reification_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_schema_procedures_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_subgraph_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_subquery_call_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/e2e/test_vecindex_e2e.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/__init__.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/conftest.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/gql/__init__.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/gql/test_graphql_mutations.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/gql/test_graphql_nested_queries.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/gql/test_graphql_queries.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/gql/test_graphql_vector_search.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_bidirectional_ppr.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cls_layer.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_advanced.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_enhancements.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_multi_type.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_rd.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_rel_vars.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_single_type.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_untyped.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_vector_search.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_embeddings_api.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_fastapi_graphql.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_fhir_bridges_integration.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_named_paths_integration.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_advanced_benchmarks.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_constraints.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_graph_analytics.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_migration.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_performance.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_production_scale.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_objectscript_classes.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_pagerank_sql_optimization.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_reification_integration.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_schema_migration.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_stored_procedure_install.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/integration/test_subquery_call_integration.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/performance/conftest.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/performance/scale_benchmark.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/performance/test_ppr_stress.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/performance/test_stress_v1_5.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/run_all_tests.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_iris_rest_api.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_networkx_loader.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_performance_benchmarks.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_pyops_vector_conversion.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_python_operators.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_python_sdk.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_schema_validation.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_sql_queries.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/python/test_vector_functions.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/cypher/__init__.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/cypher/test_lexer.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/cypher/test_lexer_advanced.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/cypher/test_parser.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/cypher/test_parser_advanced.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_batch_mutations.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_bfs_arno.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_bm25_index.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_bolt_server.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cls_deployment.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_benchmark.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_benchmark_scale.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_case_when.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_e2e_new_features.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_functions.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_parser.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_posos_bugs.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_procedures.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_translator.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_union_exists.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_var_length.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_vector_search.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_edge_embeddings.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_edgeprop_ndjson.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_embedded.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_engine_dimension_fix.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_engine_embeddings.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_engine_status.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_fhir_bridges.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_get_nodes.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_graph_kernels.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_graphql_dataloader.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_ingest_formats.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_ivf_index.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_named_graphs.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_named_paths.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_operators_wiring.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_plaid_search.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_ppr_guided_subgraph.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_reification.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_schema_init.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_schema_procedures.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_shortest_path.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_snapshot.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_sql_splitter.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_sql_table_bridge.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_subgraph.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_subquery_call.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_temporal_cypher.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_temporal_edges.py +0 -0
- {iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/tests/unit/test_unified_edge_store.py +0 -0
- {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
|
+
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.
|
|
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"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical/__init__.py
RENAMED
|
File without changes
|
{iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical/loaders.py
RENAMED
|
File without changes
|
{iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical/resolver.py
RENAMED
|
File without changes
|
|
File without changes
|
{iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/domains/biomedical_legacy/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iris_vector_graph-1.63.3 → iris_vector_graph-1.63.4}/examples/hybrid_vector_graph_query.cypher
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|