relationalai 0.12.13__py3-none-any.whl → 0.13.0.dev0__py3-none-any.whl
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.
- relationalai/__init__.py +1 -209
- relationalai/config/__init__.py +56 -0
- relationalai/config/config.py +289 -0
- relationalai/config/config_fields.py +86 -0
- relationalai/config/connections/__init__.py +46 -0
- relationalai/config/connections/base.py +23 -0
- relationalai/config/connections/duckdb.py +29 -0
- relationalai/config/connections/snowflake.py +243 -0
- relationalai/config/external/__init__.py +17 -0
- relationalai/config/external/dbt_converter.py +101 -0
- relationalai/config/external/dbt_models.py +93 -0
- relationalai/config/external/snowflake_converter.py +41 -0
- relationalai/config/external/snowflake_models.py +85 -0
- relationalai/config/external/utils.py +19 -0
- relationalai/semantics/__init__.py +146 -22
- relationalai/semantics/backends/lqp/annotations.py +11 -0
- relationalai/semantics/backends/sql/sql_compiler.py +327 -0
- relationalai/semantics/frontend/base.py +1707 -0
- relationalai/semantics/frontend/core.py +179 -0
- relationalai/semantics/frontend/front_compiler.py +1313 -0
- relationalai/semantics/frontend/pprint.py +408 -0
- relationalai/semantics/metamodel/__init__.py +6 -40
- relationalai/semantics/metamodel/builtins.py +205 -769
- relationalai/semantics/metamodel/metamodel.py +437 -0
- relationalai/semantics/metamodel/metamodel_analyzer.py +519 -0
- relationalai/semantics/metamodel/pprint.py +412 -0
- relationalai/semantics/metamodel/rewriter.py +266 -0
- relationalai/semantics/metamodel/typer.py +1378 -0
- relationalai/semantics/std/__init__.py +60 -40
- relationalai/semantics/std/aggregates.py +149 -0
- relationalai/semantics/std/common.py +44 -0
- relationalai/semantics/std/constraints.py +37 -43
- relationalai/semantics/std/datetime.py +246 -135
- relationalai/semantics/std/decimals.py +45 -52
- relationalai/semantics/std/floats.py +13 -5
- relationalai/semantics/std/integers.py +26 -11
- relationalai/semantics/std/math.py +183 -112
- relationalai/semantics/std/numbers.py +86 -0
- relationalai/semantics/std/re.py +80 -62
- relationalai/semantics/std/strings.py +117 -60
- relationalai/shims/executor.py +147 -0
- relationalai/shims/helpers.py +126 -0
- relationalai/shims/hoister.py +221 -0
- relationalai/shims/mm2v0.py +1290 -0
- relationalai/tools/cli/__init__.py +6 -0
- relationalai/tools/cli/cli.py +90 -0
- relationalai/tools/cli/components/__init__.py +5 -0
- relationalai/tools/cli/components/progress_reader.py +1524 -0
- relationalai/tools/cli/components/utils.py +58 -0
- relationalai/tools/cli/config_template.py +45 -0
- relationalai/tools/cli/dev.py +19 -0
- relationalai/tools/debugger.py +289 -183
- relationalai/tools/typer_debugger.py +93 -0
- relationalai/util/dataclasses.py +43 -0
- relationalai/util/docutils.py +40 -0
- relationalai/util/error.py +199 -0
- relationalai/util/format.py +48 -106
- relationalai/util/naming.py +145 -0
- relationalai/util/python.py +35 -0
- relationalai/util/runtime.py +156 -0
- relationalai/util/schema.py +197 -0
- relationalai/util/source.py +185 -0
- relationalai/util/structures.py +163 -0
- relationalai/util/tracing.py +261 -0
- relationalai-0.13.0.dev0.dist-info/METADATA +46 -0
- relationalai-0.13.0.dev0.dist-info/RECORD +488 -0
- relationalai-0.13.0.dev0.dist-info/WHEEL +5 -0
- relationalai-0.13.0.dev0.dist-info/entry_points.txt +3 -0
- relationalai-0.13.0.dev0.dist-info/top_level.txt +2 -0
- v0/relationalai/__init__.py +216 -0
- v0/relationalai/clients/azure.py +477 -0
- v0/relationalai/clients/client.py +912 -0
- v0/relationalai/clients/config.py +673 -0
- v0/relationalai/clients/direct_access_client.py +118 -0
- v0/relationalai/clients/hash_util.py +31 -0
- v0/relationalai/clients/local.py +571 -0
- v0/relationalai/clients/profile_polling.py +73 -0
- v0/relationalai/clients/result_helpers.py +420 -0
- v0/relationalai/clients/snowflake.py +3869 -0
- v0/relationalai/clients/types.py +113 -0
- v0/relationalai/clients/use_index_poller.py +980 -0
- v0/relationalai/clients/util.py +356 -0
- v0/relationalai/debugging.py +389 -0
- v0/relationalai/dsl.py +1749 -0
- v0/relationalai/early_access/builder/__init__.py +30 -0
- v0/relationalai/early_access/builder/builder/__init__.py +35 -0
- v0/relationalai/early_access/builder/snowflake/__init__.py +12 -0
- v0/relationalai/early_access/builder/std/__init__.py +25 -0
- v0/relationalai/early_access/builder/std/decimals/__init__.py +12 -0
- v0/relationalai/early_access/builder/std/integers/__init__.py +12 -0
- v0/relationalai/early_access/builder/std/math/__init__.py +12 -0
- v0/relationalai/early_access/builder/std/strings/__init__.py +14 -0
- v0/relationalai/early_access/devtools/__init__.py +12 -0
- v0/relationalai/early_access/devtools/benchmark_lqp/__init__.py +12 -0
- v0/relationalai/early_access/devtools/extract_lqp/__init__.py +12 -0
- v0/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +427 -0
- v0/relationalai/early_access/dsl/adapters/orm/parser.py +636 -0
- v0/relationalai/early_access/dsl/adapters/owl/adapter.py +176 -0
- v0/relationalai/early_access/dsl/adapters/owl/parser.py +160 -0
- v0/relationalai/early_access/dsl/bindings/common.py +402 -0
- v0/relationalai/early_access/dsl/bindings/csv.py +170 -0
- v0/relationalai/early_access/dsl/bindings/legacy/binding_models.py +143 -0
- v0/relationalai/early_access/dsl/bindings/snowflake.py +64 -0
- v0/relationalai/early_access/dsl/codegen/binder.py +411 -0
- v0/relationalai/early_access/dsl/codegen/common.py +79 -0
- v0/relationalai/early_access/dsl/codegen/helpers.py +23 -0
- v0/relationalai/early_access/dsl/codegen/relations.py +700 -0
- v0/relationalai/early_access/dsl/codegen/weaver.py +417 -0
- v0/relationalai/early_access/dsl/core/builders/__init__.py +47 -0
- v0/relationalai/early_access/dsl/core/builders/logic.py +19 -0
- v0/relationalai/early_access/dsl/core/builders/scalar_constraint.py +11 -0
- v0/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +455 -0
- v0/relationalai/early_access/dsl/core/constraints/predicate/universal.py +73 -0
- v0/relationalai/early_access/dsl/core/constraints/scalar.py +310 -0
- v0/relationalai/early_access/dsl/core/context.py +13 -0
- v0/relationalai/early_access/dsl/core/cset.py +132 -0
- v0/relationalai/early_access/dsl/core/exprs/__init__.py +116 -0
- v0/relationalai/early_access/dsl/core/exprs/relational.py +18 -0
- v0/relationalai/early_access/dsl/core/exprs/scalar.py +412 -0
- v0/relationalai/early_access/dsl/core/instances.py +44 -0
- v0/relationalai/early_access/dsl/core/logic/__init__.py +193 -0
- v0/relationalai/early_access/dsl/core/logic/aggregation.py +98 -0
- v0/relationalai/early_access/dsl/core/logic/exists.py +223 -0
- v0/relationalai/early_access/dsl/core/logic/helper.py +163 -0
- v0/relationalai/early_access/dsl/core/namespaces.py +32 -0
- v0/relationalai/early_access/dsl/core/relations.py +276 -0
- v0/relationalai/early_access/dsl/core/rules.py +112 -0
- v0/relationalai/early_access/dsl/core/std/__init__.py +45 -0
- v0/relationalai/early_access/dsl/core/temporal/recall.py +6 -0
- v0/relationalai/early_access/dsl/core/types/__init__.py +270 -0
- v0/relationalai/early_access/dsl/core/types/concepts.py +128 -0
- v0/relationalai/early_access/dsl/core/types/constrained/__init__.py +267 -0
- v0/relationalai/early_access/dsl/core/types/constrained/nominal.py +143 -0
- v0/relationalai/early_access/dsl/core/types/constrained/subtype.py +124 -0
- v0/relationalai/early_access/dsl/core/types/standard.py +92 -0
- v0/relationalai/early_access/dsl/core/types/unconstrained.py +50 -0
- v0/relationalai/early_access/dsl/core/types/variables.py +203 -0
- v0/relationalai/early_access/dsl/ir/compiler.py +318 -0
- v0/relationalai/early_access/dsl/ir/executor.py +260 -0
- v0/relationalai/early_access/dsl/ontologies/constraints.py +88 -0
- v0/relationalai/early_access/dsl/ontologies/export.py +30 -0
- v0/relationalai/early_access/dsl/ontologies/models.py +453 -0
- v0/relationalai/early_access/dsl/ontologies/python_printer.py +303 -0
- v0/relationalai/early_access/dsl/ontologies/readings.py +60 -0
- v0/relationalai/early_access/dsl/ontologies/relationships.py +322 -0
- v0/relationalai/early_access/dsl/ontologies/roles.py +87 -0
- v0/relationalai/early_access/dsl/ontologies/subtyping.py +55 -0
- v0/relationalai/early_access/dsl/orm/constraints.py +438 -0
- v0/relationalai/early_access/dsl/orm/measures/dimensions.py +200 -0
- v0/relationalai/early_access/dsl/orm/measures/initializer.py +16 -0
- v0/relationalai/early_access/dsl/orm/measures/measure_rules.py +275 -0
- v0/relationalai/early_access/dsl/orm/measures/measures.py +299 -0
- v0/relationalai/early_access/dsl/orm/measures/role_exprs.py +268 -0
- v0/relationalai/early_access/dsl/orm/models.py +256 -0
- v0/relationalai/early_access/dsl/orm/object_oriented_printer.py +344 -0
- v0/relationalai/early_access/dsl/orm/printer.py +469 -0
- v0/relationalai/early_access/dsl/orm/reasoners.py +480 -0
- v0/relationalai/early_access/dsl/orm/relations.py +19 -0
- v0/relationalai/early_access/dsl/orm/relationships.py +251 -0
- v0/relationalai/early_access/dsl/orm/types.py +42 -0
- v0/relationalai/early_access/dsl/orm/utils.py +79 -0
- v0/relationalai/early_access/dsl/orm/verb.py +204 -0
- v0/relationalai/early_access/dsl/physical_metadata/tables.py +133 -0
- v0/relationalai/early_access/dsl/relations.py +170 -0
- v0/relationalai/early_access/dsl/rulesets.py +69 -0
- v0/relationalai/early_access/dsl/schemas/__init__.py +450 -0
- v0/relationalai/early_access/dsl/schemas/builder.py +48 -0
- v0/relationalai/early_access/dsl/schemas/comp_names.py +51 -0
- v0/relationalai/early_access/dsl/schemas/components.py +203 -0
- v0/relationalai/early_access/dsl/schemas/contexts.py +156 -0
- v0/relationalai/early_access/dsl/schemas/exprs.py +89 -0
- v0/relationalai/early_access/dsl/schemas/fragments.py +464 -0
- v0/relationalai/early_access/dsl/serialization.py +79 -0
- v0/relationalai/early_access/dsl/serialize/exporter.py +163 -0
- v0/relationalai/early_access/dsl/snow/api.py +104 -0
- v0/relationalai/early_access/dsl/snow/common.py +76 -0
- v0/relationalai/early_access/dsl/state_mgmt/__init__.py +129 -0
- v0/relationalai/early_access/dsl/state_mgmt/state_charts.py +125 -0
- v0/relationalai/early_access/dsl/state_mgmt/transitions.py +130 -0
- v0/relationalai/early_access/dsl/types/__init__.py +40 -0
- v0/relationalai/early_access/dsl/types/concepts.py +12 -0
- v0/relationalai/early_access/dsl/types/entities.py +135 -0
- v0/relationalai/early_access/dsl/types/values.py +17 -0
- v0/relationalai/early_access/dsl/utils.py +102 -0
- v0/relationalai/early_access/graphs/__init__.py +13 -0
- v0/relationalai/early_access/lqp/__init__.py +12 -0
- v0/relationalai/early_access/lqp/compiler/__init__.py +12 -0
- v0/relationalai/early_access/lqp/constructors/__init__.py +18 -0
- v0/relationalai/early_access/lqp/executor/__init__.py +12 -0
- v0/relationalai/early_access/lqp/ir/__init__.py +12 -0
- v0/relationalai/early_access/lqp/passes/__init__.py +12 -0
- v0/relationalai/early_access/lqp/pragmas/__init__.py +12 -0
- v0/relationalai/early_access/lqp/primitives/__init__.py +12 -0
- v0/relationalai/early_access/lqp/types/__init__.py +12 -0
- v0/relationalai/early_access/lqp/utils/__init__.py +12 -0
- v0/relationalai/early_access/lqp/validators/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/__init__.py +58 -0
- v0/relationalai/early_access/metamodel/builtins/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/compiler/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/dependency/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/factory/__init__.py +17 -0
- v0/relationalai/early_access/metamodel/helpers/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/ir/__init__.py +14 -0
- v0/relationalai/early_access/metamodel/rewrite/__init__.py +7 -0
- v0/relationalai/early_access/metamodel/typer/__init__.py +3 -0
- v0/relationalai/early_access/metamodel/typer/typer/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/types/__init__.py +15 -0
- v0/relationalai/early_access/metamodel/util/__init__.py +15 -0
- v0/relationalai/early_access/metamodel/visitor/__init__.py +12 -0
- v0/relationalai/early_access/rel/__init__.py +12 -0
- v0/relationalai/early_access/rel/executor/__init__.py +12 -0
- v0/relationalai/early_access/rel/rel_utils/__init__.py +12 -0
- v0/relationalai/early_access/rel/rewrite/__init__.py +7 -0
- v0/relationalai/early_access/solvers/__init__.py +19 -0
- v0/relationalai/early_access/sql/__init__.py +11 -0
- v0/relationalai/early_access/sql/executor/__init__.py +3 -0
- v0/relationalai/early_access/sql/rewrite/__init__.py +3 -0
- v0/relationalai/early_access/tests/logging/__init__.py +12 -0
- v0/relationalai/early_access/tests/test_snapshot_base/__init__.py +12 -0
- v0/relationalai/early_access/tests/utils/__init__.py +12 -0
- v0/relationalai/environments/__init__.py +35 -0
- v0/relationalai/environments/base.py +381 -0
- v0/relationalai/environments/colab.py +14 -0
- v0/relationalai/environments/generic.py +71 -0
- v0/relationalai/environments/ipython.py +68 -0
- v0/relationalai/environments/jupyter.py +9 -0
- v0/relationalai/environments/snowbook.py +169 -0
- v0/relationalai/errors.py +2455 -0
- v0/relationalai/experimental/SF.py +38 -0
- v0/relationalai/experimental/inspect.py +47 -0
- v0/relationalai/experimental/pathfinder/__init__.py +158 -0
- v0/relationalai/experimental/pathfinder/api.py +160 -0
- v0/relationalai/experimental/pathfinder/automaton.py +584 -0
- v0/relationalai/experimental/pathfinder/bridge.py +226 -0
- v0/relationalai/experimental/pathfinder/compiler.py +416 -0
- v0/relationalai/experimental/pathfinder/datalog.py +214 -0
- v0/relationalai/experimental/pathfinder/diagnostics.py +56 -0
- v0/relationalai/experimental/pathfinder/filter.py +236 -0
- v0/relationalai/experimental/pathfinder/glushkov.py +439 -0
- v0/relationalai/experimental/pathfinder/options.py +265 -0
- v0/relationalai/experimental/pathfinder/rpq.py +344 -0
- v0/relationalai/experimental/pathfinder/transition.py +200 -0
- v0/relationalai/experimental/pathfinder/utils.py +26 -0
- v0/relationalai/experimental/paths/api.py +143 -0
- v0/relationalai/experimental/paths/benchmarks/grid_graph.py +37 -0
- v0/relationalai/experimental/paths/examples/basic_example.py +40 -0
- v0/relationalai/experimental/paths/examples/minimal_engine_warmup.py +3 -0
- v0/relationalai/experimental/paths/examples/movie_example.py +77 -0
- v0/relationalai/experimental/paths/examples/paths_benchmark.py +115 -0
- v0/relationalai/experimental/paths/examples/paths_example.py +116 -0
- v0/relationalai/experimental/paths/examples/pattern_to_automaton.py +28 -0
- v0/relationalai/experimental/paths/find_paths_via_automaton.py +85 -0
- v0/relationalai/experimental/paths/graph.py +185 -0
- v0/relationalai/experimental/paths/path_algorithms/find_paths.py +280 -0
- v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +26 -0
- v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +111 -0
- v0/relationalai/experimental/paths/path_algorithms/single.py +59 -0
- v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +39 -0
- v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +103 -0
- v0/relationalai/experimental/paths/path_algorithms/usp-old.py +130 -0
- v0/relationalai/experimental/paths/path_algorithms/usp-tuple.py +183 -0
- v0/relationalai/experimental/paths/path_algorithms/usp.py +150 -0
- v0/relationalai/experimental/paths/product_graph.py +93 -0
- v0/relationalai/experimental/paths/rpq/automaton.py +584 -0
- v0/relationalai/experimental/paths/rpq/diagnostics.py +56 -0
- v0/relationalai/experimental/paths/rpq/rpq.py +378 -0
- v0/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +90 -0
- v0/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +119 -0
- v0/relationalai/experimental/paths/tests/tests_limit_sp_single.py +104 -0
- v0/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +113 -0
- v0/relationalai/experimental/paths/tests/tests_limit_walks_single.py +149 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +70 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +64 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +115 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +75 -0
- v0/relationalai/experimental/paths/tests/tests_single_paths.py +152 -0
- v0/relationalai/experimental/paths/tests/tests_single_walks.py +208 -0
- v0/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +297 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +107 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +76 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +76 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +110 -0
- v0/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +229 -0
- v0/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +108 -0
- v0/relationalai/experimental/paths/tree_agg.py +168 -0
- v0/relationalai/experimental/paths/utilities/iterators.py +27 -0
- v0/relationalai/experimental/paths/utilities/prefix_sum.py +91 -0
- v0/relationalai/experimental/solvers.py +1087 -0
- v0/relationalai/loaders/__init__.py +0 -0
- v0/relationalai/loaders/csv.py +195 -0
- v0/relationalai/loaders/loader.py +177 -0
- v0/relationalai/loaders/types.py +23 -0
- v0/relationalai/rel_emitter.py +373 -0
- v0/relationalai/rel_utils.py +185 -0
- v0/relationalai/semantics/__init__.py +29 -0
- v0/relationalai/semantics/devtools/benchmark_lqp.py +536 -0
- v0/relationalai/semantics/devtools/compilation_manager.py +294 -0
- v0/relationalai/semantics/devtools/extract_lqp.py +110 -0
- v0/relationalai/semantics/internal/internal.py +3785 -0
- v0/relationalai/semantics/internal/snowflake.py +324 -0
- v0/relationalai/semantics/lqp/builtins.py +16 -0
- v0/relationalai/semantics/lqp/compiler.py +22 -0
- v0/relationalai/semantics/lqp/constructors.py +68 -0
- v0/relationalai/semantics/lqp/executor.py +469 -0
- v0/relationalai/semantics/lqp/intrinsics.py +24 -0
- v0/relationalai/semantics/lqp/model2lqp.py +839 -0
- v0/relationalai/semantics/lqp/passes.py +680 -0
- v0/relationalai/semantics/lqp/primitives.py +252 -0
- v0/relationalai/semantics/lqp/result_helpers.py +202 -0
- v0/relationalai/semantics/lqp/rewrite/annotate_constraints.py +57 -0
- v0/relationalai/semantics/lqp/rewrite/cdc.py +216 -0
- v0/relationalai/semantics/lqp/rewrite/extract_common.py +338 -0
- v0/relationalai/semantics/lqp/rewrite/extract_keys.py +449 -0
- v0/relationalai/semantics/lqp/rewrite/function_annotations.py +114 -0
- v0/relationalai/semantics/lqp/rewrite/functional_dependencies.py +314 -0
- v0/relationalai/semantics/lqp/rewrite/quantify_vars.py +296 -0
- v0/relationalai/semantics/lqp/rewrite/splinter.py +76 -0
- v0/relationalai/semantics/lqp/types.py +101 -0
- v0/relationalai/semantics/lqp/utils.py +160 -0
- v0/relationalai/semantics/lqp/validators.py +57 -0
- v0/relationalai/semantics/metamodel/__init__.py +40 -0
- v0/relationalai/semantics/metamodel/builtins.py +774 -0
- v0/relationalai/semantics/metamodel/compiler.py +133 -0
- v0/relationalai/semantics/metamodel/dependency.py +862 -0
- v0/relationalai/semantics/metamodel/executor.py +61 -0
- v0/relationalai/semantics/metamodel/factory.py +287 -0
- v0/relationalai/semantics/metamodel/helpers.py +361 -0
- v0/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +39 -0
- v0/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +210 -0
- v0/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +78 -0
- v0/relationalai/semantics/metamodel/rewrite/flatten.py +549 -0
- v0/relationalai/semantics/metamodel/rewrite/format_outputs.py +165 -0
- v0/relationalai/semantics/metamodel/typer/checker.py +353 -0
- v0/relationalai/semantics/metamodel/typer/typer.py +1395 -0
- v0/relationalai/semantics/reasoners/__init__.py +10 -0
- v0/relationalai/semantics/reasoners/graph/__init__.py +37 -0
- v0/relationalai/semantics/reasoners/graph/core.py +9020 -0
- v0/relationalai/semantics/reasoners/optimization/__init__.py +68 -0
- v0/relationalai/semantics/reasoners/optimization/common.py +88 -0
- v0/relationalai/semantics/reasoners/optimization/solvers_dev.py +568 -0
- v0/relationalai/semantics/reasoners/optimization/solvers_pb.py +1163 -0
- v0/relationalai/semantics/rel/builtins.py +40 -0
- v0/relationalai/semantics/rel/compiler.py +989 -0
- v0/relationalai/semantics/rel/executor.py +359 -0
- v0/relationalai/semantics/rel/rel.py +482 -0
- v0/relationalai/semantics/rel/rel_utils.py +276 -0
- v0/relationalai/semantics/snowflake/__init__.py +3 -0
- v0/relationalai/semantics/sql/compiler.py +2503 -0
- v0/relationalai/semantics/sql/executor/duck_db.py +52 -0
- v0/relationalai/semantics/sql/executor/result_helpers.py +64 -0
- v0/relationalai/semantics/sql/executor/snowflake.py +145 -0
- v0/relationalai/semantics/sql/rewrite/denormalize.py +222 -0
- v0/relationalai/semantics/sql/rewrite/double_negation.py +49 -0
- v0/relationalai/semantics/sql/rewrite/recursive_union.py +127 -0
- v0/relationalai/semantics/sql/rewrite/sort_output_query.py +246 -0
- v0/relationalai/semantics/sql/sql.py +504 -0
- v0/relationalai/semantics/std/__init__.py +54 -0
- v0/relationalai/semantics/std/constraints.py +43 -0
- v0/relationalai/semantics/std/datetime.py +363 -0
- v0/relationalai/semantics/std/decimals.py +62 -0
- v0/relationalai/semantics/std/floats.py +7 -0
- v0/relationalai/semantics/std/integers.py +22 -0
- v0/relationalai/semantics/std/math.py +141 -0
- v0/relationalai/semantics/std/pragmas.py +11 -0
- v0/relationalai/semantics/std/re.py +83 -0
- v0/relationalai/semantics/std/std.py +14 -0
- v0/relationalai/semantics/std/strings.py +63 -0
- v0/relationalai/semantics/tests/__init__.py +0 -0
- v0/relationalai/semantics/tests/test_snapshot_abstract.py +143 -0
- v0/relationalai/semantics/tests/test_snapshot_base.py +9 -0
- v0/relationalai/semantics/tests/utils.py +46 -0
- v0/relationalai/std/__init__.py +70 -0
- v0/relationalai/tools/__init__.py +0 -0
- v0/relationalai/tools/cli.py +1940 -0
- v0/relationalai/tools/cli_controls.py +1826 -0
- v0/relationalai/tools/cli_helpers.py +390 -0
- v0/relationalai/tools/debugger.py +183 -0
- v0/relationalai/tools/debugger_client.py +109 -0
- v0/relationalai/tools/debugger_server.py +302 -0
- v0/relationalai/tools/dev.py +685 -0
- v0/relationalai/tools/qb_debugger.py +425 -0
- v0/relationalai/util/clean_up_databases.py +95 -0
- v0/relationalai/util/format.py +123 -0
- v0/relationalai/util/list_databases.py +9 -0
- v0/relationalai/util/otel_configuration.py +25 -0
- v0/relationalai/util/otel_handler.py +484 -0
- v0/relationalai/util/snowflake_handler.py +88 -0
- v0/relationalai/util/span_format_test.py +43 -0
- v0/relationalai/util/span_tracker.py +207 -0
- v0/relationalai/util/spans_file_handler.py +72 -0
- v0/relationalai/util/tracing_handler.py +34 -0
- frontend/debugger/dist/.gitignore +0 -2
- frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
- frontend/debugger/dist/assets/index-Cssla-O7.js +0 -208
- frontend/debugger/dist/assets/index-DlHsYx1V.css +0 -9
- frontend/debugger/dist/index.html +0 -17
- relationalai/clients/azure.py +0 -477
- relationalai/clients/client.py +0 -912
- relationalai/clients/config.py +0 -673
- relationalai/clients/direct_access_client.py +0 -118
- relationalai/clients/export_procedure.py.jinja +0 -249
- relationalai/clients/hash_util.py +0 -31
- relationalai/clients/local.py +0 -571
- relationalai/clients/profile_polling.py +0 -73
- relationalai/clients/result_helpers.py +0 -420
- relationalai/clients/snowflake.py +0 -3869
- relationalai/clients/types.py +0 -113
- relationalai/clients/use_index_poller.py +0 -980
- relationalai/clients/util.py +0 -356
- relationalai/debugging.py +0 -389
- relationalai/dsl.py +0 -1749
- relationalai/early_access/builder/__init__.py +0 -30
- relationalai/early_access/builder/builder/__init__.py +0 -35
- relationalai/early_access/builder/snowflake/__init__.py +0 -12
- relationalai/early_access/builder/std/__init__.py +0 -25
- relationalai/early_access/builder/std/decimals/__init__.py +0 -12
- relationalai/early_access/builder/std/integers/__init__.py +0 -12
- relationalai/early_access/builder/std/math/__init__.py +0 -12
- relationalai/early_access/builder/std/strings/__init__.py +0 -14
- relationalai/early_access/devtools/__init__.py +0 -12
- relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -12
- relationalai/early_access/devtools/extract_lqp/__init__.py +0 -12
- relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -427
- relationalai/early_access/dsl/adapters/orm/parser.py +0 -636
- relationalai/early_access/dsl/adapters/owl/adapter.py +0 -176
- relationalai/early_access/dsl/adapters/owl/parser.py +0 -160
- relationalai/early_access/dsl/bindings/common.py +0 -402
- relationalai/early_access/dsl/bindings/csv.py +0 -170
- relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -143
- relationalai/early_access/dsl/bindings/snowflake.py +0 -64
- relationalai/early_access/dsl/codegen/binder.py +0 -411
- relationalai/early_access/dsl/codegen/common.py +0 -79
- relationalai/early_access/dsl/codegen/helpers.py +0 -23
- relationalai/early_access/dsl/codegen/relations.py +0 -700
- relationalai/early_access/dsl/codegen/weaver.py +0 -417
- relationalai/early_access/dsl/core/builders/__init__.py +0 -47
- relationalai/early_access/dsl/core/builders/logic.py +0 -19
- relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -11
- relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -455
- relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -73
- relationalai/early_access/dsl/core/constraints/scalar.py +0 -310
- relationalai/early_access/dsl/core/context.py +0 -13
- relationalai/early_access/dsl/core/cset.py +0 -132
- relationalai/early_access/dsl/core/exprs/__init__.py +0 -116
- relationalai/early_access/dsl/core/exprs/relational.py +0 -18
- relationalai/early_access/dsl/core/exprs/scalar.py +0 -412
- relationalai/early_access/dsl/core/instances.py +0 -44
- relationalai/early_access/dsl/core/logic/__init__.py +0 -193
- relationalai/early_access/dsl/core/logic/aggregation.py +0 -98
- relationalai/early_access/dsl/core/logic/exists.py +0 -223
- relationalai/early_access/dsl/core/logic/helper.py +0 -163
- relationalai/early_access/dsl/core/namespaces.py +0 -32
- relationalai/early_access/dsl/core/relations.py +0 -276
- relationalai/early_access/dsl/core/rules.py +0 -112
- relationalai/early_access/dsl/core/std/__init__.py +0 -45
- relationalai/early_access/dsl/core/temporal/recall.py +0 -6
- relationalai/early_access/dsl/core/types/__init__.py +0 -270
- relationalai/early_access/dsl/core/types/concepts.py +0 -128
- relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -267
- relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -143
- relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -124
- relationalai/early_access/dsl/core/types/standard.py +0 -92
- relationalai/early_access/dsl/core/types/unconstrained.py +0 -50
- relationalai/early_access/dsl/core/types/variables.py +0 -203
- relationalai/early_access/dsl/ir/compiler.py +0 -318
- relationalai/early_access/dsl/ir/executor.py +0 -260
- relationalai/early_access/dsl/ontologies/constraints.py +0 -88
- relationalai/early_access/dsl/ontologies/export.py +0 -30
- relationalai/early_access/dsl/ontologies/models.py +0 -453
- relationalai/early_access/dsl/ontologies/python_printer.py +0 -303
- relationalai/early_access/dsl/ontologies/readings.py +0 -60
- relationalai/early_access/dsl/ontologies/relationships.py +0 -322
- relationalai/early_access/dsl/ontologies/roles.py +0 -87
- relationalai/early_access/dsl/ontologies/subtyping.py +0 -55
- relationalai/early_access/dsl/orm/constraints.py +0 -438
- relationalai/early_access/dsl/orm/measures/dimensions.py +0 -200
- relationalai/early_access/dsl/orm/measures/initializer.py +0 -16
- relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -275
- relationalai/early_access/dsl/orm/measures/measures.py +0 -299
- relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -268
- relationalai/early_access/dsl/orm/models.py +0 -256
- relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -344
- relationalai/early_access/dsl/orm/printer.py +0 -469
- relationalai/early_access/dsl/orm/reasoners.py +0 -480
- relationalai/early_access/dsl/orm/relations.py +0 -19
- relationalai/early_access/dsl/orm/relationships.py +0 -251
- relationalai/early_access/dsl/orm/types.py +0 -42
- relationalai/early_access/dsl/orm/utils.py +0 -79
- relationalai/early_access/dsl/orm/verb.py +0 -204
- relationalai/early_access/dsl/physical_metadata/tables.py +0 -133
- relationalai/early_access/dsl/relations.py +0 -170
- relationalai/early_access/dsl/rulesets.py +0 -69
- relationalai/early_access/dsl/schemas/__init__.py +0 -450
- relationalai/early_access/dsl/schemas/builder.py +0 -48
- relationalai/early_access/dsl/schemas/comp_names.py +0 -51
- relationalai/early_access/dsl/schemas/components.py +0 -203
- relationalai/early_access/dsl/schemas/contexts.py +0 -156
- relationalai/early_access/dsl/schemas/exprs.py +0 -89
- relationalai/early_access/dsl/schemas/fragments.py +0 -464
- relationalai/early_access/dsl/serialization.py +0 -79
- relationalai/early_access/dsl/serialize/exporter.py +0 -163
- relationalai/early_access/dsl/snow/api.py +0 -104
- relationalai/early_access/dsl/snow/common.py +0 -76
- relationalai/early_access/dsl/state_mgmt/__init__.py +0 -129
- relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -125
- relationalai/early_access/dsl/state_mgmt/transitions.py +0 -130
- relationalai/early_access/dsl/types/__init__.py +0 -40
- relationalai/early_access/dsl/types/concepts.py +0 -12
- relationalai/early_access/dsl/types/entities.py +0 -135
- relationalai/early_access/dsl/types/values.py +0 -17
- relationalai/early_access/dsl/utils.py +0 -102
- relationalai/early_access/graphs/__init__.py +0 -13
- relationalai/early_access/lqp/__init__.py +0 -12
- relationalai/early_access/lqp/compiler/__init__.py +0 -12
- relationalai/early_access/lqp/constructors/__init__.py +0 -18
- relationalai/early_access/lqp/executor/__init__.py +0 -12
- relationalai/early_access/lqp/ir/__init__.py +0 -12
- relationalai/early_access/lqp/passes/__init__.py +0 -12
- relationalai/early_access/lqp/pragmas/__init__.py +0 -12
- relationalai/early_access/lqp/primitives/__init__.py +0 -12
- relationalai/early_access/lqp/types/__init__.py +0 -12
- relationalai/early_access/lqp/utils/__init__.py +0 -12
- relationalai/early_access/lqp/validators/__init__.py +0 -12
- relationalai/early_access/metamodel/__init__.py +0 -58
- relationalai/early_access/metamodel/builtins/__init__.py +0 -12
- relationalai/early_access/metamodel/compiler/__init__.py +0 -12
- relationalai/early_access/metamodel/dependency/__init__.py +0 -12
- relationalai/early_access/metamodel/factory/__init__.py +0 -17
- relationalai/early_access/metamodel/helpers/__init__.py +0 -12
- relationalai/early_access/metamodel/ir/__init__.py +0 -14
- relationalai/early_access/metamodel/rewrite/__init__.py +0 -7
- relationalai/early_access/metamodel/typer/__init__.py +0 -3
- relationalai/early_access/metamodel/typer/typer/__init__.py +0 -12
- relationalai/early_access/metamodel/types/__init__.py +0 -15
- relationalai/early_access/metamodel/util/__init__.py +0 -15
- relationalai/early_access/metamodel/visitor/__init__.py +0 -12
- relationalai/early_access/rel/__init__.py +0 -12
- relationalai/early_access/rel/executor/__init__.py +0 -12
- relationalai/early_access/rel/rel_utils/__init__.py +0 -12
- relationalai/early_access/rel/rewrite/__init__.py +0 -7
- relationalai/early_access/solvers/__init__.py +0 -19
- relationalai/early_access/sql/__init__.py +0 -11
- relationalai/early_access/sql/executor/__init__.py +0 -3
- relationalai/early_access/sql/rewrite/__init__.py +0 -3
- relationalai/early_access/tests/logging/__init__.py +0 -12
- relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -12
- relationalai/early_access/tests/utils/__init__.py +0 -12
- relationalai/environments/__init__.py +0 -35
- relationalai/environments/base.py +0 -381
- relationalai/environments/colab.py +0 -14
- relationalai/environments/generic.py +0 -71
- relationalai/environments/ipython.py +0 -68
- relationalai/environments/jupyter.py +0 -9
- relationalai/environments/snowbook.py +0 -169
- relationalai/errors.py +0 -2455
- relationalai/experimental/SF.py +0 -38
- relationalai/experimental/inspect.py +0 -47
- relationalai/experimental/pathfinder/__init__.py +0 -158
- relationalai/experimental/pathfinder/api.py +0 -160
- relationalai/experimental/pathfinder/automaton.py +0 -584
- relationalai/experimental/pathfinder/bridge.py +0 -226
- relationalai/experimental/pathfinder/compiler.py +0 -416
- relationalai/experimental/pathfinder/datalog.py +0 -214
- relationalai/experimental/pathfinder/diagnostics.py +0 -56
- relationalai/experimental/pathfinder/filter.py +0 -236
- relationalai/experimental/pathfinder/glushkov.py +0 -439
- relationalai/experimental/pathfinder/options.py +0 -265
- relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +0 -1951
- relationalai/experimental/pathfinder/rpq.py +0 -344
- relationalai/experimental/pathfinder/transition.py +0 -200
- relationalai/experimental/pathfinder/utils.py +0 -26
- relationalai/experimental/paths/README.md +0 -107
- relationalai/experimental/paths/api.py +0 -143
- relationalai/experimental/paths/benchmarks/grid_graph.py +0 -37
- relationalai/experimental/paths/code_organization.md +0 -2
- relationalai/experimental/paths/examples/Movies.ipynb +0 -16328
- relationalai/experimental/paths/examples/basic_example.py +0 -40
- relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -3
- relationalai/experimental/paths/examples/movie_example.py +0 -77
- relationalai/experimental/paths/examples/movies_data/actedin.csv +0 -193
- relationalai/experimental/paths/examples/movies_data/directed.csv +0 -45
- relationalai/experimental/paths/examples/movies_data/follows.csv +0 -7
- relationalai/experimental/paths/examples/movies_data/movies.csv +0 -39
- relationalai/experimental/paths/examples/movies_data/person.csv +0 -134
- relationalai/experimental/paths/examples/movies_data/produced.csv +0 -16
- relationalai/experimental/paths/examples/movies_data/ratings.csv +0 -10
- relationalai/experimental/paths/examples/movies_data/wrote.csv +0 -11
- relationalai/experimental/paths/examples/paths_benchmark.py +0 -115
- relationalai/experimental/paths/examples/paths_example.py +0 -116
- relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -28
- relationalai/experimental/paths/find_paths_via_automaton.py +0 -85
- relationalai/experimental/paths/graph.py +0 -185
- relationalai/experimental/paths/path_algorithms/find_paths.py +0 -280
- relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -26
- relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -111
- relationalai/experimental/paths/path_algorithms/single.py +0 -59
- relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -39
- relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -103
- relationalai/experimental/paths/path_algorithms/usp-old.py +0 -130
- relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -183
- relationalai/experimental/paths/path_algorithms/usp.py +0 -150
- relationalai/experimental/paths/product_graph.py +0 -93
- relationalai/experimental/paths/rpq/automaton.py +0 -584
- relationalai/experimental/paths/rpq/diagnostics.py +0 -56
- relationalai/experimental/paths/rpq/rpq.py +0 -378
- relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -90
- relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -119
- relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -104
- relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -113
- relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -149
- relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -70
- relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -64
- relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -115
- relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -75
- relationalai/experimental/paths/tests/tests_single_paths.py +0 -152
- relationalai/experimental/paths/tests/tests_single_walks.py +0 -208
- relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -297
- relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -107
- relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -76
- relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -76
- relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -110
- relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -229
- relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -108
- relationalai/experimental/paths/tree_agg.py +0 -168
- relationalai/experimental/paths/utilities/iterators.py +0 -27
- relationalai/experimental/paths/utilities/prefix_sum.py +0 -91
- relationalai/experimental/solvers.py +0 -1087
- relationalai/loaders/csv.py +0 -195
- relationalai/loaders/loader.py +0 -177
- relationalai/loaders/types.py +0 -23
- relationalai/rel_emitter.py +0 -373
- relationalai/rel_utils.py +0 -185
- relationalai/semantics/designs/query_builder/identify_by.md +0 -106
- relationalai/semantics/devtools/benchmark_lqp.py +0 -536
- relationalai/semantics/devtools/compilation_manager.py +0 -294
- relationalai/semantics/devtools/extract_lqp.py +0 -110
- relationalai/semantics/internal/internal.py +0 -3785
- relationalai/semantics/internal/snowflake.py +0 -324
- relationalai/semantics/lqp/README.md +0 -34
- relationalai/semantics/lqp/builtins.py +0 -16
- relationalai/semantics/lqp/compiler.py +0 -22
- relationalai/semantics/lqp/constructors.py +0 -68
- relationalai/semantics/lqp/executor.py +0 -469
- relationalai/semantics/lqp/intrinsics.py +0 -24
- relationalai/semantics/lqp/model2lqp.py +0 -839
- relationalai/semantics/lqp/passes.py +0 -680
- relationalai/semantics/lqp/primitives.py +0 -252
- relationalai/semantics/lqp/result_helpers.py +0 -202
- relationalai/semantics/lqp/rewrite/annotate_constraints.py +0 -57
- relationalai/semantics/lqp/rewrite/cdc.py +0 -216
- relationalai/semantics/lqp/rewrite/extract_common.py +0 -338
- relationalai/semantics/lqp/rewrite/extract_keys.py +0 -449
- relationalai/semantics/lqp/rewrite/function_annotations.py +0 -114
- relationalai/semantics/lqp/rewrite/functional_dependencies.py +0 -314
- relationalai/semantics/lqp/rewrite/quantify_vars.py +0 -296
- relationalai/semantics/lqp/rewrite/splinter.py +0 -76
- relationalai/semantics/lqp/types.py +0 -101
- relationalai/semantics/lqp/utils.py +0 -160
- relationalai/semantics/lqp/validators.py +0 -57
- relationalai/semantics/metamodel/compiler.py +0 -133
- relationalai/semantics/metamodel/dependency.py +0 -862
- relationalai/semantics/metamodel/executor.py +0 -61
- relationalai/semantics/metamodel/factory.py +0 -287
- relationalai/semantics/metamodel/helpers.py +0 -361
- relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -39
- relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -210
- relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -78
- relationalai/semantics/metamodel/rewrite/flatten.py +0 -549
- relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -165
- relationalai/semantics/metamodel/typer/checker.py +0 -353
- relationalai/semantics/metamodel/typer/typer.py +0 -1395
- relationalai/semantics/reasoners/__init__.py +0 -10
- relationalai/semantics/reasoners/graph/README.md +0 -620
- relationalai/semantics/reasoners/graph/__init__.py +0 -37
- relationalai/semantics/reasoners/graph/core.py +0 -9020
- relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +0 -797
- relationalai/semantics/reasoners/graph/tests/README.md +0 -21
- relationalai/semantics/reasoners/optimization/__init__.py +0 -68
- relationalai/semantics/reasoners/optimization/common.py +0 -88
- relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -568
- relationalai/semantics/reasoners/optimization/solvers_pb.py +0 -1163
- relationalai/semantics/rel/builtins.py +0 -40
- relationalai/semantics/rel/compiler.py +0 -989
- relationalai/semantics/rel/executor.py +0 -359
- relationalai/semantics/rel/rel.py +0 -482
- relationalai/semantics/rel/rel_utils.py +0 -276
- relationalai/semantics/snowflake/__init__.py +0 -3
- relationalai/semantics/sql/compiler.py +0 -2503
- relationalai/semantics/sql/executor/duck_db.py +0 -52
- relationalai/semantics/sql/executor/result_helpers.py +0 -64
- relationalai/semantics/sql/executor/snowflake.py +0 -145
- relationalai/semantics/sql/rewrite/denormalize.py +0 -222
- relationalai/semantics/sql/rewrite/double_negation.py +0 -49
- relationalai/semantics/sql/rewrite/recursive_union.py +0 -127
- relationalai/semantics/sql/rewrite/sort_output_query.py +0 -246
- relationalai/semantics/sql/sql.py +0 -504
- relationalai/semantics/std/pragmas.py +0 -11
- relationalai/semantics/std/std.py +0 -14
- relationalai/semantics/tests/test_snapshot_abstract.py +0 -143
- relationalai/semantics/tests/test_snapshot_base.py +0 -9
- relationalai/semantics/tests/utils.py +0 -46
- relationalai/std/__init__.py +0 -70
- relationalai/tools/cli.py +0 -1940
- relationalai/tools/cli_controls.py +0 -1826
- relationalai/tools/cli_helpers.py +0 -390
- relationalai/tools/debugger_client.py +0 -109
- relationalai/tools/debugger_server.py +0 -302
- relationalai/tools/dev.py +0 -685
- relationalai/tools/notes +0 -7
- relationalai/tools/qb_debugger.py +0 -425
- relationalai/util/clean_up_databases.py +0 -95
- relationalai/util/list_databases.py +0 -9
- relationalai/util/otel_configuration.py +0 -25
- relationalai/util/otel_handler.py +0 -484
- relationalai/util/snowflake_handler.py +0 -88
- relationalai/util/span_format_test.py +0 -43
- relationalai/util/span_tracker.py +0 -207
- relationalai/util/spans_file_handler.py +0 -72
- relationalai/util/tracing_handler.py +0 -34
- relationalai-0.12.13.dist-info/METADATA +0 -74
- relationalai-0.12.13.dist-info/RECORD +0 -449
- relationalai-0.12.13.dist-info/WHEEL +0 -4
- relationalai-0.12.13.dist-info/entry_points.txt +0 -3
- relationalai-0.12.13.dist-info/licenses/LICENSE +0 -202
- relationalai_test_util/__init__.py +0 -4
- relationalai_test_util/fixtures.py +0 -228
- relationalai_test_util/snapshot.py +0 -252
- relationalai_test_util/traceback.py +0 -118
- /relationalai/{analysis → semantics/frontend}/__init__.py +0 -0
- /relationalai/{auth/__init__.py → semantics/metamodel/metamodel_compiler.py} +0 -0
- /relationalai/{early_access → shims}/__init__.py +0 -0
- {relationalai/early_access/dsl/adapters → v0/relationalai/analysis}/__init__.py +0 -0
- {relationalai → v0/relationalai}/analysis/mechanistic.py +0 -0
- {relationalai → v0/relationalai}/analysis/whynot.py +0 -0
- {relationalai/early_access/dsl/adapters/orm → v0/relationalai/auth}/__init__.py +0 -0
- {relationalai → v0/relationalai}/auth/jwt_generator.py +0 -0
- {relationalai → v0/relationalai}/auth/oauth_callback_server.py +0 -0
- {relationalai → v0/relationalai}/auth/token_handler.py +0 -0
- {relationalai → v0/relationalai}/auth/util.py +0 -0
- {relationalai → v0/relationalai}/clients/__init__.py +0 -0
- {relationalai → v0/relationalai}/clients/cache_store.py +0 -0
- {relationalai → v0/relationalai}/compiler.py +0 -0
- {relationalai → v0/relationalai}/dependencies.py +0 -0
- {relationalai → v0/relationalai}/docutils.py +0 -0
- {relationalai/early_access/dsl/adapters/owl → v0/relationalai/early_access}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/__init__.py +0 -0
- {relationalai/early_access/dsl/bindings → v0/relationalai/early_access/dsl/adapters}/__init__.py +0 -0
- {relationalai/early_access/dsl/bindings/legacy → v0/relationalai/early_access/dsl/adapters/orm}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/adapters/orm/model.py +0 -0
- {relationalai/early_access/dsl/codegen → v0/relationalai/early_access/dsl/adapters/owl}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/adapters/owl/model.py +0 -0
- {relationalai/early_access/dsl/core/temporal → v0/relationalai/early_access/dsl/bindings}/__init__.py +0 -0
- {relationalai/early_access/dsl/ir → v0/relationalai/early_access/dsl/bindings/legacy}/__init__.py +0 -0
- {relationalai/early_access/dsl/ontologies → v0/relationalai/early_access/dsl/codegen}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/constants.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/constraints/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/stack.py +0 -0
- {relationalai/early_access/dsl/orm → v0/relationalai/early_access/dsl/core/temporal}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/utils.py +0 -0
- {relationalai/early_access/dsl/orm/measures → v0/relationalai/early_access/dsl/ir}/__init__.py +0 -0
- {relationalai/early_access/dsl/physical_metadata → v0/relationalai/early_access/dsl/ontologies}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/ontologies/raw_source.py +0 -0
- {relationalai/early_access/dsl/serialize → v0/relationalai/early_access/dsl/orm}/__init__.py +0 -0
- {relationalai/early_access/dsl/snow → v0/relationalai/early_access/dsl/orm/measures}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/orm/reasoner_errors.py +0 -0
- {relationalai/loaders → v0/relationalai/early_access/dsl/physical_metadata}/__init__.py +0 -0
- {relationalai/semantics/tests → v0/relationalai/early_access/dsl/serialize}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/serialize/binding_model.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/serialize/model.py +0 -0
- {relationalai/tools → v0/relationalai/early_access/dsl/snow}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/tests/__init__.py +0 -0
- {relationalai → v0/relationalai}/environments/ci.py +0 -0
- {relationalai → v0/relationalai}/environments/hex.py +0 -0
- {relationalai → v0/relationalai}/environments/terminal.py +0 -0
- {relationalai → v0/relationalai}/experimental/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/graphs.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/benchmarks/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/path_algorithms/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/filter.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/glushkov.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/transition.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/utilities/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/utilities/utilities.py +0 -0
- {relationalai → v0/relationalai}/metagen.py +0 -0
- {relationalai → v0/relationalai}/metamodel.py +0 -0
- {relationalai → v0/relationalai}/rel.py +0 -0
- {relationalai → v0/relationalai}/semantics/devtools/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/internal/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/internal/annotations.py +0 -0
- {relationalai → v0/relationalai}/semantics/lqp/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/lqp/ir.py +0 -0
- {relationalai → v0/relationalai}/semantics/lqp/pragmas.py +0 -0
- {relationalai → v0/relationalai}/semantics/lqp/rewrite/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/dataflow.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/ir.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/rewrite/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/typer/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/types.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/util.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/visitor.py +0 -0
- {relationalai → v0/relationalai}/semantics/reasoners/experimental/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/rel/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/sql/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/sql/executor/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/sql/rewrite/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/tests/logging.py +0 -0
- {relationalai → v0/relationalai}/std/aggregates.py +0 -0
- {relationalai → v0/relationalai}/std/dates.py +0 -0
- {relationalai → v0/relationalai}/std/graphs.py +0 -0
- {relationalai → v0/relationalai}/std/inspect.py +0 -0
- {relationalai → v0/relationalai}/std/math.py +0 -0
- {relationalai → v0/relationalai}/std/re.py +0 -0
- {relationalai → v0/relationalai}/std/strings.py +0 -0
- {relationalai → v0/relationalai}/tools/cleanup_snapshots.py +0 -0
- {relationalai → v0/relationalai}/tools/constants.py +0 -0
- {relationalai → v0/relationalai}/tools/query_utils.py +0 -0
- {relationalai → v0/relationalai}/tools/snapshot_viewer.py +0 -0
- {relationalai → v0/relationalai}/util/__init__.py +0 -0
- {relationalai → v0/relationalai}/util/constants.py +0 -0
- {relationalai → v0/relationalai}/util/graph.py +0 -0
- {relationalai → v0/relationalai}/util/timeout.py +0 -0
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
The RelationalAI Semantics Reasoners Module.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
# Mark this package's docstrings for inclusion
|
|
6
|
-
# in automatically generated web documentation,
|
|
7
|
-
# by default as early access.
|
|
8
|
-
from relationalai.docutils import ProductStage
|
|
9
|
-
__include_in_docs__ = True
|
|
10
|
-
__rai_product_stage__ = ProductStage.EARLY_ACCESS
|
|
@@ -1,620 +0,0 @@
|
|
|
1
|
-
# graphs
|
|
2
|
-
|
|
3
|
-
This library allows users to define simple graphs, compute relations (algorithms) over those graphs, and work with the results, all in query builder.
|
|
4
|
-
|
|
5
|
-
This guide assumes you have a functional PyRel environment; to set one up, please see [the README for the relationalai-python repository](https://github.com/RelationalAI/relationalai-python/blob/main/README.md). It also assumes that you are familiar with query builder syntax; if not, please see [this overview of query builder syntax](https://github.com/RelationalAI/relationalai-python/blob/main/examples/builder/examples.py).
|
|
6
|
-
|
|
7
|
-
For information beyond what exists in this document, every public method (algorithm) of this library's `Graph` class carries a docstring describing its behavior and providing at least one usage example.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
# Development status
|
|
11
|
-
|
|
12
|
-
This library is still in the early stages of development. Please expect to encounter all manner of rough edges. Not all planned functionality is implemented. The graph constructors have only minimal guard rails. The interfaces of several algorithms _will_ change. Performance is appropriate only for exploring with toy graphs; there are known asymptotic catastrophes. For a rough sense of status and roadmap, please see [the Jira initiative tracking this library's development](https://relationalai.atlassian.net/browse/RAI-38809).
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
## Quick start guide
|
|
16
|
-
|
|
17
|
-
Let's start with an example of building a toy directed, weighted graph, and
|
|
18
|
-
compute something over it. Here we'll build that graph from literals; later
|
|
19
|
-
we'll build similar graphs from existing `Concept`s.
|
|
20
|
-
|
|
21
|
-
```python
|
|
22
|
-
# Import necessary query builder components.
|
|
23
|
-
from relationalai.semantics import Model
|
|
24
|
-
from relationalai.semantics import Integer, Float
|
|
25
|
-
from relationalai.semantics import define, select
|
|
26
|
-
|
|
27
|
-
# Import necessary graphs components.
|
|
28
|
-
from relationalai.semantics.reasoners.graph import Graph
|
|
29
|
-
# The library's main component is the `Graph` class. Construct instances
|
|
30
|
-
# of this class to build graphs, and call member methods of instances
|
|
31
|
-
# to compute over those graphs.
|
|
32
|
-
|
|
33
|
-
# Construct a model, in which to define the graph.
|
|
34
|
-
model = Model("toy_graph") # dry_run=False, use_lqp=False)
|
|
35
|
-
|
|
36
|
-
# Construct an unweighted, directed graph in `model`.
|
|
37
|
-
graph = Graph(model, directed=True, weighted=False)
|
|
38
|
-
|
|
39
|
-
# When the `Graph` constructor is invoked as above, it generates
|
|
40
|
-
# `Node` and `Edge` concepts, populating which defines the graph.
|
|
41
|
-
# (Later we'll see how to "bring your own" node and edge concepts.)
|
|
42
|
-
Node, Edge = graph.Node, graph.Edge
|
|
43
|
-
|
|
44
|
-
# Define four nodes from integer literals.
|
|
45
|
-
n1 = Node.new(id=1)
|
|
46
|
-
n2 = Node.new(id=2)
|
|
47
|
-
n3 = Node.new(id=3)
|
|
48
|
-
n4 = Node.new(id=4)
|
|
49
|
-
define(n1, n2, n3, n4)
|
|
50
|
-
|
|
51
|
-
# Define four edges between those nodes, forming a kite (a triangle with a tail).
|
|
52
|
-
define(
|
|
53
|
-
# The triangle.
|
|
54
|
-
Edge.new(src=n1, dst=n2),
|
|
55
|
-
Edge.new(src=n2, dst=n3),
|
|
56
|
-
Edge.new(src=n3, dst=n1),
|
|
57
|
-
# Its tail.
|
|
58
|
-
Edge.new(src=n3, dst=n4),
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
# Compute the outdegree of each node. Note that computations over graphs
|
|
62
|
-
# are nominally exposed as `Relationship`s containing the results of
|
|
63
|
-
# those computations. For example, here we retrieve the graph's
|
|
64
|
-
# `outdegree` `Relationship`, a binary relation mapping
|
|
65
|
-
# each node (`Node`) to its outdegree (`Integer`).
|
|
66
|
-
outdegree = graph.outdegree()
|
|
67
|
-
# Every public method such as `outdegree` has a docstring
|
|
68
|
-
# that provides more information, including at least one usage example.
|
|
69
|
-
|
|
70
|
-
# Query and inspect the contents of the `degree` `Relationship`.
|
|
71
|
-
select(Node.id, Integer).where(outdegree(Node, Integer)).inspect()
|
|
72
|
-
# The output will show the degree for each node, roughly:
|
|
73
|
-
# id int
|
|
74
|
-
# 0 1 1
|
|
75
|
-
# 1 2 1
|
|
76
|
-
# 2 3 2
|
|
77
|
-
# 3 4 0
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Great, but our models consist of `Concept`s and `Relationship`s, not literals!
|
|
81
|
-
How do we define graphs from those?
|
|
82
|
-
|
|
83
|
-
If we have existing concepts implying a graph, for example
|
|
84
|
-
|
|
85
|
-
A) a `Person` concept, with instances considered nodes, and
|
|
86
|
-
a `Person.knows` property with instances considered edges; or
|
|
87
|
-
B) a `Person` concept, with instances considered nodes, and
|
|
88
|
-
a `Transaction` concept, with properties `Transaction.payer`,
|
|
89
|
-
`Transaction.payee`, and `Transaction.amount` considered edges;
|
|
90
|
-
|
|
91
|
-
then we can define our graph from these concepts and relationships.
|
|
92
|
-
We can of course do that by calling the graph constructor as above
|
|
93
|
-
```
|
|
94
|
-
graph = Graph(model, directed=..., weighted=...)
|
|
95
|
-
```
|
|
96
|
-
and then define the generated `Node` and `Edge` concepts
|
|
97
|
-
from the existing concepts, for example roughly via
|
|
98
|
-
```
|
|
99
|
-
define(graph.Node.new(person=Person))
|
|
100
|
-
define(graph.Edge.new(
|
|
101
|
-
src=graph.Node.new(person=Person),
|
|
102
|
-
dst=graph.Node.new(person=Person.knows),
|
|
103
|
-
))
|
|
104
|
-
```
|
|
105
|
-
but the `Graph` class allows us to do this more gracefully by providing
|
|
106
|
-
the existing concepts to the `Graph` constructor. There are two cases:
|
|
107
|
-
|
|
108
|
-
1) similar to situation (A) above, where we have a concept (`Person`)
|
|
109
|
-
that can serve as the `Graph` class's `Node` concept, but no concept
|
|
110
|
-
that conforms to its `Edge` concept; and
|
|
111
|
-
2) similar to situation (B) above, where we have concepts (`Person`, `Transaction`)
|
|
112
|
-
that can serve as both the `Graph` class's `Node` and `Edge` concepts.
|
|
113
|
-
|
|
114
|
-
Let's modify our example above to illustrate the first case,
|
|
115
|
-
building a graph from an existing concept that can serve as
|
|
116
|
-
the graph's node concept.
|
|
117
|
-
|
|
118
|
-
```python
|
|
119
|
-
from relationalai.semantics import Model
|
|
120
|
-
from relationalai.semantics import Integer, Float
|
|
121
|
-
from relationalai.semantics import define, select
|
|
122
|
-
|
|
123
|
-
from relationalai.semantics.reasoners.graph import Graph
|
|
124
|
-
|
|
125
|
-
model = Model("toy_graph") # dry_run=False, use_lqp=False)
|
|
126
|
-
|
|
127
|
-
# Let's suppose we have a knows-network defined via a `Person` `Concept`
|
|
128
|
-
# and a `Person.knows` `Relationship`.
|
|
129
|
-
Person = model.Concept("Person")
|
|
130
|
-
Person.knows = model.Relationship("{Person} knows {Person}")
|
|
131
|
-
|
|
132
|
-
# Let's suppose our knows-network involves four people.
|
|
133
|
-
joe = Person.new(name="Joe")
|
|
134
|
-
jane = Person.new(name="Jane")
|
|
135
|
-
james = Person.new(name="James")
|
|
136
|
-
jennie = Person.new(name="Jennie")
|
|
137
|
-
define(joe, jane, james, jennie)
|
|
138
|
-
|
|
139
|
-
# Somehow their knows-relationship forms a kite!
|
|
140
|
-
define(
|
|
141
|
-
# A knows triangle.
|
|
142
|
-
joe.knows(jane),
|
|
143
|
-
jane.knows(james),
|
|
144
|
-
james.knows(joe),
|
|
145
|
-
# The knows-triangle tail.
|
|
146
|
-
james.knows(jennie),
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
# Let's build an unweighted graph from our knows-network, but supposing that
|
|
150
|
-
# "know"ing is symmetric, let's make the graph undirected this time.
|
|
151
|
-
graph = Graph(model, directed=False, weighted=False, node_concept=Person)
|
|
152
|
-
# By passing `Person` via `node_concept`, `graph.Node is Person`,
|
|
153
|
-
# but the `Graph` class still generates an `Edge` concept that needs population.
|
|
154
|
-
assert graph.Node is Person
|
|
155
|
-
Edge = graph.Edge
|
|
156
|
-
|
|
157
|
-
# Define the graph's edges from the knows-network's `Person.knows` `Relationship`.
|
|
158
|
-
define(Edge.new(src=Person, dst=Person.knows))
|
|
159
|
-
|
|
160
|
-
# Compute the number of other people each person knows,
|
|
161
|
-
# or in other words the degree of each node.
|
|
162
|
-
degree = graph.degree()
|
|
163
|
-
|
|
164
|
-
# Query and inspect the contents of the `degree` `Relationship`.
|
|
165
|
-
select(Person.name, Integer).where(degree(Person, Integer)).inspect()
|
|
166
|
-
# The output will show the degree for each person, roughly:
|
|
167
|
-
# name int
|
|
168
|
-
# 0 James 3
|
|
169
|
-
# 1 Jane 2
|
|
170
|
-
# 2 Jennie 1
|
|
171
|
-
# 3 Joe 2
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
Finally let's spice this up by trying the second case, bringing both
|
|
175
|
-
our own node and edge concepts.
|
|
176
|
-
|
|
177
|
-
```python
|
|
178
|
-
from relationalai.semantics import Model
|
|
179
|
-
from relationalai.semantics import Integer, Float
|
|
180
|
-
from relationalai.semantics import define, select
|
|
181
|
-
|
|
182
|
-
from relationalai.semantics.reasoners.graph import Graph
|
|
183
|
-
|
|
184
|
-
model = Model("toy_graph") # dry_run=False, use_lqp=False)
|
|
185
|
-
|
|
186
|
-
# Let's suppose again that we have a `Person` `Concept`...
|
|
187
|
-
Person = model.Concept("Person")
|
|
188
|
-
|
|
189
|
-
# ...with the usual suspects.
|
|
190
|
-
joe = Person.new(name="Joe")
|
|
191
|
-
jane = Person.new(name="Jane")
|
|
192
|
-
james = Person.new(name="James")
|
|
193
|
-
jennie = Person.new(name="Jennie")
|
|
194
|
-
define(joe, jane, james, jennie)
|
|
195
|
-
|
|
196
|
-
# But instead of a knows-network between those people,
|
|
197
|
-
# we will have a `Transaction` network:
|
|
198
|
-
Transaction = model.Concept("Transaction")
|
|
199
|
-
Transaction.payer = model.Relationship("{transaction:Transaction} has payer {payer:Person}")
|
|
200
|
-
Transaction.payee = model.Relationship("{transaction:Transaction} has payee {payee:Person}")
|
|
201
|
-
Transaction.amount = model.Relationship("{transaction:Transaction} has amount {amount:Float}")
|
|
202
|
-
|
|
203
|
-
# Amazingly, `Transaction`s between the usual suspects form a kite!
|
|
204
|
-
define(
|
|
205
|
-
# A triangle.
|
|
206
|
-
Transaction.new(payer=joe, payee=jane, amount=100.0),
|
|
207
|
-
Transaction.new(payer=jane, payee=james, amount=200.0),
|
|
208
|
-
Transaction.new(payer=james, payee=joe, amount=150.0),
|
|
209
|
-
# Its tail.
|
|
210
|
-
Transaction.new(payer=james, payee=jennie, amount=75.0)
|
|
211
|
-
)
|
|
212
|
-
|
|
213
|
-
# Let's build a directed, weighted graph from our transaction network.
|
|
214
|
-
graph = Graph(model, directed=True, weighted=True,
|
|
215
|
-
node_concept=Person,
|
|
216
|
-
edge_concept=Transaction,
|
|
217
|
-
edge_src_relationship=Transaction.payer,
|
|
218
|
-
edge_dst_relationship=Transaction.payee,
|
|
219
|
-
edge_weight_relationship=Transaction.amount,
|
|
220
|
-
)
|
|
221
|
-
# By passing `Person` via `node_concept`, `graph.Node is Person`,
|
|
222
|
-
# and by passing `Transaction` via `edge_concept`, `graph.Edge is `Transaction`.
|
|
223
|
-
assert graph.Node is Person
|
|
224
|
-
assert graph.Edge is Transaction
|
|
225
|
-
|
|
226
|
-
# The graph's edges are already defined via the combination of
|
|
227
|
-
# the `Transaction` concept and the `payer`, `payee`, and `amount` relationships.
|
|
228
|
-
|
|
229
|
-
# Compute the transaction volume each person has been involved in,
|
|
230
|
-
# or in other words the weighted degree of each node.
|
|
231
|
-
weighted_degree = graph.degree()
|
|
232
|
-
|
|
233
|
-
# Query and inspect the contents of the `weighted_degree` `Relationship`.
|
|
234
|
-
select(Person.name, Float).where(weighted_degree(Person, Float)).inspect()
|
|
235
|
-
# The output will show the weighted degree for each person, roughly:
|
|
236
|
-
# name float
|
|
237
|
-
# 0 James 425.0
|
|
238
|
-
# 1 Jane 300.0
|
|
239
|
-
# 2 Jennie 75.0
|
|
240
|
-
# 3 Joe 250.0
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
Now that you have a graph, and assuming it's relatively small,
|
|
244
|
-
if you would like to visualize it `graph.visualize(...)` should do the trick.
|
|
245
|
-
|
|
246
|
-
Next let's look briefly at handling of multi-edges, i.e. in the directed case,
|
|
247
|
-
multiple edges defined with the same orientation between the same pair of nodes,
|
|
248
|
-
and in the undirected case, multiple edges defined between the same pair of nodes.
|
|
249
|
-
|
|
250
|
-
The `Graph` constructor accepts an optional `aggregator` keyword argument that
|
|
251
|
-
controls this handling. There are two selections: the default `None`, which derives
|
|
252
|
-
an `Error` in the presence of multi-edges, and the `"sum"` aggregation mode,
|
|
253
|
-
which aggregates multi-edges into a single edge under the hood when
|
|
254
|
-
computing the internal simple un/directed, un/weighted edge/weight list
|
|
255
|
-
representation over which this library's various operations work.
|
|
256
|
-
|
|
257
|
-
First let's walk through the default `aggregator = None` mode. Any express
|
|
258
|
-
or implied multi-edges will lead to an `Error`:
|
|
259
|
-
```python
|
|
260
|
-
from relationalai.semantics import Model
|
|
261
|
-
from relationalai.semantics import Float, define, select
|
|
262
|
-
from relationalai.semantics.reasoners.graph import Graph
|
|
263
|
-
|
|
264
|
-
model = Model("aggregator_none")
|
|
265
|
-
graph = Graph(model, directed=True, weighted=True, aggregator=None)
|
|
266
|
-
Node, Edge = graph.Node, graph.Edge
|
|
267
|
-
|
|
268
|
-
# Four nodes forming a kite.
|
|
269
|
-
node_a = Node.new(name="A")
|
|
270
|
-
node_b = Node.new(name="B")
|
|
271
|
-
node_c = Node.new(name="C")
|
|
272
|
-
node_d = Node.new(name="D")
|
|
273
|
-
define(node_a, node_b, node_c, node_d)
|
|
274
|
-
|
|
275
|
-
# The edges constituting the kite's triangle.
|
|
276
|
-
edge_ab_1 = Edge.new(src=node_a, dst=node_b, weight=867.0)
|
|
277
|
-
edge_bc = Edge.new(src=node_b, dst=node_c, weight=2.0)
|
|
278
|
-
edge_ca = Edge.new(src=node_c, dst=node_a, weight=3.0)
|
|
279
|
-
|
|
280
|
-
# The edge constitute the kite's tail
|
|
281
|
-
edge_cd = Edge.new(src=node_c, dst=node_d, weight=4.0)
|
|
282
|
-
|
|
283
|
-
# Additional edges between nodes `A` and `B`, constituting an explicit multi-edge!
|
|
284
|
-
edge_ab_2 = Edge.new(src=node_a, dst=node_b, weight=0.53)
|
|
285
|
-
edge_ab_3 = Edge.new(src=node_a, dst=node_b, weight=0.0009)
|
|
286
|
-
|
|
287
|
-
define(edge_ab_1, edge_bc, edge_ca, edge_cd, edge_ab_2, edge_ab_3)
|
|
288
|
-
|
|
289
|
-
# This demand will produce an `Error` surfacing the multi-edge
|
|
290
|
-
# and noting that multi-edges are disallowed when `aggregator=None`.
|
|
291
|
-
weighted_degree = graph.degree()
|
|
292
|
-
select(Node.name, Float).where(weighted_degree(Node, Float)).inspect()
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
What happens in `aggregator = "sum"` mode?
|
|
296
|
-
```python
|
|
297
|
-
from relationalai.semantics import Model
|
|
298
|
-
from relationalai.semantics import Float, Integer, define, select
|
|
299
|
-
from relationalai.semantics.reasoners.graph import Graph
|
|
300
|
-
|
|
301
|
-
model = Model("aggregator_sum_weighted")
|
|
302
|
-
graph = Graph(model, directed=True, weighted=True, aggregator="sum")
|
|
303
|
-
Node, Edge = graph.Node, graph.Edge
|
|
304
|
-
|
|
305
|
-
node_a = Node.new(name="A")
|
|
306
|
-
node_b = Node.new(name="B")
|
|
307
|
-
node_c = Node.new(name="C")
|
|
308
|
-
node_d = Node.new(name="D")
|
|
309
|
-
define(node_a, node_b, node_c, node_d)
|
|
310
|
-
|
|
311
|
-
edge_ab_1 = Edge.new(src=node_a, dst=node_b, weight=867.0)
|
|
312
|
-
edge_bc = Edge.new(src=node_b, dst=node_c, weight=2.0)
|
|
313
|
-
edge_ca = Edge.new(src=node_c, dst=node_a, weight=3.0)
|
|
314
|
-
edge_cd = Edge.new(src=node_c, dst=node_d, weight=4.0)
|
|
315
|
-
|
|
316
|
-
edge_ab_2 = Edge.new(src=node_a, dst=node_b, weight=0.53)
|
|
317
|
-
edge_ab_3 = Edge.new(src=node_a, dst=node_b, weight=0.0009)
|
|
318
|
-
|
|
319
|
-
define(edge_ab_1, edge_bc, edge_ca, edge_cd, edge_ab_2, edge_ab_3)
|
|
320
|
-
|
|
321
|
-
# The following demand will result in a single `A` to `B` edge under the hood,
|
|
322
|
-
# with weight the sum of the component edges: 867.5309.
|
|
323
|
-
weighted_degree = graph.degree()
|
|
324
|
-
select(Node.name, Float).where(weighted_degree(Node, Float)).inspect()
|
|
325
|
-
# Weighted degree sums incident edge weights per node, such that the
|
|
326
|
-
# above yields roughly the following:
|
|
327
|
-
# name float
|
|
328
|
-
# 0 A 870.5309 # (867.5309 from A→B, plus 3.0 from C→A)
|
|
329
|
-
# 1 B 869.53 # (867.5309 from A→B, plus 2.0 from B→C)
|
|
330
|
-
# 2 C 9.00 # (2.0 + 3.0 + 4.0)
|
|
331
|
-
# 3 D 4.00
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
Finally, what happes in `aggregator="sum"` mode if the graph is unweighted?
|
|
335
|
-
|
|
336
|
-
```python
|
|
337
|
-
from relationalai.semantics import Model
|
|
338
|
-
from relationalai.semantics import Integer, define, select
|
|
339
|
-
from relationalai.semantics.reasoners.graph import Graph
|
|
340
|
-
|
|
341
|
-
model = Model("aggregator_sum_unweighted")
|
|
342
|
-
graph = Graph(model, directed=False, weighted=False, aggregator="sum")
|
|
343
|
-
Node, Edge = graph.Node, graph.Edge
|
|
344
|
-
|
|
345
|
-
node_a = Node.new(name="A")
|
|
346
|
-
node_b = Node.new(name="B")
|
|
347
|
-
node_c = Node.new(name="C")
|
|
348
|
-
node_d = Node.new(name="D")
|
|
349
|
-
define(node_a, node_b, node_c, node_d)
|
|
350
|
-
|
|
351
|
-
edge_ab_1 = Edge.new(src=node_a, dst=node_b)
|
|
352
|
-
edge_bc = Edge.new(src=node_b, dst=node_c)
|
|
353
|
-
edge_ca = Edge.new(src=node_c, dst=node_a)
|
|
354
|
-
edge_cd = Edge.new(src=node_c, dst=node_d)
|
|
355
|
-
|
|
356
|
-
edge_ab_2 = Edge.new(src=node_a, dst=node_b)
|
|
357
|
-
edge_ab_3 = Edge.new(src=node_a, dst=node_b)
|
|
358
|
-
|
|
359
|
-
define(edge_ab_1, edge_ab_2, edge_ab_3, edge_bc, edge_ca, edge_cd)
|
|
360
|
-
|
|
361
|
-
# The following demand will result in a single `A` to `B` edge under the hood,
|
|
362
|
-
# with effective weight 1.0.
|
|
363
|
-
degree = graph.degree()
|
|
364
|
-
select(Node.name, Integer).where(degree(Node, Integer)).inspect()
|
|
365
|
-
# The above yields roughly the following. Notice that `A` and `B`
|
|
366
|
-
# are effectively connected once, not three times:
|
|
367
|
-
# name int
|
|
368
|
-
# 0 A 2
|
|
369
|
-
# 1 B 2
|
|
370
|
-
# 2 C 3
|
|
371
|
-
# 3 D 1
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
# Core concepts
|
|
375
|
-
|
|
376
|
-
## The `Graph` class
|
|
377
|
-
|
|
378
|
-
The library's central component is the `Graph` class. Define graphs by
|
|
379
|
-
constructing instances of this class, and call member methods on such instances
|
|
380
|
-
to compute over those graphs.
|
|
381
|
-
|
|
382
|
-
`Graph`s may be directed or undirected, and weighted or unweighted. The required
|
|
383
|
-
`model`, `directed`, and `weighted` keyword arguments respectively allow
|
|
384
|
-
specification of the model to build the graph in, whether the graph should
|
|
385
|
-
be un/directed, and whether the graph should be un/weighted.
|
|
386
|
-
|
|
387
|
-
For example, the following constructs a directed, weighted graph:
|
|
388
|
-
```
|
|
389
|
-
graph = Graph(directed=True, weighted=True)
|
|
390
|
-
```
|
|
391
|
-
|
|
392
|
-
When the `Graph` constructor is invoked as above, instances of the `Graph` class
|
|
393
|
-
contain generated `Node` and `Edge` concepts, population of which allows for rich,
|
|
394
|
-
high-level definition of property multigraphs, which are projected to
|
|
395
|
-
simple graphs under the hood:
|
|
396
|
-
```
|
|
397
|
-
Node, Edge = graph.Node, graph.Edge
|
|
398
|
-
|
|
399
|
-
# Define three `Node`s from string literals.
|
|
400
|
-
joe_node = Node.new(name="Joe")
|
|
401
|
-
jane_node = Node.new(name="Jane")
|
|
402
|
-
james_node = Node.new(name="James")
|
|
403
|
-
define(joe_node, jane_node, james_node)
|
|
404
|
-
|
|
405
|
-
# Define `Edge`s forming a directed, weighted triangle between those `Node`s.
|
|
406
|
-
define(
|
|
407
|
-
Edge.new(src=joe_node, dst=jane_node, weight=1.0),
|
|
408
|
-
Edge.new(src=jane_node, dst=james_node, weight=2.0),
|
|
409
|
-
Edge.new(src=james_node, dst=joe_node, weight=3.0),
|
|
410
|
-
)
|
|
411
|
-
```
|
|
412
|
-
Every `Edge` must have a `src` and `dst`. If the graph is weighted, every edge
|
|
413
|
-
must have a `weight`; if the graph is unweighted, no edge may have a `weight`.
|
|
414
|
-
`Error`s are derived when these conditions don't hold. `Node`s and `Edge`s
|
|
415
|
-
may otherwise have any number and kind of properties attached to them; note that
|
|
416
|
-
all properties mentioned in `Node.new(...)` and `Edge.new(...)` get rolled into
|
|
417
|
-
the correspondingly defined `Node`'s / `Edge`'s identity, such that, e.g.,
|
|
418
|
-
```
|
|
419
|
-
define(
|
|
420
|
-
Node.new(id=1, color="pink"),
|
|
421
|
-
Node.new(id=1, color="sky blue"),
|
|
422
|
-
)
|
|
423
|
-
define(
|
|
424
|
-
Edge.new(src=joe_node, dst=jane_node, weight=1.0, txid=1),
|
|
425
|
-
Edge.new(src=joe_node, dst=jane_node, weight=1.0, txid=2),
|
|
426
|
-
)
|
|
427
|
-
```
|
|
428
|
-
defines two distinct `Node`s and two distinct `Edge`s (a multi-edge).
|
|
429
|
-
|
|
430
|
-
The `Graph` class constructor accepts an optional `aggregator` keyword argument,
|
|
431
|
-
which at this time accepts `None` and `"sum"` values; this selection controls
|
|
432
|
-
handling of multi-edges:
|
|
433
|
-
- When `aggregator = None`, multi-edges, express or implied, result in derivation
|
|
434
|
-
of an `Error`.
|
|
435
|
-
- With `aggregator = sum`, when projecting from the rich, high-level graph
|
|
436
|
-
specification in terms of `Node` and `Edge` concepts to the underlying simple
|
|
437
|
-
un/directed, un/weighted (edge-/weight- list) graph representation over which
|
|
438
|
-
to compute, multi-edges are collapsed into single edges with (if the graph is
|
|
439
|
-
weighted) aggregated weights. Multi-edges in un/directed, weighted graphs result
|
|
440
|
-
in a single un/directed edge with sum-aggregated weight. Multi-edges in un/directed,
|
|
441
|
-
unweighted graphs result in a single un/directed edge with an effective weight of 1.0.
|
|
442
|
-
|
|
443
|
-
At this time, `weight`s must be non-negative (zero or positive) `Float`s,
|
|
444
|
-
and may not be `inf` or `NaN`. In the near future, `Error`s will be derived
|
|
445
|
-
when these conditions don't hold.
|
|
446
|
-
|
|
447
|
-
Alternatively, the `Graph` constructor also accepts a `node_concept` argument,
|
|
448
|
-
or that plus `edge_concept`, `edge_src_relationship`, `edge_dst_relationship`,
|
|
449
|
-
and (if the graph is weighted) `edge_weight_relationship` arguments.
|
|
450
|
-
|
|
451
|
-
For example, the following mode of construction
|
|
452
|
-
```
|
|
453
|
-
graph = Graph(model, directed=..., weighted=..., node_concept=Person)`
|
|
454
|
-
```
|
|
455
|
-
results in the existing `Person` concept serving as the graph's node concept:
|
|
456
|
-
```
|
|
457
|
-
assert graph.Node is Person
|
|
458
|
-
```
|
|
459
|
-
though it still generates an `Edge` concept that must be populated as above.
|
|
460
|
-
|
|
461
|
-
Another example, the following mode of construction:
|
|
462
|
-
```
|
|
463
|
-
graph = Graph(model, directed=True, weighted=True,
|
|
464
|
-
node_concept=Person,
|
|
465
|
-
edge_concept=Transaction,
|
|
466
|
-
edge_src_relationship=Transaction.payer,
|
|
467
|
-
edge_dst_relationship=Transaction.payee,
|
|
468
|
-
edge_weight_relationship=Transaction.amount
|
|
469
|
-
)
|
|
470
|
-
```
|
|
471
|
-
results in the existing `Person` concept serving as the graph's node concept
|
|
472
|
-
```
|
|
473
|
-
assert graph.Node is Person
|
|
474
|
-
```
|
|
475
|
-
and the existing `Transaction` concept serving as the graph's edge concept
|
|
476
|
-
```
|
|
477
|
-
assert graph.Edge is Transaction
|
|
478
|
-
```
|
|
479
|
-
with the `Transaction.payer`, `Transaction.payee`, and `Transaction.weight`
|
|
480
|
-
relationships serving as the edge concept's source, destination, and weight
|
|
481
|
-
relationships.
|
|
482
|
-
|
|
483
|
-
(Please see the quick start guide above for more complete examples.)
|
|
484
|
-
|
|
485
|
-
If any of the edge concept and associated edge relationships are provided,
|
|
486
|
-
they must all be provided, as well as a node concept. (If the graph is weighted,
|
|
487
|
-
the edge weight relationship must be included in that cohort; if it is unweighted,
|
|
488
|
-
an edge weight relationship must _not_ be included in that cohort).
|
|
489
|
-
|
|
490
|
-
Each edge relationship must be binary, and must map from the edge concept to,
|
|
491
|
-
for the edge source and destination relationships, the node concept, and
|
|
492
|
-
for the weight relationship, the `Float` concept.
|
|
493
|
-
|
|
494
|
-
The model to which these concepts and relationships are attached
|
|
495
|
-
must be consistent among them, and with the model passed explicitly
|
|
496
|
-
to the `Graph` constructor.
|
|
497
|
-
|
|
498
|
-
Additionally, equivalents of all of the constraints described above for
|
|
499
|
-
the generated `Node` and `Edge` constraints must hold for user-provided node
|
|
500
|
-
and edge concepts and relationships.
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
## Computing over `Graph`s
|
|
504
|
-
|
|
505
|
-
To compute over a graph, call member methods, for example:
|
|
506
|
-
```
|
|
507
|
-
degree = graph.degree()
|
|
508
|
-
```
|
|
509
|
-
Such methods return `Relationship`s that contain the result of the corresponding
|
|
510
|
-
computation. For example, in this case `degree` binds an arity-two `Relationship`
|
|
511
|
-
that maps from `Node`s to corresponding `Integer` degrees, conceptually:
|
|
512
|
-
```
|
|
513
|
-
Relationship("{node:Node} has {degree:Integer}")
|
|
514
|
-
```
|
|
515
|
-
Such `Relationship`s can be used like any other query builder `Relationship`.
|
|
516
|
-
For example, we could inspect that `Relationship`'s contents to see the
|
|
517
|
-
degrees of the `Node`s in the graph:
|
|
518
|
-
```
|
|
519
|
-
degree.inspect()
|
|
520
|
-
```
|
|
521
|
-
|
|
522
|
-
There are notable exceptions, namely `is_connected` at time of this writing,
|
|
523
|
-
that return a query builder logic `Fragment` instead of a `Relationship`.
|
|
524
|
-
In the case of `is_connected`, this `Fragment` is a condition (`where` clause)
|
|
525
|
-
that can be uesd as a filter on whether the graph is connected. In future,
|
|
526
|
-
other member methods may return other `Fragment`s, for example in-line logic
|
|
527
|
-
for relations such as `degree`, as an alternative to receiving a corresponding
|
|
528
|
-
`Relationship`.
|
|
529
|
-
|
|
530
|
-
Some member methods, corresponding to parameterized algorithms, accept
|
|
531
|
-
keyword arguments that provide algorithm configuration. (At time of this writing,
|
|
532
|
-
none of the relevant algorithms have landed, but all of them have been stubbed
|
|
533
|
-
out.) For example, to compute `pagerank` over a graph with given damping
|
|
534
|
-
factor and convergence tolerance:
|
|
535
|
-
```
|
|
536
|
-
pagerank = graph.pagerank(
|
|
537
|
-
damping_factor=0.9,
|
|
538
|
-
tolerance=1e-7
|
|
539
|
-
)
|
|
540
|
-
```
|
|
541
|
-
|
|
542
|
-
# Algorithm implementation status
|
|
543
|
-
|
|
544
|
-
This list is rapidly evolving; it may be out of date. The most up to date
|
|
545
|
-
reference is the set of member methods of the `Graph` class.
|
|
546
|
-
|
|
547
|
-
**NOTE!** Please note that the interface to some of this functionality _will_ change.
|
|
548
|
-
(Notably, as we work to remove demand transformation, the interface for any
|
|
549
|
-
relation that was/is on-demand will change. Practically speaking, that includes
|
|
550
|
-
any relation that produces more tuples than roughly a linear number
|
|
551
|
-
in the number of nodes in the graph. Other interfaces may change in that
|
|
552
|
-
process as well.)
|
|
553
|
-
|
|
554
|
-
As of this writing, the following algorithms are available:
|
|
555
|
-
- num_nodes
|
|
556
|
-
- num_edges
|
|
557
|
-
- neighbor
|
|
558
|
-
- inneighbor
|
|
559
|
-
- outneighbor
|
|
560
|
-
- common_neighbor
|
|
561
|
-
- degree
|
|
562
|
-
- indegree
|
|
563
|
-
- outdegree
|
|
564
|
-
- weighted_degree
|
|
565
|
-
- weighted_indegree
|
|
566
|
-
- weighted_outdegree
|
|
567
|
-
- distance
|
|
568
|
-
- diameter_range
|
|
569
|
-
- reachable_from
|
|
570
|
-
- is_connected
|
|
571
|
-
- weakly_connected_component
|
|
572
|
-
- adamic_adar
|
|
573
|
-
- cosine_similarity
|
|
574
|
-
- jaccard_similarity
|
|
575
|
-
- preferential_attachment
|
|
576
|
-
- local_clustering_coefficient
|
|
577
|
-
- average_clustering_coefficient
|
|
578
|
-
- degree_centrality
|
|
579
|
-
- triangle
|
|
580
|
-
- num_triangles
|
|
581
|
-
- triangle_count
|
|
582
|
-
- unique_triangle
|
|
583
|
-
|
|
584
|
-
The following algorithms are stubbed out, but not yet implemented
|
|
585
|
-
(will yield a `NotImplemented` exception when called):
|
|
586
|
-
- pagerank
|
|
587
|
-
- infomap
|
|
588
|
-
- louvain
|
|
589
|
-
- label_propagation
|
|
590
|
-
- eigenvector_centrality
|
|
591
|
-
- betweenness_centrality
|
|
592
|
-
- triangle_community
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
## Testing
|
|
596
|
-
|
|
597
|
-
For more details about testing (local and in CI), refer the graphs test
|
|
598
|
-
[README.md](../../../../../tests/early_access/graphs/README.md).
|
|
599
|
-
|
|
600
|
-
Please see the [README.md](tests/README.md) in this package's `tests` subdirectory for
|
|
601
|
-
explanation of this package's tests' present location, in
|
|
602
|
-
`relationalai-python/tests/early_access/graphs`.
|
|
603
|
-
|
|
604
|
-
### Local Testing
|
|
605
|
-
|
|
606
|
-
To run the tests locally, the relationalai-python repository's virtual environment
|
|
607
|
-
must be correctly set up (please see [the repository's README.md](../../../../../README.md)),
|
|
608
|
-
and assuming we are at that repository's top level:
|
|
609
|
-
```bash
|
|
610
|
-
cd relationalai-python # repository top level
|
|
611
|
-
pytest [-s] [--verbose] relationalai-python/tests/early-access/graphs/[test_${functionality}.py] [-k '${filter}']
|
|
612
|
-
```
|
|
613
|
-
where `-s`, `--verbose`, specification of a particular test file
|
|
614
|
-
`test_${functionality}.py` (e.g. `test_num_nodes.py`), and specification
|
|
615
|
-
of a test filter `-k ${filter}` (e.g. `-k 'multiple_self_loops`) are optional.
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
## Requirements [TODO]
|
|
619
|
-
|
|
620
|
-
- relationalai
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
RelationalAI Graph Library
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
__version__ = "0.0.0"
|
|
6
|
-
|
|
7
|
-
import warnings
|
|
8
|
-
from relationalai.docutils import ProductStage
|
|
9
|
-
from .core import Graph
|
|
10
|
-
|
|
11
|
-
# Mark this package's docstrings for inclusion
|
|
12
|
-
# in automatically generated web documentation.
|
|
13
|
-
__include_in_docs__ = True
|
|
14
|
-
__rai_product_stage__ = ProductStage.EARLY_ACCESS
|
|
15
|
-
|
|
16
|
-
# Warn on import that this package is at an early stage of development,
|
|
17
|
-
# intended for internal consumers only, and ask those internal consumers
|
|
18
|
-
# to contact the symbolic reasoning team such that we can track usage,
|
|
19
|
-
# get feedback, and help folks through breaking changes.
|
|
20
|
-
warnings.warn(
|
|
21
|
-
(
|
|
22
|
-
"\n\nThis library is still in early stages of development and is intended "
|
|
23
|
-
"for internal use only. Among other considerations, interfaces will change, "
|
|
24
|
-
"and performance is appropriate only for exploring small graphs. Please "
|
|
25
|
-
"see this package's README for additional information.\n\n"
|
|
26
|
-
"If you are an internal user seeing this, please also contact "
|
|
27
|
-
"the symbolic reasoning team such that we can track usage, get "
|
|
28
|
-
"feedback, and help you through breaking changes.\n"
|
|
29
|
-
),
|
|
30
|
-
FutureWarning,
|
|
31
|
-
stacklevel=2
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
# Finally make this package's core functionality publicly available.
|
|
35
|
-
__all__ = [
|
|
36
|
-
"Graph",
|
|
37
|
-
]
|