iris-vector-graph 1.59.2__tar.gz → 1.60.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/PKG-INFO +12 -1
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/README.md +11 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/ast.py +30 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/parser.py +37 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/translator.py +90 -5
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/pyproject.toml +1 -1
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/.gitignore +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/LICENSE +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/demo_biomedical.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/demo_fraud_detection.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/demo_fraud_detection_sql.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/demo_utils.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/demo_working_system.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/__init__.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical/__init__.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical/loaders.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical/resolver.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical/types.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical_legacy/__init__.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical_legacy/biomedical_engine.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical_legacy/biomedical_schema.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical_legacy/legacy_wrapper.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/fraud/__init__.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/fraud/loaders.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/fraud/resolver.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/fraud/types.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/graphQL.http +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/hybrid_vector_graph_query.cypher +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/rest.http +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Algorithms.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/ArnoAccel.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/BM25Index.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/BenchFormat.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/BenchSeeder.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Benchmark.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Edge.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/EdgeScan.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/GraphIndex.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/IVFIndex.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Loader.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/MCPService.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/MCPToolSet.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/MCPTools.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Meta.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/PLAIDSearch.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/PageRank.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/PyOps.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Service.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Snapshot.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Subgraph.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/TemporalIndex.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/TestEdge.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/Traversal.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/Graph/KG/VecIndex.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/PageRankEmbedded.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/User.Exec.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_src/src/iris/vector/graph/GraphOperators.cls +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/__init__.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/bolt_server.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/bulk_loader.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/capabilities.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/__init__.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/algorithms/__init__.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/algorithms/paths.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/lexer.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher_api.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/embedded.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/engine.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/fusion.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/gql/__init__.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/gql/constants.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/gql/engine.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/gql/pooling.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/gql/resolvers.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/gql/schema.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/models.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/operators.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/py.typed +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/schema.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/security.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/text_search.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/utils.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/vector_utils.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/fhir_bridges.sql +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/fraud_sample_data.sql +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/globals_schema.sql +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/graph_path_globals.sql +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/graph_walk_tvf.sql +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/migrations/000_base_schema_iris.sql +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/migrations/001_add_nodepk_table.sql +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/migrations/001_rollback_nodepk.sql +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/migrations/002_add_fk_constraints.sql +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/operators.sql +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/operators_fixed.sql +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/procedures/kg_PageRank.sql +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/rdf_reifications.sql +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/schema.sql +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/TESTING.md +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmark_parser.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/benchmark_neo4j.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/bfs_benchmark.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/establish_baseline.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/graph_gen.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/iris_baseline_run.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/iris_os_run.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/load_neo4j.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/synthetic_baseline.csv +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/conftest.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/contract/__init__.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/contract/test_cypher_api.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/contract/test_cypher_api_errors.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/contract/test_graphql_queries.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/contract/test_graphql_schema.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/contract/test_ppr_api.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/curl_suite.sh +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/__init__.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/conftest.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_biomedical_demo.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_biomedical_ui.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_cypher_coerce_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_cypher_sprints_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_cypher_vector_search.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_fhir_bridges_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_fraud_demo.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_fraud_ui.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_gql_autogen_startup.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_gql_cypher_passthrough.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_gql_node_queries.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_gql_semantic_search.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_gql_traversal.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_graph_kernels_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_hla_kg_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_multi_query_engine_platform.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_named_paths_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_nkg_index_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_operator_wiring_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_plaid_search_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_ppr_cls_fast_path.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_ppr_guided_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_procedure_installation.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_reification_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_schema_procedures_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_subgraph_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_subquery_call_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_vecindex_e2e.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/__init__.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/conftest.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/gql/__init__.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/gql/test_graphql_mutations.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/gql/test_graphql_nested_queries.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/gql/test_graphql_queries.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/gql/test_graphql_vector_search.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_bidirectional_ppr.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cls_layer.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_advanced.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_enhancements.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_multi_type.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_rd.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_rel_vars.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_single_type.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_untyped.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_cypher_vector_search.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_embeddings_api.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_fastapi_graphql.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_fhir_bridges_integration.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_named_paths_integration.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_nodepk_advanced_benchmarks.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_nodepk_constraints.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_nodepk_graph_analytics.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_nodepk_migration.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_nodepk_performance.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_nodepk_production_scale.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_objectscript_classes.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_pagerank_sql_optimization.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_reification_integration.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_schema_migration.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_stored_procedure_install.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/integration/test_subquery_call_integration.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/performance/conftest.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/performance/scale_benchmark.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/performance/test_ppr_stress.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/performance/test_stress_v1_5.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/run_all_tests.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_iris_rest_api.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_networkx_loader.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_performance_benchmarks.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_pyops_vector_conversion.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_python_operators.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_python_sdk.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_schema_validation.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_sql_queries.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/python/test_vector_functions.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/cypher/__init__.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/cypher/test_lexer.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/cypher/test_lexer_advanced.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/cypher/test_parser.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/cypher/test_parser_advanced.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_batch_mutations.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_bm25_index.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_bolt_server.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cls_deployment.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_case_when.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_functions.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_parser.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_posos_bugs.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_procedures.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_translator.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_union_exists.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_var_length.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_cypher_vector_search.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_edge_embeddings.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_edgeprop_ndjson.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_embedded.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_engine_dimension_fix.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_engine_embeddings.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_fhir_bridges.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_get_nodes.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_graph_kernels.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_graphql_dataloader.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_ingest_formats.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_ivf_index.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_named_graphs.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_named_paths.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_operators_wiring.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_plaid_search.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_ppr_guided_subgraph.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_reification.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_schema_init.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_schema_procedures.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_shortest_path.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_snapshot.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_sql_splitter.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_sql_table_bridge.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_subgraph.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_subquery_call.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_temporal_cypher.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_temporal_edges.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_unified_edge_store.py +0 -0
- {iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/unit/test_weighted_shortest_path.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: iris-vector-graph
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.60.0
|
|
4
4
|
Summary: Transactional Graph + Vector retrieval system for InterSystems IRIS with hybrid search, openCypher, and GraphQL APIs
|
|
5
5
|
Project-URL: Homepage, https://github.com/intersystems-community/iris-vector-graph
|
|
6
6
|
Project-URL: Documentation, https://github.com/intersystems-community/iris-vector-graph/tree/main/docs
|
|
@@ -655,6 +655,17 @@ anchors = engine.get_kg_anchors(icd_codes=["J18.0", "E11.9"])
|
|
|
655
655
|
|
|
656
656
|
## Changelog
|
|
657
657
|
|
|
658
|
+
### v1.60.0 (2026-04-24)
|
|
659
|
+
|
|
660
|
+
Four openCypher gaps closed, all from structured gap analysis against the openCypher grammar spec:
|
|
661
|
+
|
|
662
|
+
- feat: `WHERE n:Label` predicate — `MATCH (n) WHERE n:Gene AND n.id = 'x'` now works; translates to `EXISTS (SELECT 1 FROM rdf_labels WHERE label = ?)` (spec 068)
|
|
663
|
+
- feat: Map literal expressions — `RETURN {id: n.id, score: 0.9} AS obj` translates to `JSON_OBJECT(...)` (spec 069)
|
|
664
|
+
- feat: `WITH agg-alias HAVING filter` — `WITH n, count(r) AS cnt WHERE cnt > 2` now emits SQL `HAVING cnt > 2` correctly; was `ValueError: Undefined: cnt` (spec 070)
|
|
665
|
+
- feat: Subscript/slice/property-access postfix — `list[n]`, `list[start..end]`, `expr.key` on any expression; translates to `JSON_ARRAYGET`, `JSON_ARRAY_SLICE`, `JSON_VALUE` (spec 071)
|
|
666
|
+
- fix: `DELETE r` by relationship variable now emits `WHERE (s,p,o_id) IN (SELECT ...)` instead of broken correlated subquery (spec 071)
|
|
667
|
+
|
|
668
|
+
|
|
658
669
|
### v1.59.2 (2026-04-24)
|
|
659
670
|
- fix: Cypher `WHERE x IN $param` and `WHERE x IN [list]` now correctly emit `IN (?,?,?)` — previously emitted `IN ?` which IRIS DBAPI can't expand. Enables batch multi-node queries like `MATCH (a)-[r]-(b) WHERE a.id IN $node_ids RETURN ...` (20× speedup for 2-hop expansion vs N sequential queries).
|
|
660
671
|
|
|
@@ -583,6 +583,17 @@ anchors = engine.get_kg_anchors(icd_codes=["J18.0", "E11.9"])
|
|
|
583
583
|
|
|
584
584
|
## Changelog
|
|
585
585
|
|
|
586
|
+
### v1.60.0 (2026-04-24)
|
|
587
|
+
|
|
588
|
+
Four openCypher gaps closed, all from structured gap analysis against the openCypher grammar spec:
|
|
589
|
+
|
|
590
|
+
- feat: `WHERE n:Label` predicate — `MATCH (n) WHERE n:Gene AND n.id = 'x'` now works; translates to `EXISTS (SELECT 1 FROM rdf_labels WHERE label = ?)` (spec 068)
|
|
591
|
+
- feat: Map literal expressions — `RETURN {id: n.id, score: 0.9} AS obj` translates to `JSON_OBJECT(...)` (spec 069)
|
|
592
|
+
- feat: `WITH agg-alias HAVING filter` — `WITH n, count(r) AS cnt WHERE cnt > 2` now emits SQL `HAVING cnt > 2` correctly; was `ValueError: Undefined: cnt` (spec 070)
|
|
593
|
+
- feat: Subscript/slice/property-access postfix — `list[n]`, `list[start..end]`, `expr.key` on any expression; translates to `JSON_ARRAYGET`, `JSON_ARRAY_SLICE`, `JSON_VALUE` (spec 071)
|
|
594
|
+
- fix: `DELETE r` by relationship variable now emits `WHERE (s,p,o_id) IN (SELECT ...)` instead of broken correlated subquery (spec 071)
|
|
595
|
+
|
|
596
|
+
|
|
586
597
|
### v1.59.2 (2026-04-24)
|
|
587
598
|
- fix: Cypher `WHERE x IN $param` and `WHERE x IN [list]` now correctly emit `IN (?,?,?)` — previously emitted `IN ?` which IRIS DBAPI can't expand. Enables batch multi-node queries like `MATCH (a)-[r]-(b) WHERE a.id IN $node_ids RETURN ...` (20× speedup for 2-hop expansion vs N sequential queries).
|
|
588
599
|
|
|
@@ -198,6 +198,36 @@ class WhereClause:
|
|
|
198
198
|
expression: BooleanExpression
|
|
199
199
|
|
|
200
200
|
|
|
201
|
+
@dataclass(slots=True)
|
|
202
|
+
class LabelPredicate:
|
|
203
|
+
variable: str
|
|
204
|
+
label: str
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
@dataclass(slots=True)
|
|
208
|
+
class MapLiteral:
|
|
209
|
+
entries: dict
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
@dataclass(slots=True)
|
|
213
|
+
class SubscriptExpression:
|
|
214
|
+
expression: Any
|
|
215
|
+
index: Any
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
@dataclass(slots=True)
|
|
219
|
+
class SliceExpression:
|
|
220
|
+
expression: Any
|
|
221
|
+
start: Any
|
|
222
|
+
end: Any
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
@dataclass(slots=True)
|
|
226
|
+
class PropertyAccessExpression:
|
|
227
|
+
expression: Any
|
|
228
|
+
property_name: str
|
|
229
|
+
|
|
230
|
+
|
|
201
231
|
@dataclass(slots=True)
|
|
202
232
|
class MatchClause:
|
|
203
233
|
"""MATCH clause with one or more patterns"""
|
|
@@ -802,11 +802,42 @@ class Parser:
|
|
|
802
802
|
self.eat()
|
|
803
803
|
exp = self.parse_power_expression()
|
|
804
804
|
return ast.FunctionCall(function_name="__arith_^", arguments=[base, exp])
|
|
805
|
+
while self.peek().kind in (TokenType.LBRACKET, TokenType.DOT):
|
|
806
|
+
if self.peek().kind == TokenType.LBRACKET:
|
|
807
|
+
self.eat()
|
|
808
|
+
if self.peek().kind == TokenType.DOT and self.lexer.peek_ahead(1).kind == TokenType.DOT:
|
|
809
|
+
self.eat()
|
|
810
|
+
self.eat()
|
|
811
|
+
end = self.parse_primary_expression()
|
|
812
|
+
self.expect(TokenType.RBRACKET)
|
|
813
|
+
base = ast.SliceExpression(expression=base, start=ast.Literal(0), end=end)
|
|
814
|
+
else:
|
|
815
|
+
first = self.parse_primary_expression()
|
|
816
|
+
if self.peek().kind == TokenType.DOT and self.lexer.peek_ahead(1).kind == TokenType.DOT:
|
|
817
|
+
self.eat()
|
|
818
|
+
self.eat()
|
|
819
|
+
second = self.parse_primary_expression()
|
|
820
|
+
self.expect(TokenType.RBRACKET)
|
|
821
|
+
base = ast.SliceExpression(expression=base, start=first, end=second)
|
|
822
|
+
else:
|
|
823
|
+
self.expect(TokenType.RBRACKET)
|
|
824
|
+
base = ast.SubscriptExpression(expression=base, index=first)
|
|
825
|
+
elif self.peek().kind == TokenType.DOT:
|
|
826
|
+
self.eat()
|
|
827
|
+
prop_tok = self.expect(TokenType.IDENTIFIER)
|
|
828
|
+
base = ast.PropertyAccessExpression(
|
|
829
|
+
expression=base, property_name=prop_tok.value or ""
|
|
830
|
+
)
|
|
805
831
|
return base
|
|
806
832
|
|
|
807
833
|
def parse_comparison_expression(self) -> Any:
|
|
808
834
|
left = self.parse_additive_expression()
|
|
809
835
|
|
|
836
|
+
if isinstance(left, ast.Variable) and self.peek().kind == TokenType.COLON:
|
|
837
|
+
self.eat()
|
|
838
|
+
label_tok = self.expect(TokenType.IDENTIFIER)
|
|
839
|
+
return ast.LabelPredicate(variable=left.name, label=label_tok.value or "")
|
|
840
|
+
|
|
810
841
|
# Binary comparisons
|
|
811
842
|
tok = self.peek()
|
|
812
843
|
op = None
|
|
@@ -873,6 +904,12 @@ class Parser:
|
|
|
873
904
|
self.expect(TokenType.RPAREN)
|
|
874
905
|
return expr
|
|
875
906
|
|
|
907
|
+
if tok.kind == TokenType.LBRACE:
|
|
908
|
+
self.eat()
|
|
909
|
+
entries = self.parse_map_literal()
|
|
910
|
+
self.expect(TokenType.RBRACE)
|
|
911
|
+
return ast.MapLiteral(entries=entries)
|
|
912
|
+
|
|
876
913
|
if tok.kind == TokenType.IDENTIFIER:
|
|
877
914
|
name = self.eat().value
|
|
878
915
|
if name is None:
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/translator.py
RENAMED
|
@@ -149,6 +149,7 @@ class TranslationContext:
|
|
|
149
149
|
self.from_clauses: List[str] = []
|
|
150
150
|
self.join_clauses: List[str] = []
|
|
151
151
|
self.where_conditions: List[str] = []
|
|
152
|
+
self.having_conditions: List[str] = []
|
|
152
153
|
self.group_by_items: List[str] = []
|
|
153
154
|
|
|
154
155
|
self.select_params: List[Any] = []
|
|
@@ -228,6 +229,8 @@ class TranslationContext:
|
|
|
228
229
|
parts.append(f"WHERE {' AND '.join(self.where_conditions)}")
|
|
229
230
|
if self.group_by_items:
|
|
230
231
|
parts.append(f"GROUP BY {', '.join(self.group_by_items)}")
|
|
232
|
+
if self.having_conditions:
|
|
233
|
+
parts.append(f"HAVING {' AND '.join(self.having_conditions)}")
|
|
231
234
|
sql = "\n".join(parts)
|
|
232
235
|
params = (
|
|
233
236
|
(self.select_params if not select_override else [])
|
|
@@ -1354,9 +1357,12 @@ def translate_delete_clause(delete, context, metadata):
|
|
|
1354
1357
|
subparams,
|
|
1355
1358
|
)
|
|
1356
1359
|
else:
|
|
1360
|
+
subquery_spo, subparams_spo = context.build_stage_sql(
|
|
1361
|
+
select_override=f"SELECT {alias}.s, {alias}.p, {alias}.o_id"
|
|
1362
|
+
)
|
|
1357
1363
|
context.add_dml(
|
|
1358
|
-
f"DELETE FROM {_table('rdf_edges')} WHERE
|
|
1359
|
-
|
|
1364
|
+
f"DELETE FROM {_table('rdf_edges')} WHERE (s, p, o_id) IN ({subquery_spo})",
|
|
1365
|
+
subparams_spo,
|
|
1360
1366
|
)
|
|
1361
1367
|
|
|
1362
1368
|
|
|
@@ -1999,6 +2005,15 @@ def translate_boolean_expression(expr, context) -> str:
|
|
|
1999
2005
|
prefix = "NOT " if expr.negated else ""
|
|
2000
2006
|
return f"{prefix}EXISTS ({sub})"
|
|
2001
2007
|
return "1=1"
|
|
2008
|
+
if isinstance(expr, ast.LabelPredicate):
|
|
2009
|
+
alias = context.variable_aliases.get(expr.variable)
|
|
2010
|
+
node_col = f"{alias}.node_id" if alias else "node_id"
|
|
2011
|
+
labels_tbl = _table("rdf_labels")
|
|
2012
|
+
safe_label = context.add_where_param(expr.label)
|
|
2013
|
+
return (
|
|
2014
|
+
f"EXISTS (SELECT 1 FROM {labels_tbl} _lp WHERE _lp.s = {node_col}"
|
|
2015
|
+
f" AND _lp.label = {safe_label})"
|
|
2016
|
+
)
|
|
2002
2017
|
if not isinstance(expr, ast.BooleanExpression):
|
|
2003
2018
|
return translate_expression(expr, context, segment="where")
|
|
2004
2019
|
op = expr.operator
|
|
@@ -2343,6 +2358,28 @@ def translate_expression(expr, context, segment="select") -> str:
|
|
|
2343
2358
|
f'LEFT JOIN {_table("rdf_props")} {p_alias} ON {p_alias}.s = {alias}.node_id AND {p_alias}."key" = {context.add_join_param(expr.property_name)}'
|
|
2344
2359
|
)
|
|
2345
2360
|
return f"{p_alias}.val"
|
|
2361
|
+
if isinstance(expr, ast.MapLiteral):
|
|
2362
|
+
if not expr.entries:
|
|
2363
|
+
return "JSON_OBJECT()"
|
|
2364
|
+
parts = []
|
|
2365
|
+
for k, v in expr.entries.items():
|
|
2366
|
+
key_sql = f"'{k}'"
|
|
2367
|
+
val_sql = translate_expression(v, context, segment=segment)
|
|
2368
|
+
parts.append(f"{key_sql}, {val_sql}")
|
|
2369
|
+
return f"JSON_OBJECT({', '.join(parts)})"
|
|
2370
|
+
if isinstance(expr, ast.SubscriptExpression):
|
|
2371
|
+
base_sql = translate_expression(expr.expression, context, segment=segment)
|
|
2372
|
+
idx_sql = translate_expression(expr.index, context, segment=segment)
|
|
2373
|
+
return f"JSON_ARRAYGET({base_sql}, {idx_sql})"
|
|
2374
|
+
if isinstance(expr, ast.SliceExpression):
|
|
2375
|
+
base_sql = translate_expression(expr.expression, context, segment=segment)
|
|
2376
|
+
start_sql = translate_expression(expr.start, context, segment=segment)
|
|
2377
|
+
end_sql = translate_expression(expr.end, context, segment=segment)
|
|
2378
|
+
return f"JSON_ARRAY_SLICE({base_sql}, {start_sql}, {end_sql})"
|
|
2379
|
+
if isinstance(expr, ast.PropertyAccessExpression):
|
|
2380
|
+
base_sql = translate_expression(expr.expression, context, segment=segment)
|
|
2381
|
+
prop = expr.property_name.replace("'", "''")
|
|
2382
|
+
return f"JSON_VALUE({base_sql}, '$.{prop}')"
|
|
2346
2383
|
if isinstance(expr, ast.Variable):
|
|
2347
2384
|
alias = context.variable_aliases.get(expr.name)
|
|
2348
2385
|
if not alias:
|
|
@@ -2615,6 +2652,7 @@ def translate_with_clause(with_clause, context):
|
|
|
2615
2652
|
has_agg = any(
|
|
2616
2653
|
isinstance(i.expression, ast.AggregationFunction) for i in with_clause.items
|
|
2617
2654
|
)
|
|
2655
|
+
agg_aliases: set = set()
|
|
2618
2656
|
for item in with_clause.items:
|
|
2619
2657
|
sql = translate_expression(item.expression, context, segment="select")
|
|
2620
2658
|
alias = item.alias
|
|
@@ -2630,7 +2668,54 @@ def translate_with_clause(with_clause, context):
|
|
|
2630
2668
|
context.select_items.append(f"{sql} AS {alias.replace('.', '_')}")
|
|
2631
2669
|
if has_agg and not isinstance(item.expression, ast.AggregationFunction):
|
|
2632
2670
|
context.group_by_items.append(sql)
|
|
2671
|
+
if isinstance(item.expression, ast.AggregationFunction):
|
|
2672
|
+
agg_aliases.add(alias)
|
|
2633
2673
|
if with_clause.where_clause:
|
|
2634
|
-
|
|
2635
|
-
|
|
2636
|
-
|
|
2674
|
+
expr = with_clause.where_clause.expression
|
|
2675
|
+
if has_agg and agg_aliases and _references_agg_alias(expr, agg_aliases):
|
|
2676
|
+
context.having_conditions.append(
|
|
2677
|
+
_translate_having_expr(expr, agg_aliases, context)
|
|
2678
|
+
)
|
|
2679
|
+
else:
|
|
2680
|
+
context.where_conditions.append(
|
|
2681
|
+
translate_boolean_expression(expr, context)
|
|
2682
|
+
)
|
|
2683
|
+
|
|
2684
|
+
|
|
2685
|
+
def _references_agg_alias(expr, agg_aliases: set) -> bool:
|
|
2686
|
+
if isinstance(expr, ast.Variable) and expr.name in agg_aliases:
|
|
2687
|
+
return True
|
|
2688
|
+
if isinstance(expr, ast.BooleanExpression):
|
|
2689
|
+
return any(_references_agg_alias(o, agg_aliases) for o in expr.operands)
|
|
2690
|
+
return False
|
|
2691
|
+
|
|
2692
|
+
|
|
2693
|
+
def _translate_having_expr(expr, agg_aliases: set, context) -> str:
|
|
2694
|
+
if isinstance(expr, ast.Variable) and expr.name in agg_aliases:
|
|
2695
|
+
return expr.name
|
|
2696
|
+
if isinstance(expr, ast.BooleanExpression):
|
|
2697
|
+
op = expr.operator
|
|
2698
|
+
if op == ast.BooleanOperator.AND:
|
|
2699
|
+
return "(" + " AND ".join(
|
|
2700
|
+
_translate_having_expr(o, agg_aliases, context) for o in expr.operands
|
|
2701
|
+
) + ")"
|
|
2702
|
+
if op == ast.BooleanOperator.OR:
|
|
2703
|
+
return "(" + " OR ".join(
|
|
2704
|
+
_translate_having_expr(o, agg_aliases, context) for o in expr.operands
|
|
2705
|
+
) + ")"
|
|
2706
|
+
if op == ast.BooleanOperator.NOT:
|
|
2707
|
+
return f"NOT ({_translate_having_expr(expr.operands[0], agg_aliases, context)})"
|
|
2708
|
+
left = _translate_having_expr(expr.operands[0], agg_aliases, context)
|
|
2709
|
+
right_expr = expr.operands[1] if len(expr.operands) > 1 else None
|
|
2710
|
+
right = translate_expression(right_expr, context, segment="where") if right_expr is not None else ""
|
|
2711
|
+
op_map = {
|
|
2712
|
+
ast.BooleanOperator.EQUALS: "=",
|
|
2713
|
+
ast.BooleanOperator.NOT_EQUALS: "<>",
|
|
2714
|
+
ast.BooleanOperator.LESS_THAN: "<",
|
|
2715
|
+
ast.BooleanOperator.LESS_THAN_OR_EQUAL: "<=",
|
|
2716
|
+
ast.BooleanOperator.GREATER_THAN: ">",
|
|
2717
|
+
ast.BooleanOperator.GREATER_THAN_OR_EQUAL: ">=",
|
|
2718
|
+
}
|
|
2719
|
+
if op in op_map:
|
|
2720
|
+
return f"{left} {op_map[op]} {right}"
|
|
2721
|
+
return translate_boolean_expression(expr, context)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "iris-vector-graph"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.60.0"
|
|
8
8
|
description = "Transactional Graph + Vector retrieval system for InterSystems IRIS with hybrid search, openCypher, and GraphQL APIs"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
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.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical/__init__.py
RENAMED
|
File without changes
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical/loaders.py
RENAMED
|
File without changes
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/examples/domains/biomedical/resolver.py
RENAMED
|
File without changes
|
|
File without changes
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/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.59.2 → iris_vector_graph-1.60.0}/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
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/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
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/iris_vector_graph/cypher/algorithms/paths.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
|
|
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.59.2 → iris_vector_graph-1.60.0}/sql/migrations/000_base_schema_iris.sql
RENAMED
|
File without changes
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/migrations/001_add_nodepk_table.sql
RENAMED
|
File without changes
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/migrations/001_rollback_nodepk.sql
RENAMED
|
File without changes
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/sql/migrations/002_add_fk_constraints.sql
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
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/establish_baseline.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/benchmarks/synthetic_baseline.csv
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/contract/test_cypher_api_errors.py
RENAMED
|
File without changes
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/contract/test_graphql_queries.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
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_cypher_vector_search.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iris_vector_graph-1.59.2 → iris_vector_graph-1.60.0}/tests/e2e/test_gql_cypher_passthrough.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|