iris-vector-graph 1.63.2__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.2 → iris_vector_graph-1.63.4}/PKG-INFO +49 -1
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/README.md +48 -0
- iris_vector_graph-1.63.4/iris_src/src/Graph/KG/NKGAccel.cls +560 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Traversal.cls +21 -3
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/__init__.py +1 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/engine.py +143 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/security.py +4 -1
- iris_vector_graph-1.63.4/iris_vector_graph/status.py +136 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/pyproject.toml +1 -1
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_e2e_new_features.py +81 -0
- iris_vector_graph-1.63.4/tests/unit/test_engine_status.py +192 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/.gitignore +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/LICENSE +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/demo_biomedical.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/demo_fraud_detection.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/demo_fraud_detection_sql.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/demo_utils.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/demo_working_system.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/domains/__init__.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/domains/biomedical/__init__.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/domains/biomedical/loaders.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/domains/biomedical/resolver.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/domains/biomedical/types.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/domains/biomedical_legacy/__init__.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/domains/biomedical_legacy/biomedical_engine.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/domains/biomedical_legacy/biomedical_schema.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/domains/biomedical_legacy/legacy_wrapper.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/domains/fraud/__init__.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/domains/fraud/loaders.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/domains/fraud/resolver.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/domains/fraud/types.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/graphQL.http +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/hybrid_vector_graph_query.cypher +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/examples/rest.http +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Algorithms.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/ArnoAccel.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/BM25Index.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/BenchFormat.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/BenchSeeder.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Benchmark.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Edge.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/EdgeScan.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/GraphIndex.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/IVFIndex.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Loader.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/MCPService.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/MCPToolSet.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/MCPTools.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Meta.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/PLAIDSearch.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/PageRank.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/PyOps.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Service.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Snapshot.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/Subgraph.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/TemporalIndex.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/TestEdge.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/Graph/KG/VecIndex.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/PageRankEmbedded.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/User.Exec.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_src/src/iris/vector/graph/GraphOperators.cls +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/bolt_server.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/bulk_loader.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/capabilities.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/__init__.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/algorithms/__init__.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/algorithms/paths.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/ast.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/lexer.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/parser.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher/translator.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/cypher_api.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/embedded.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/fusion.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/__init__.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/constants.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/engine.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/pooling.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/resolvers.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/gql/schema.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/models.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/operators.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/py.typed +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/schema.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/text_search.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/utils.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/iris_vector_graph/vector_utils.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/sql/fhir_bridges.sql +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/sql/fraud_sample_data.sql +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/sql/globals_schema.sql +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/sql/graph_path_globals.sql +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/sql/graph_walk_tvf.sql +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/sql/migrations/000_base_schema_iris.sql +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/sql/migrations/001_add_nodepk_table.sql +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/sql/migrations/001_rollback_nodepk.sql +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/sql/migrations/002_add_fk_constraints.sql +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/sql/operators.sql +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/sql/operators_fixed.sql +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/sql/procedures/kg_PageRank.sql +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/sql/rdf_reifications.sql +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/sql/schema.sql +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/TESTING.md +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/benchmark_parser.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/benchmarks/benchmark_neo4j.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/benchmarks/bfs_benchmark.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/benchmarks/establish_baseline.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/benchmarks/graph_gen.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/benchmarks/iris_baseline_run.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/benchmarks/iris_os_run.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/benchmarks/load_neo4j.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/benchmarks/synthetic_baseline.csv +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/conftest.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/contract/__init__.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/contract/test_cypher_api.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/contract/test_cypher_api_errors.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/contract/test_graphql_queries.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/contract/test_graphql_schema.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/contract/test_ppr_api.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/curl_suite.sh +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/__init__.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/conftest.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_biomedical_demo.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_biomedical_ui.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_cypher_coerce_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_cypher_sprints_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_cypher_vector_search.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_fhir_bridges_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_fraud_demo.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_fraud_ui.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_autogen_startup.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_cypher_passthrough.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_node_queries.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_semantic_search.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_gql_traversal.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_graph_kernels_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_hla_kg_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_multi_query_engine_platform.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_named_paths_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_nkg_index_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_operator_wiring_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_plaid_search_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_ppr_cls_fast_path.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_ppr_guided_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_procedure_installation.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_reification_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_schema_procedures_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_subgraph_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_subquery_call_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/e2e/test_vecindex_e2e.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/__init__.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/conftest.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/gql/__init__.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/gql/test_graphql_mutations.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/gql/test_graphql_nested_queries.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/gql/test_graphql_queries.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/gql/test_graphql_vector_search.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_bidirectional_ppr.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_cls_layer.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_advanced.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_enhancements.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_multi_type.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_rd.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_rel_vars.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_single_type.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_untyped.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_cypher_vector_search.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_embeddings_api.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_fastapi_graphql.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_fhir_bridges_integration.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_named_paths_integration.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_advanced_benchmarks.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_constraints.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_graph_analytics.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_migration.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_performance.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_nodepk_production_scale.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_objectscript_classes.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_pagerank_sql_optimization.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_reification_integration.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_schema_migration.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_stored_procedure_install.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/integration/test_subquery_call_integration.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/performance/conftest.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/performance/scale_benchmark.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/performance/test_ppr_stress.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/performance/test_stress_v1_5.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/python/run_all_tests.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/python/test_iris_rest_api.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/python/test_networkx_loader.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/python/test_performance_benchmarks.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/python/test_pyops_vector_conversion.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/python/test_python_operators.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/python/test_python_sdk.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/python/test_schema_validation.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/python/test_sql_queries.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/python/test_vector_functions.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/cypher/__init__.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/cypher/test_lexer.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/cypher/test_lexer_advanced.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/cypher/test_parser.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/cypher/test_parser_advanced.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_batch_mutations.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_bfs_arno.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_bm25_index.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_bolt_server.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_cls_deployment.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_benchmark.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_benchmark_scale.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_case_when.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_functions.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_parser.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_posos_bugs.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_procedures.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_translator.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_union_exists.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_var_length.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_cypher_vector_search.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_edge_embeddings.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_edgeprop_ndjson.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_embedded.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_engine_dimension_fix.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_engine_embeddings.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_fhir_bridges.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_get_nodes.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_graph_kernels.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_graphql_dataloader.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_ingest_formats.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_ivf_index.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_named_graphs.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_named_paths.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_operators_wiring.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_plaid_search.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_ppr_guided_subgraph.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_reification.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_schema_init.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_schema_procedures.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_shortest_path.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_snapshot.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_sql_splitter.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_sql_table_bridge.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_subgraph.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_subquery_call.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_temporal_cypher.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_temporal_edges.py +0 -0
- {iris_vector_graph-1.63.2 → iris_vector_graph-1.63.4}/tests/unit/test_unified_edge_store.py +0 -0
- {iris_vector_graph-1.63.2 → 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
|
|
@@ -407,6 +407,43 @@ Returns `[{"s": str, "p": str, "o_id": str, "score": float}, ...]` sorted descen
|
|
|
407
407
|
|
|
408
408
|
---
|
|
409
409
|
|
|
410
|
+
## Engine Status
|
|
411
|
+
|
|
412
|
+
Call `engine.status()` at any time to get a structured snapshot of all components. This is the canonical answer to "why is query X returning nothing?"
|
|
413
|
+
|
|
414
|
+
```python
|
|
415
|
+
s = engine.status()
|
|
416
|
+
print(s.report())
|
|
417
|
+
|
|
418
|
+
# Readiness gates — use before running query types
|
|
419
|
+
s.ready_for_bfs # var-length / undirected / shortestPath — needs ^KG + edges
|
|
420
|
+
s.ready_for_vector_search # needs node embeddings
|
|
421
|
+
s.ready_for_edge_search # needs edge embeddings
|
|
422
|
+
s.ready_for_full_text # needs BM25 index
|
|
423
|
+
|
|
424
|
+
# Example: rebuild ^KG if stale
|
|
425
|
+
if not s.ready_for_bfs and s.tables.edges > 0:
|
|
426
|
+
engine.build_graph_globals() # calls BuildKG()
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
Sample output:
|
|
430
|
+
```
|
|
431
|
+
IVG Engine Status
|
|
432
|
+
══════════════════════════════════════════
|
|
433
|
+
SQL Tables (probe: 23ms)
|
|
434
|
+
nodes 10,000
|
|
435
|
+
edges 50,000
|
|
436
|
+
...
|
|
437
|
+
Adjacency Globals
|
|
438
|
+
✓ ^KG (50,000 source nodes indexed)
|
|
439
|
+
✗ ^NKG (Arno integer index)
|
|
440
|
+
...
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
`status()` is explicit-call only — never run automatically at init or before queries. Cost ~50ms.
|
|
444
|
+
|
|
445
|
+
---
|
|
446
|
+
|
|
410
447
|
## PLAID Multi-Vector Search
|
|
411
448
|
|
|
412
449
|
```python
|
|
@@ -655,6 +692,17 @@ anchors = engine.get_kg_anchors(icd_codes=["J18.0", "E11.9"])
|
|
|
655
692
|
|
|
656
693
|
## Changelog
|
|
657
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
|
+
|
|
699
|
+
### v1.63.3 (2026-04-26)
|
|
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)
|
|
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)
|
|
702
|
+
- fix: `kg_IVFMeta`, `kg_BM25Meta`, `kg_PlaidMeta` added to security allowlist
|
|
703
|
+
- `EngineStatus` exported from top-level `iris_vector_graph`
|
|
704
|
+
|
|
705
|
+
|
|
658
706
|
### v1.63.2 (2026-04-25)
|
|
659
707
|
- fix: `MATCH (a)-[r*1..N]-(b)` undirected BFS now traverses `^KG("in",...)` for inbound edges (was outbound-only)
|
|
660
708
|
- fix: `MATCH (a)<-[r*1..N]-(b)` inbound-only BFS now works
|
|
@@ -335,6 +335,43 @@ Returns `[{"s": str, "p": str, "o_id": str, "score": float}, ...]` sorted descen
|
|
|
335
335
|
|
|
336
336
|
---
|
|
337
337
|
|
|
338
|
+
## Engine Status
|
|
339
|
+
|
|
340
|
+
Call `engine.status()` at any time to get a structured snapshot of all components. This is the canonical answer to "why is query X returning nothing?"
|
|
341
|
+
|
|
342
|
+
```python
|
|
343
|
+
s = engine.status()
|
|
344
|
+
print(s.report())
|
|
345
|
+
|
|
346
|
+
# Readiness gates — use before running query types
|
|
347
|
+
s.ready_for_bfs # var-length / undirected / shortestPath — needs ^KG + edges
|
|
348
|
+
s.ready_for_vector_search # needs node embeddings
|
|
349
|
+
s.ready_for_edge_search # needs edge embeddings
|
|
350
|
+
s.ready_for_full_text # needs BM25 index
|
|
351
|
+
|
|
352
|
+
# Example: rebuild ^KG if stale
|
|
353
|
+
if not s.ready_for_bfs and s.tables.edges > 0:
|
|
354
|
+
engine.build_graph_globals() # calls BuildKG()
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
Sample output:
|
|
358
|
+
```
|
|
359
|
+
IVG Engine Status
|
|
360
|
+
══════════════════════════════════════════
|
|
361
|
+
SQL Tables (probe: 23ms)
|
|
362
|
+
nodes 10,000
|
|
363
|
+
edges 50,000
|
|
364
|
+
...
|
|
365
|
+
Adjacency Globals
|
|
366
|
+
✓ ^KG (50,000 source nodes indexed)
|
|
367
|
+
✗ ^NKG (Arno integer index)
|
|
368
|
+
...
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
`status()` is explicit-call only — never run automatically at init or before queries. Cost ~50ms.
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
338
375
|
## PLAID Multi-Vector Search
|
|
339
376
|
|
|
340
377
|
```python
|
|
@@ -583,6 +620,17 @@ anchors = engine.get_kg_anchors(icd_codes=["J18.0", "E11.9"])
|
|
|
583
620
|
|
|
584
621
|
## Changelog
|
|
585
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
|
+
|
|
627
|
+
### v1.63.3 (2026-04-26)
|
|
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)
|
|
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)
|
|
630
|
+
- fix: `kg_IVFMeta`, `kg_BM25Meta`, `kg_PlaidMeta` added to security allowlist
|
|
631
|
+
- `EngineStatus` exported from top-level `iris_vector_graph`
|
|
632
|
+
|
|
633
|
+
|
|
586
634
|
### v1.63.2 (2026-04-25)
|
|
587
635
|
- fix: `MATCH (a)-[r*1..N]-(b)` undirected BFS now traverses `^KG("in",...)` for inbound edges (was outbound-only)
|
|
588
636
|
- fix: `MATCH (a)<-[r*1..N]-(b)` inbound-only BFS now works
|
|
@@ -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
|
+
}
|