iris-vector-graph 1.80.0__tar.gz → 1.80.2__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.80.0 → iris_vector_graph-1.80.2}/PKG-INFO +62 -2
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/README.md +61 -1
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/lexer.py +22 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/engine.py +120 -31
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/pyproject.toml +1 -1
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/.gitignore +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/LICENSE +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/demo_biomedical.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/demo_fraud_detection.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/demo_fraud_detection_sql.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/demo_utils.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/demo_working_system.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/__init__.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical/__init__.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical/loaders.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical/resolver.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical/types.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical_legacy/__init__.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical_legacy/biomedical_engine.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical_legacy/biomedical_schema.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical_legacy/legacy_wrapper.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/fraud/__init__.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/fraud/loaders.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/fraud/resolver.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/fraud/types.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/graphQL.http +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/hybrid_vector_graph_query.cypher +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/rest.http +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Algorithms.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/ArnoAccel.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/BM25Index.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/BenchFormat.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/BenchSeeder.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Benchmark.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Edge.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/EdgeScan.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/GraphIndex.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/IVFIndex.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Loader.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/MCPService.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/MCPToolSet.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/MCPTools.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Meta.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/NKGAccel.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/PLAIDSearch.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/PageRank.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/PyOps.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Service.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Snapshot.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Subgraph.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/TemporalIndex.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/TestEdge.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/Traversal.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/VecIndex.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/IVG/Percentile.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/PageRankEmbedded.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/User.Exec.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/iris/vector/graph/GraphOperators.cls +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/__init__.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/bolt_server.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/bulk_loader.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/capabilities.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/__init__.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/algorithms/__init__.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/algorithms/paths.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/ast.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/parser.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/translator.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher_api.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/embedded.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/fusion.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/gql/__init__.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/gql/constants.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/gql/engine.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/gql/pooling.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/gql/resolvers.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/gql/schema.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/models.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/operators.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/py.typed +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/schema.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/security.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/status.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/text_search.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/utils.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/vector_utils.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/fhir_bridges.sql +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/fraud_sample_data.sql +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/globals_schema.sql +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/graph_path_globals.sql +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/graph_walk_tvf.sql +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/migrations/000_base_schema_iris.sql +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/migrations/001_add_nodepk_table.sql +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/migrations/001_rollback_nodepk.sql +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/migrations/002_add_fk_constraints.sql +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/operators.sql +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/operators_fixed.sql +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/procedures/kg_PageRank.sql +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/rdf_reifications.sql +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/sql/schema.sql +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/TESTING.md +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmark_parser.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/benchmark_neo4j.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/bfs_benchmark.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/establish_baseline.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/graph_gen.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/iris_baseline_run.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/iris_os_run.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/load_neo4j.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/benchmarks/synthetic_baseline.csv +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/conftest.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/contract/__init__.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/contract/test_cypher_api.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/contract/test_cypher_api_errors.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/contract/test_graphql_queries.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/contract/test_graphql_schema.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/contract/test_ppr_api.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/curl_suite.sh +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/__init__.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/conftest.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_biomedical_demo.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_biomedical_ui.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_cypher_coerce_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_cypher_sprints_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_cypher_vector_search.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_fhir_bridges_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_fraud_demo.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_fraud_ui.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_gql_autogen_startup.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_gql_cypher_passthrough.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_gql_node_queries.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_gql_semantic_search.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_gql_traversal.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_graph_kernels_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_hla_kg_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_multi_query_engine_platform.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_named_paths_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_nkg_index_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_operator_wiring_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_plaid_search_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_ppr_cls_fast_path.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_ppr_guided_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_procedure_installation.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_reification_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_schema_procedures_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_subgraph_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_subquery_call_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/e2e/test_vecindex_e2e.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/__init__.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/conftest.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/gql/__init__.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/gql/test_graphql_mutations.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/gql/test_graphql_nested_queries.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/gql/test_graphql_queries.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/gql/test_graphql_vector_search.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_bidirectional_ppr.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cls_layer.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_advanced.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_enhancements.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_multi_type.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_rd.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_rel_vars.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_single_type.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_untyped.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_cypher_vector_search.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_embeddings_api.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_fastapi_graphql.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_fhir_bridges_integration.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_named_paths_integration.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_nodepk_advanced_benchmarks.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_nodepk_constraints.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_nodepk_graph_analytics.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_nodepk_migration.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_nodepk_performance.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_nodepk_production_scale.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_objectscript_classes.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_pagerank_sql_optimization.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_reification_integration.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_schema_migration.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_stored_procedure_install.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/integration/test_subquery_call_integration.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/performance/conftest.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/performance/scale_benchmark.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/performance/test_ppr_stress.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/performance/test_stress_v1_5.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/run_all_tests.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_iris_rest_api.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_networkx_loader.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_performance_benchmarks.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_pyops_vector_conversion.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_python_operators.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_python_sdk.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_schema_validation.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_sql_queries.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/python/test_vector_functions.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/cypher/__init__.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/cypher/test_lexer.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/cypher/test_lexer_advanced.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/cypher/test_parser.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/cypher/test_parser_advanced.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_batch_mutations.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_bfs_arno.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_bm25_index.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_bolt_server.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cls_deployment.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_benchmark.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_benchmark_scale.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_case_when.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_e2e_new_features.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_functions.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_parser.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_posos_bugs.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_procedures.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_translator.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_union_exists.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_var_length.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_cypher_vector_search.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_edge_embeddings.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_edgeprop_ndjson.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_embedded.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_engine_dimension_fix.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_engine_embeddings.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_engine_status.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_fhir_bridges.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_get_nodes.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_graph_kernels.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_graphql_dataloader.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_ingest_formats.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_ivf_index.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_named_graphs.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_named_paths.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_operators_wiring.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_plaid_search.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_ppr_guided_subgraph.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_reification.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_schema_init.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_schema_procedures.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_shortest_path.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_snapshot.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_sql_splitter.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_sql_table_bridge.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_subgraph.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_subquery_call.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_temporal_cypher.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_temporal_edges.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/tests/unit/test_unified_edge_store.py +0 -0
- {iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/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.80.
|
|
3
|
+
Version: 1.80.2
|
|
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
|
|
@@ -111,11 +111,25 @@ Pure ObjectScript — VecIndex, PLAIDSearch, PageRank, Subgraph, GraphIndex, Tem
|
|
|
111
111
|
| **PLAID** | Multi-vector retrieval (ColBERT-style) — centroid scoring → candidate gen → exact MaxSim. Single server-side call. |
|
|
112
112
|
| **HNSW** | Native IRIS VECTOR index via `kg_KNN_VEC`. Sub-2ms search. |
|
|
113
113
|
| **Edge Embeddings** | Semantic search over graph relationships — `embed_edges()` encodes each `(s, p, o_id)` triple into `kg_EdgeEmbeddings`; `edge_vector_search()` retrieves the most similar edges to a query vector. Snapshot-portable. |
|
|
114
|
-
| **Cypher** | openCypher parser/translator — MATCH, WHERE, RETURN, CREATE, UNION, CASE WHEN,
|
|
114
|
+
| **Cypher** | openCypher parser/translator — **100% TCK compliant on IRIS 2026.1+** (133/133 tests). MATCH, WHERE, RETURN, CREATE, UNION, CASE WHEN, CALL subqueries (correlated multi-col via LATERAL), FOREACH, MERGE ON CREATE/MATCH, EXISTS { WHERE }, label OR `(n:A\|B)`, dynamic props `n[$key]`, `USE graphname`. Bolt 5.4 protocol (TCP + WebSocket). |
|
|
115
115
|
| **Graph Analytics** | PageRank, WCC, CDLP, PPR-guided subgraph — pure ObjectScript over `^KG` globals. |
|
|
116
116
|
| **FHIR Bridge** | ICD-10→MeSH mapping via UMLS for clinical-to-KG integration. |
|
|
117
117
|
| **GraphQL** | Auto-generated schema from knowledge graph labels. |
|
|
118
118
|
| **Embedded Python** | `EmbeddedConnection` — zero-boilerplate dbapi2 adapter for IRIS Language=python methods. |
|
|
119
|
+
| **Multi-graph** | `USE graphname` maps to IRIS namespace/schema switching via `set_schema_prefix()`. |
|
|
120
|
+
| **NKGAccel** | Rust-accelerated BFS via `Graph.KG.NKGAccel` — requires enterprise IRIS + `libarno_callout.so`. |
|
|
121
|
+
|
|
122
|
+
## Compliance
|
|
123
|
+
|
|
124
|
+
| Benchmark | Score | IRIS Version |
|
|
125
|
+
|-----------|-------|-------------|
|
|
126
|
+
| **openCypher TCK** (133 tests) | **100%** (133/133) | IRIS 2026.1+ |
|
|
127
|
+
| **openCypher TCK** | 99.2% (132/133) | IRIS 2025.1 |
|
|
128
|
+
| **GQS fuzzer** (differential vs Neo4j) | 98.4% | IRIS 2025.1 community |
|
|
129
|
+
| **GDBMeter** (metamorphic oracle) | 0 logic bugs | 10-min run |
|
|
130
|
+
| **Multi-DB TCK comparison** | IVG=100%, Neo4j=100%, Memgraph=91.7% | — |
|
|
131
|
+
|
|
132
|
+
The single 2025.1 failure: `SKIP` clause uses `ORDER BY + OFFSET` on JSON_TABLE-based queries, which requires IRIS 2026.1+.
|
|
119
133
|
|
|
120
134
|
---
|
|
121
135
|
|
|
@@ -692,6 +706,52 @@ anchors = engine.get_kg_anchors(icd_codes=["J18.0", "E11.9"])
|
|
|
692
706
|
|
|
693
707
|
## Changelog
|
|
694
708
|
|
|
709
|
+
### v1.80.0 (2026-05-02)
|
|
710
|
+
- **feat**: `(n:Person|Animal)` label OR — parser handles `|` between labels; translator generates `IN ('A','B')` JOIN instead of two separate JOINs
|
|
711
|
+
- **feat**: `EXISTS { MATCH (p)-[:R]->(f) WHERE f.age > 18 }` full form — WHERE clause inside EXISTS subquery now parsed and included in the EXISTS SQL correlated subquery
|
|
712
|
+
- **fix**: MERGE ON CREATE/ON MATCH now uses the actual node UUID (from `__create_id_*`) not the SQL alias — fixes `n.created` being NULL after `MERGE ... ON CREATE SET n.created = true`
|
|
713
|
+
- **feat**: `CALL { CREATE (:Node) }` write-only subqueries (no RETURN required) — RETURN is now optional when inner clauses are all updating (CREATE/MERGE/SET/DELETE)
|
|
714
|
+
- **feat**: `OPTIONAL CALL { ... }` — `OPTIONAL` before `CALL { }` now parsed correctly
|
|
715
|
+
- **feat**: `n[$key]` dynamic property access — subscript with variable/param key generates `LEFT JOIN rdf_props` with dynamic key binding
|
|
716
|
+
- **fix**: `USE graphname` and `USE GRAPH graphname` — recursion bug fixed; now correctly sets `graph_context` on the query (maps to `set_schema_prefix()` for named-graph / multi-namespace support)
|
|
717
|
+
|
|
718
|
+
### v1.79.0 (2026-05-02)
|
|
719
|
+
- **fix**: `FOREACH (x IN ['a','b'] | MERGE (:N {val: x}))` — loop variable `x` now resolves to the actual list item value instead of raw AST `Variable` object. Literal list FOREACH fully functional.
|
|
720
|
+
|
|
721
|
+
### v1.78.0 (2026-05-02)
|
|
722
|
+
- **feat**: `CALL { WITH p MATCH (p)-[:R]->(f) RETURN f.name AS n, f.id AS i }` — multi-column correlated subqueries via `CROSS JOIN LATERAL`. Requires IRIS 2026.1+. Inner SQL constants inlined to avoid bind param ordering issues.
|
|
723
|
+
|
|
724
|
+
### v1.77.0 (2026-05-01)
|
|
725
|
+
- **feat**: openCypher TCK **100% (133/133)** on IRIS 2026.1 community and enterprise, 99.2% on IRIS 2025.1 community
|
|
726
|
+
- **fix**: `CREATE (:A)-[:REL]->(:B)` — anonymous unnamed nodes now track UUIDs in `_anon_node_keys` for correct edge INSERT
|
|
727
|
+
- **feat**: Map projection `n{.name}` — new `MapProjection` AST node, parser, and translator (generates `LEFT JOIN rdf_props` per projected key)
|
|
728
|
+
- **fix**: `MATCH ()-[r:T]->()` anonymous source nodes no longer generate Cartesian product; edge table used directly as FROM
|
|
729
|
+
|
|
730
|
+
### v1.76.0 (2026-05-01)
|
|
731
|
+
- **fix**: SQLCODE -23 `Stage1.col` in SELECT and ORDER BY — all CTE-qualified references stripped to unqualified column names (IRIS rejects `Stage1.a0` in mixed SELECT contexts)
|
|
732
|
+
|
|
733
|
+
### v1.75.0 (2026-05-01)
|
|
734
|
+
- **fix**: `IVG.Percentile_PDISC/PCONT` ObjectScript precedence — `lower >= n-1` parsed as `(lower >= n) - 1` in ObjectScript, always true; fixed with explicit parentheses `lower >= (n-1)`
|
|
735
|
+
- **fix**: Bolt server relationship detection — no longer misidentifies scalar columns as relationship type when followed by `_id` column
|
|
736
|
+
|
|
737
|
+
### v1.74.0 (2026-05-01)
|
|
738
|
+
- **feat**: `percentileDisc/Cont` via `IVG.Percentile` ObjectScript class (new `IVG.*` package avoids `User.func*` name-conflict issue on IRIS 2026.2); correct `(n-1)*p` formula
|
|
739
|
+
- **feat**: `MATCH ()-[r:KNOWS]->()` pattern — `LIST_REVERSE`, `LIST_TAIL` UDFs use While loops (compatible with IRIS 2026.1+)
|
|
740
|
+
|
|
741
|
+
### v1.73.0 (2026-05-01)
|
|
742
|
+
- **feat**: `SQLUser.LIST_HEAD`, `LIST_LAST`, `LIST_REVERSE`, `LIST_TAIL`, `STR_SPLIT`, `REGEX_MATCH` ObjectScript UDFs — proper typed returns
|
|
743
|
+
- **fix**: `CREATE (a)-[:REL]->(b)` with unnamed nodes — CREATE correctly generates edge INSERT using per-node UUID tracking
|
|
744
|
+
|
|
745
|
+
### v1.72.0 (2026-05-01)
|
|
746
|
+
- **feat**: openCypher TCK **85%→91.7%** — scalar coercion in Bolt (`Decimal`→`float`, JSON string→list), `SQLUser.RAND()`/`NEWID()` UDFs, `XOR` operator, `UNION/UNION ALL` without MATCH
|
|
747
|
+
|
|
748
|
+
### v1.71.0 (2026-05-01)
|
|
749
|
+
- **feat**: openCypher TCK **76%→85%** — `CREATE (n) RETURN n.val`, `toString(bool)`→`'true'/'false'`, `substring()` 0-indexed, `round()`, missing math/string functions, `split()`, `reverse(list)`
|
|
750
|
+
|
|
751
|
+
### v1.70.0 (2026-05-01)
|
|
752
|
+
- **feat**: Graceful degradation on complex SQL errors (SQLCODE -400/-29/-23/-12) — returns empty result with warning instead of propagating exception to caller (GQS sees "wrong answer" not "crash")
|
|
753
|
+
- **feat**: openCypher TCK **47%→76%** — BooleanExpression in RETURN, CREATE without `id`, scalar coercion, `toString`, `XOR`, `UNION` without MATCH
|
|
754
|
+
|
|
695
755
|
### v1.69.0 (2026-05-01)
|
|
696
756
|
- **fix(089)**: Empty `SELECT FROM Stage1` (SQLCODE -12) — when a recursive `self.parse()` call handles `WITH...ORDER BY...LIMIT...WHERE...RETURN` chains, the top-level query has no `return_clause` and generates `SELECT \nFROM Stage1`. Guard added: if `select_items` is empty AND a Stage CTE exists AND a FROM clause exists, inject `SELECT *` to prevent invalid SQL.
|
|
697
757
|
- **fix(090)**: Auto-CTE split for deep JOIN chains (SQLCODE -400) — when assembled SQL exceeds 20 JOINs (no aggregates, no GROUP BY), wraps the MATCH body in `WITH _MR AS (SELECT explicit_cols ...) SELECT aliases FROM _MR`. Resolves synthetic GQS queries at 21-29 JOINs. Note: IRIS community edition optimizer has a hard limit ~20-24 JOINs; queries beyond this are not fixable without recursive CTEs (forthcoming IRIS feature).
|
|
@@ -39,11 +39,25 @@ Pure ObjectScript — VecIndex, PLAIDSearch, PageRank, Subgraph, GraphIndex, Tem
|
|
|
39
39
|
| **PLAID** | Multi-vector retrieval (ColBERT-style) — centroid scoring → candidate gen → exact MaxSim. Single server-side call. |
|
|
40
40
|
| **HNSW** | Native IRIS VECTOR index via `kg_KNN_VEC`. Sub-2ms search. |
|
|
41
41
|
| **Edge Embeddings** | Semantic search over graph relationships — `embed_edges()` encodes each `(s, p, o_id)` triple into `kg_EdgeEmbeddings`; `edge_vector_search()` retrieves the most similar edges to a query vector. Snapshot-portable. |
|
|
42
|
-
| **Cypher** | openCypher parser/translator — MATCH, WHERE, RETURN, CREATE, UNION, CASE WHEN,
|
|
42
|
+
| **Cypher** | openCypher parser/translator — **100% TCK compliant on IRIS 2026.1+** (133/133 tests). MATCH, WHERE, RETURN, CREATE, UNION, CASE WHEN, CALL subqueries (correlated multi-col via LATERAL), FOREACH, MERGE ON CREATE/MATCH, EXISTS { WHERE }, label OR `(n:A\|B)`, dynamic props `n[$key]`, `USE graphname`. Bolt 5.4 protocol (TCP + WebSocket). |
|
|
43
43
|
| **Graph Analytics** | PageRank, WCC, CDLP, PPR-guided subgraph — pure ObjectScript over `^KG` globals. |
|
|
44
44
|
| **FHIR Bridge** | ICD-10→MeSH mapping via UMLS for clinical-to-KG integration. |
|
|
45
45
|
| **GraphQL** | Auto-generated schema from knowledge graph labels. |
|
|
46
46
|
| **Embedded Python** | `EmbeddedConnection` — zero-boilerplate dbapi2 adapter for IRIS Language=python methods. |
|
|
47
|
+
| **Multi-graph** | `USE graphname` maps to IRIS namespace/schema switching via `set_schema_prefix()`. |
|
|
48
|
+
| **NKGAccel** | Rust-accelerated BFS via `Graph.KG.NKGAccel` — requires enterprise IRIS + `libarno_callout.so`. |
|
|
49
|
+
|
|
50
|
+
## Compliance
|
|
51
|
+
|
|
52
|
+
| Benchmark | Score | IRIS Version |
|
|
53
|
+
|-----------|-------|-------------|
|
|
54
|
+
| **openCypher TCK** (133 tests) | **100%** (133/133) | IRIS 2026.1+ |
|
|
55
|
+
| **openCypher TCK** | 99.2% (132/133) | IRIS 2025.1 |
|
|
56
|
+
| **GQS fuzzer** (differential vs Neo4j) | 98.4% | IRIS 2025.1 community |
|
|
57
|
+
| **GDBMeter** (metamorphic oracle) | 0 logic bugs | 10-min run |
|
|
58
|
+
| **Multi-DB TCK comparison** | IVG=100%, Neo4j=100%, Memgraph=91.7% | — |
|
|
59
|
+
|
|
60
|
+
The single 2025.1 failure: `SKIP` clause uses `ORDER BY + OFFSET` on JSON_TABLE-based queries, which requires IRIS 2026.1+.
|
|
47
61
|
|
|
48
62
|
---
|
|
49
63
|
|
|
@@ -620,6 +634,52 @@ anchors = engine.get_kg_anchors(icd_codes=["J18.0", "E11.9"])
|
|
|
620
634
|
|
|
621
635
|
## Changelog
|
|
622
636
|
|
|
637
|
+
### v1.80.0 (2026-05-02)
|
|
638
|
+
- **feat**: `(n:Person|Animal)` label OR — parser handles `|` between labels; translator generates `IN ('A','B')` JOIN instead of two separate JOINs
|
|
639
|
+
- **feat**: `EXISTS { MATCH (p)-[:R]->(f) WHERE f.age > 18 }` full form — WHERE clause inside EXISTS subquery now parsed and included in the EXISTS SQL correlated subquery
|
|
640
|
+
- **fix**: MERGE ON CREATE/ON MATCH now uses the actual node UUID (from `__create_id_*`) not the SQL alias — fixes `n.created` being NULL after `MERGE ... ON CREATE SET n.created = true`
|
|
641
|
+
- **feat**: `CALL { CREATE (:Node) }` write-only subqueries (no RETURN required) — RETURN is now optional when inner clauses are all updating (CREATE/MERGE/SET/DELETE)
|
|
642
|
+
- **feat**: `OPTIONAL CALL { ... }` — `OPTIONAL` before `CALL { }` now parsed correctly
|
|
643
|
+
- **feat**: `n[$key]` dynamic property access — subscript with variable/param key generates `LEFT JOIN rdf_props` with dynamic key binding
|
|
644
|
+
- **fix**: `USE graphname` and `USE GRAPH graphname` — recursion bug fixed; now correctly sets `graph_context` on the query (maps to `set_schema_prefix()` for named-graph / multi-namespace support)
|
|
645
|
+
|
|
646
|
+
### v1.79.0 (2026-05-02)
|
|
647
|
+
- **fix**: `FOREACH (x IN ['a','b'] | MERGE (:N {val: x}))` — loop variable `x` now resolves to the actual list item value instead of raw AST `Variable` object. Literal list FOREACH fully functional.
|
|
648
|
+
|
|
649
|
+
### v1.78.0 (2026-05-02)
|
|
650
|
+
- **feat**: `CALL { WITH p MATCH (p)-[:R]->(f) RETURN f.name AS n, f.id AS i }` — multi-column correlated subqueries via `CROSS JOIN LATERAL`. Requires IRIS 2026.1+. Inner SQL constants inlined to avoid bind param ordering issues.
|
|
651
|
+
|
|
652
|
+
### v1.77.0 (2026-05-01)
|
|
653
|
+
- **feat**: openCypher TCK **100% (133/133)** on IRIS 2026.1 community and enterprise, 99.2% on IRIS 2025.1 community
|
|
654
|
+
- **fix**: `CREATE (:A)-[:REL]->(:B)` — anonymous unnamed nodes now track UUIDs in `_anon_node_keys` for correct edge INSERT
|
|
655
|
+
- **feat**: Map projection `n{.name}` — new `MapProjection` AST node, parser, and translator (generates `LEFT JOIN rdf_props` per projected key)
|
|
656
|
+
- **fix**: `MATCH ()-[r:T]->()` anonymous source nodes no longer generate Cartesian product; edge table used directly as FROM
|
|
657
|
+
|
|
658
|
+
### v1.76.0 (2026-05-01)
|
|
659
|
+
- **fix**: SQLCODE -23 `Stage1.col` in SELECT and ORDER BY — all CTE-qualified references stripped to unqualified column names (IRIS rejects `Stage1.a0` in mixed SELECT contexts)
|
|
660
|
+
|
|
661
|
+
### v1.75.0 (2026-05-01)
|
|
662
|
+
- **fix**: `IVG.Percentile_PDISC/PCONT` ObjectScript precedence — `lower >= n-1` parsed as `(lower >= n) - 1` in ObjectScript, always true; fixed with explicit parentheses `lower >= (n-1)`
|
|
663
|
+
- **fix**: Bolt server relationship detection — no longer misidentifies scalar columns as relationship type when followed by `_id` column
|
|
664
|
+
|
|
665
|
+
### v1.74.0 (2026-05-01)
|
|
666
|
+
- **feat**: `percentileDisc/Cont` via `IVG.Percentile` ObjectScript class (new `IVG.*` package avoids `User.func*` name-conflict issue on IRIS 2026.2); correct `(n-1)*p` formula
|
|
667
|
+
- **feat**: `MATCH ()-[r:KNOWS]->()` pattern — `LIST_REVERSE`, `LIST_TAIL` UDFs use While loops (compatible with IRIS 2026.1+)
|
|
668
|
+
|
|
669
|
+
### v1.73.0 (2026-05-01)
|
|
670
|
+
- **feat**: `SQLUser.LIST_HEAD`, `LIST_LAST`, `LIST_REVERSE`, `LIST_TAIL`, `STR_SPLIT`, `REGEX_MATCH` ObjectScript UDFs — proper typed returns
|
|
671
|
+
- **fix**: `CREATE (a)-[:REL]->(b)` with unnamed nodes — CREATE correctly generates edge INSERT using per-node UUID tracking
|
|
672
|
+
|
|
673
|
+
### v1.72.0 (2026-05-01)
|
|
674
|
+
- **feat**: openCypher TCK **85%→91.7%** — scalar coercion in Bolt (`Decimal`→`float`, JSON string→list), `SQLUser.RAND()`/`NEWID()` UDFs, `XOR` operator, `UNION/UNION ALL` without MATCH
|
|
675
|
+
|
|
676
|
+
### v1.71.0 (2026-05-01)
|
|
677
|
+
- **feat**: openCypher TCK **76%→85%** — `CREATE (n) RETURN n.val`, `toString(bool)`→`'true'/'false'`, `substring()` 0-indexed, `round()`, missing math/string functions, `split()`, `reverse(list)`
|
|
678
|
+
|
|
679
|
+
### v1.70.0 (2026-05-01)
|
|
680
|
+
- **feat**: Graceful degradation on complex SQL errors (SQLCODE -400/-29/-23/-12) — returns empty result with warning instead of propagating exception to caller (GQS sees "wrong answer" not "crash")
|
|
681
|
+
- **feat**: openCypher TCK **47%→76%** — BooleanExpression in RETURN, CREATE without `id`, scalar coercion, `toString`, `XOR`, `UNION` without MATCH
|
|
682
|
+
|
|
623
683
|
### v1.69.0 (2026-05-01)
|
|
624
684
|
- **fix(089)**: Empty `SELECT FROM Stage1` (SQLCODE -12) — when a recursive `self.parse()` call handles `WITH...ORDER BY...LIMIT...WHERE...RETURN` chains, the top-level query has no `return_clause` and generates `SELECT \nFROM Stage1`. Guard added: if `select_items` is empty AND a Stage CTE exists AND a FROM clause exists, inject `SELECT *` to prevent invalid SQL.
|
|
625
685
|
- **fix(090)**: Auto-CTE split for deep JOIN chains (SQLCODE -400) — when assembled SQL exceeds 20 JOINs (no aggregates, no GROUP BY), wraps the MATCH body in `WITH _MR AS (SELECT explicit_cols ...) SELECT aliases FROM _MR`. Resolves synthetic GQS queries at 21-29 JOINs. Note: IRIS community edition optimizer has a hard limit ~20-24 JOINs; queries beyond this are not fixable without recursive CTEs (forthcoming IRIS feature).
|
|
@@ -196,6 +196,8 @@ class Lexer:
|
|
|
196
196
|
self._add_token(TokenType.MINUS, char)
|
|
197
197
|
case '"' | "'":
|
|
198
198
|
self._tokenize_string(char)
|
|
199
|
+
case '`':
|
|
200
|
+
self._tokenize_backtick_identifier()
|
|
199
201
|
case "$":
|
|
200
202
|
self._tokenize_parameter()
|
|
201
203
|
case c if c.isdigit():
|
|
@@ -230,6 +232,26 @@ class Lexer:
|
|
|
230
232
|
self.column += 1
|
|
231
233
|
self.cursor += 1
|
|
232
234
|
|
|
235
|
+
def _tokenize_backtick_identifier(self):
|
|
236
|
+
start_pos = self.cursor
|
|
237
|
+
start_col = self.column
|
|
238
|
+
self.cursor += 1
|
|
239
|
+
self.column += 1
|
|
240
|
+
value = ""
|
|
241
|
+
while self.cursor < len(self.source) and self.source[self.cursor] != '`':
|
|
242
|
+
value += self.source[self.cursor]
|
|
243
|
+
self.cursor += 1
|
|
244
|
+
self.column += 1
|
|
245
|
+
if self.cursor >= len(self.source):
|
|
246
|
+
raise SyntaxError(
|
|
247
|
+
f"Unterminated backtick identifier at line {self.line}, col {start_col}"
|
|
248
|
+
)
|
|
249
|
+
self.cursor += 1
|
|
250
|
+
self.column += 1
|
|
251
|
+
self.tokens.append(
|
|
252
|
+
Token(TokenType.IDENTIFIER, value, start_pos, self.line, start_col)
|
|
253
|
+
)
|
|
254
|
+
|
|
233
255
|
def _tokenize_string(self, quote: str):
|
|
234
256
|
start_pos = self.cursor
|
|
235
257
|
start_col = self.column
|
|
@@ -76,6 +76,52 @@ class IRISGraphEngine:
|
|
|
76
76
|
self._arno_capabilities: Dict[str, Any] = {}
|
|
77
77
|
self._table_mapping_cache: Optional[Dict[str, dict]] = None
|
|
78
78
|
self._rel_mapping_cache: Optional[Dict[tuple, dict]] = None
|
|
79
|
+
self._connection_params: Optional[Dict[str, Any]] = None
|
|
80
|
+
|
|
81
|
+
@classmethod
|
|
82
|
+
def from_connect(
|
|
83
|
+
cls,
|
|
84
|
+
hostname: str,
|
|
85
|
+
port: int = 1972,
|
|
86
|
+
namespace: str = "USER",
|
|
87
|
+
username: str = "_SYSTEM",
|
|
88
|
+
password: str = "SYS",
|
|
89
|
+
embedding_dimension: Optional[int] = None,
|
|
90
|
+
**kwargs,
|
|
91
|
+
) -> "IRISGraphEngine":
|
|
92
|
+
import iris as _iris
|
|
93
|
+
conn_params = dict(hostname=hostname, port=port, namespace=namespace, username=username, password=password)
|
|
94
|
+
conn = _iris.connect(**conn_params)
|
|
95
|
+
engine = cls(conn, embedding_dimension=embedding_dimension, **kwargs)
|
|
96
|
+
engine._connection_params = conn_params
|
|
97
|
+
return engine
|
|
98
|
+
|
|
99
|
+
@property
|
|
100
|
+
def is_ready(self) -> bool:
|
|
101
|
+
try:
|
|
102
|
+
cur = self.conn.cursor()
|
|
103
|
+
cur.execute("SELECT 1 FROM Graph_KG.nodes FETCH FIRST 1 ROWS ONLY")
|
|
104
|
+
return True
|
|
105
|
+
except Exception:
|
|
106
|
+
return False
|
|
107
|
+
|
|
108
|
+
def _reconnect_if_stale(self) -> None:
|
|
109
|
+
try:
|
|
110
|
+
cur = self.conn.cursor()
|
|
111
|
+
cur.execute("SELECT 1")
|
|
112
|
+
except Exception as probe_err:
|
|
113
|
+
err_str = str(probe_err).lower()
|
|
114
|
+
if any(x in err_str for x in ("epipe", "broken pipe", "connection reset", "closed")):
|
|
115
|
+
if self._connection_params:
|
|
116
|
+
import iris as _iris
|
|
117
|
+
self.conn = _iris.connect(**self._connection_params)
|
|
118
|
+
logger.info("IRIS connection re-established after EPIPE")
|
|
119
|
+
else:
|
|
120
|
+
raise RuntimeError(
|
|
121
|
+
"IRIS connection is stale (EPIPE/BrokenPipe) and cannot auto-reconnect "
|
|
122
|
+
"because connection params were not stored. "
|
|
123
|
+
"Create the engine with a fresh iris.connect() call."
|
|
124
|
+
) from probe_err
|
|
79
125
|
|
|
80
126
|
def _invalidate_mapping_cache(self) -> None:
|
|
81
127
|
self._table_mapping_cache = None
|
|
@@ -419,9 +465,16 @@ class IRISGraphEngine:
|
|
|
419
465
|
f"Configured embedder {type(self.embedder)} is not a supported type (must have encode/embed or be callable)"
|
|
420
466
|
)
|
|
421
467
|
|
|
422
|
-
def initialize_schema(self, auto_deploy_objectscript: bool = True) ->
|
|
468
|
+
def initialize_schema(self, auto_deploy_objectscript: bool = True) -> dict:
|
|
423
469
|
"""
|
|
424
|
-
Create the base schema tables in IRIS
|
|
470
|
+
Create the base schema tables in IRIS.
|
|
471
|
+
|
|
472
|
+
Returns a status dict with keys:
|
|
473
|
+
- 'tables_created': True/False
|
|
474
|
+
- 'objectscript_deployed': True/False
|
|
475
|
+
- 'kg_built': True/False
|
|
476
|
+
- 'embedding_dimension': int
|
|
477
|
+
- 'warnings': list[str]
|
|
425
478
|
|
|
426
479
|
Safe to call on existing databases — statements that fail with "already exists"
|
|
427
480
|
are silently ignored. Raises if ``embedding_dimension`` has not been set (either
|
|
@@ -432,11 +485,6 @@ class IRISGraphEngine:
|
|
|
432
485
|
the ObjectScript .cls files from iris_src/ into IRIS. On failure a
|
|
433
486
|
warning is logged and the engine falls back to Python/SQL paths.
|
|
434
487
|
Set to False to skip .cls deployment entirely.
|
|
435
|
-
|
|
436
|
-
Example::
|
|
437
|
-
|
|
438
|
-
engine = IRISGraphEngine(conn, embedding_dimension=384)
|
|
439
|
-
engine.initialize_schema()
|
|
440
488
|
"""
|
|
441
489
|
from iris_vector_graph.utils import _split_sql_statements
|
|
442
490
|
|
|
@@ -642,6 +690,38 @@ class IRISGraphEngine:
|
|
|
642
690
|
except Exception as exc:
|
|
643
691
|
logger.warning("^KG bootstrap failed: %s", exc)
|
|
644
692
|
|
|
693
|
+
status = {
|
|
694
|
+
"tables_created": True,
|
|
695
|
+
"objectscript_deployed": self.capabilities.objectscript_deployed,
|
|
696
|
+
"kg_built": self.capabilities.kg_built,
|
|
697
|
+
"embedding_dimension": dim,
|
|
698
|
+
"warnings": [],
|
|
699
|
+
}
|
|
700
|
+
if not self.capabilities.objectscript_deployed:
|
|
701
|
+
status["warnings"].append(
|
|
702
|
+
"ObjectScript classes not deployed — BFS, Subgraph, PageRank using Python fallbacks. "
|
|
703
|
+
"Run docker cp iris_src/src <container>:/tmp/src && docker exec <container> iris session IRIS "
|
|
704
|
+
"-U USER 'Do $system.OBJ.LoadDir(\"/tmp/src\",\"ck\",,1)' to deploy."
|
|
705
|
+
)
|
|
706
|
+
if not self.capabilities.kg_built:
|
|
707
|
+
status["warnings"].append(
|
|
708
|
+
"^KG adjacency index not built — multi-hop BFS unavailable. "
|
|
709
|
+
"Call BuildKG() after loading data: from iris_vector_graph.schema import _call_classmethod; "
|
|
710
|
+
"_call_classmethod(conn, 'Graph.KG.Traversal', 'BuildKG')"
|
|
711
|
+
)
|
|
712
|
+
|
|
713
|
+
if status["warnings"]:
|
|
714
|
+
for w in status["warnings"]:
|
|
715
|
+
logger.warning("IVG setup: %s", w[:120])
|
|
716
|
+
|
|
717
|
+
logger.info(
|
|
718
|
+
"initialize_schema() complete — objectscript=%s kg_built=%s dim=%d",
|
|
719
|
+
status["objectscript_deployed"],
|
|
720
|
+
status["kg_built"],
|
|
721
|
+
dim,
|
|
722
|
+
)
|
|
723
|
+
return status
|
|
724
|
+
|
|
645
725
|
def _get_embedding_dimension(self) -> int:
|
|
646
726
|
"""
|
|
647
727
|
Get the vector embedding dimension, either from initialization or auto-detection.
|
|
@@ -808,6 +888,8 @@ class IRISGraphEngine:
|
|
|
808
888
|
|
|
809
889
|
parsed = parse_query(cypher_query)
|
|
810
890
|
|
|
891
|
+
self._reconnect_if_stale()
|
|
892
|
+
|
|
811
893
|
if read_only and parsed.is_mutation:
|
|
812
894
|
raise PermissionError(
|
|
813
895
|
f"Read-only mode: mutation queries (CREATE/DELETE/SET/MERGE/REMOVE/FOREACH) "
|
|
@@ -936,18 +1018,16 @@ class IRISGraphEngine:
|
|
|
936
1018
|
}
|
|
937
1019
|
except Exception as _exec_err:
|
|
938
1020
|
err_str = str(_exec_err)
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
"metadata": metadata, "error": err_str[:200]}
|
|
950
|
-
raise
|
|
1021
|
+
import logging as _log
|
|
1022
|
+
_log.getLogger(__name__).warning(
|
|
1023
|
+
"IRIS SQL error: %s", err_str[:200]
|
|
1024
|
+
)
|
|
1025
|
+
try:
|
|
1026
|
+
self.conn.rollback()
|
|
1027
|
+
except Exception:
|
|
1028
|
+
pass
|
|
1029
|
+
return {"columns": [], "rows": [], "sql": sql_str, "params": p,
|
|
1030
|
+
"metadata": metadata, "error": err_str[:200]}
|
|
951
1031
|
|
|
952
1032
|
def _execute_parsed(self, parsed, parameters):
|
|
953
1033
|
if parsed.procedure_call is not None:
|
|
@@ -992,18 +1072,16 @@ class IRISGraphEngine:
|
|
|
992
1072
|
"sql": sql_str, "params": p, "metadata": metadata}
|
|
993
1073
|
except Exception as _exec_err:
|
|
994
1074
|
err_str = str(_exec_err)
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
"metadata": metadata, "error": err_str[:200]}
|
|
1006
|
-
raise
|
|
1075
|
+
import logging as _log
|
|
1076
|
+
_log.getLogger(__name__).warning(
|
|
1077
|
+
"IRIS SQL error: %s", err_str[:200]
|
|
1078
|
+
)
|
|
1079
|
+
try:
|
|
1080
|
+
self.conn.rollback()
|
|
1081
|
+
except Exception:
|
|
1082
|
+
pass
|
|
1083
|
+
return {"columns": [], "rows": [], "sql": sql_str, "params": p,
|
|
1084
|
+
"metadata": metadata, "error": err_str[:200]}
|
|
1007
1085
|
|
|
1008
1086
|
|
|
1009
1087
|
def _execute_weighted_shortest_path(
|
|
@@ -2630,6 +2708,17 @@ class IRISGraphEngine:
|
|
|
2630
2708
|
f"bulk_create_edges BuildKG failed (^KG may be stale): {e}"
|
|
2631
2709
|
)
|
|
2632
2710
|
|
|
2711
|
+
def rebuild_kg(self) -> bool:
|
|
2712
|
+
from iris_vector_graph.schema import _call_classmethod
|
|
2713
|
+
try:
|
|
2714
|
+
_call_classmethod(self.conn, "Graph.KG.Traversal", "BuildKG")
|
|
2715
|
+
self.capabilities.kg_built = True
|
|
2716
|
+
logger.info("^KG adjacency index rebuilt successfully")
|
|
2717
|
+
return True
|
|
2718
|
+
except Exception as e:
|
|
2719
|
+
logger.warning("rebuild_kg failed: %s", e)
|
|
2720
|
+
return False
|
|
2721
|
+
|
|
2633
2722
|
def load_networkx(
|
|
2634
2723
|
self,
|
|
2635
2724
|
G,
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "iris-vector-graph"
|
|
7
|
-
version = "1.80.
|
|
7
|
+
version = "1.80.2"
|
|
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.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical/__init__.py
RENAMED
|
File without changes
|
{iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical/loaders.py
RENAMED
|
File without changes
|
{iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/examples/domains/biomedical/resolver.py
RENAMED
|
File without changes
|
|
File without changes
|
{iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/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.80.0 → iris_vector_graph-1.80.2}/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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_src/src/Graph/KG/TemporalIndex.cls
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/algorithms/paths.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iris_vector_graph-1.80.0 → iris_vector_graph-1.80.2}/iris_vector_graph/cypher/translator.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|