flowquery 1.0.46 → 1.0.48
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.
- package/dist/flowquery.min.js +1 -1
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/parsing/data_structures/list_comprehension.d.ts +56 -0
- package/dist/parsing/data_structures/list_comprehension.d.ts.map +1 -0
- package/dist/parsing/data_structures/list_comprehension.js +102 -0
- package/dist/parsing/data_structures/list_comprehension.js.map +1 -0
- package/dist/parsing/parser.d.ts +18 -0
- package/dist/parsing/parser.d.ts.map +1 -1
- package/dist/parsing/parser.js +92 -0
- package/dist/parsing/parser.js.map +1 -1
- package/package.json +4 -1
- package/.editorconfig +0 -21
- package/.gitattributes +0 -3
- package/.github/workflows/npm-publish.yml +0 -32
- package/.github/workflows/python-publish.yml +0 -143
- package/.github/workflows/release.yml +0 -107
- package/.husky/pre-commit +0 -28
- package/.prettierrc +0 -22
- package/CODE_OF_CONDUCT.md +0 -10
- package/FlowQueryLogoIcon.png +0 -0
- package/SECURITY.md +0 -14
- package/SUPPORT.md +0 -13
- package/docs/flowquery.min.js +0 -1
- package/docs/index.html +0 -105
- package/flowquery-py/CONTRIBUTING.md +0 -127
- package/flowquery-py/README.md +0 -67
- package/flowquery-py/misc/data/test.json +0 -10
- package/flowquery-py/misc/data/users.json +0 -242
- package/flowquery-py/notebooks/TestFlowQuery.ipynb +0 -440
- package/flowquery-py/pyproject.toml +0 -121
- package/flowquery-py/setup_env.ps1 +0 -92
- package/flowquery-py/setup_env.sh +0 -87
- package/flowquery-py/src/__init__.py +0 -38
- package/flowquery-py/src/__main__.py +0 -10
- package/flowquery-py/src/compute/__init__.py +0 -6
- package/flowquery-py/src/compute/flowquery.py +0 -68
- package/flowquery-py/src/compute/runner.py +0 -64
- package/flowquery-py/src/extensibility.py +0 -52
- package/flowquery-py/src/graph/__init__.py +0 -31
- package/flowquery-py/src/graph/data.py +0 -136
- package/flowquery-py/src/graph/database.py +0 -141
- package/flowquery-py/src/graph/hops.py +0 -43
- package/flowquery-py/src/graph/node.py +0 -143
- package/flowquery-py/src/graph/node_data.py +0 -26
- package/flowquery-py/src/graph/node_reference.py +0 -50
- package/flowquery-py/src/graph/pattern.py +0 -115
- package/flowquery-py/src/graph/pattern_expression.py +0 -67
- package/flowquery-py/src/graph/patterns.py +0 -42
- package/flowquery-py/src/graph/physical_node.py +0 -41
- package/flowquery-py/src/graph/physical_relationship.py +0 -36
- package/flowquery-py/src/graph/relationship.py +0 -193
- package/flowquery-py/src/graph/relationship_data.py +0 -36
- package/flowquery-py/src/graph/relationship_match_collector.py +0 -85
- package/flowquery-py/src/graph/relationship_reference.py +0 -21
- package/flowquery-py/src/io/__init__.py +0 -5
- package/flowquery-py/src/io/command_line.py +0 -108
- package/flowquery-py/src/parsing/__init__.py +0 -17
- package/flowquery-py/src/parsing/alias.py +0 -20
- package/flowquery-py/src/parsing/alias_option.py +0 -11
- package/flowquery-py/src/parsing/ast_node.py +0 -147
- package/flowquery-py/src/parsing/base_parser.py +0 -84
- package/flowquery-py/src/parsing/components/__init__.py +0 -19
- package/flowquery-py/src/parsing/components/csv.py +0 -8
- package/flowquery-py/src/parsing/components/from_.py +0 -12
- package/flowquery-py/src/parsing/components/headers.py +0 -12
- package/flowquery-py/src/parsing/components/json.py +0 -8
- package/flowquery-py/src/parsing/components/null.py +0 -10
- package/flowquery-py/src/parsing/components/post.py +0 -8
- package/flowquery-py/src/parsing/components/text.py +0 -8
- package/flowquery-py/src/parsing/context.py +0 -50
- package/flowquery-py/src/parsing/data_structures/__init__.py +0 -15
- package/flowquery-py/src/parsing/data_structures/associative_array.py +0 -41
- package/flowquery-py/src/parsing/data_structures/json_array.py +0 -30
- package/flowquery-py/src/parsing/data_structures/key_value_pair.py +0 -38
- package/flowquery-py/src/parsing/data_structures/lookup.py +0 -51
- package/flowquery-py/src/parsing/data_structures/range_lookup.py +0 -42
- package/flowquery-py/src/parsing/expressions/__init__.py +0 -61
- package/flowquery-py/src/parsing/expressions/boolean.py +0 -20
- package/flowquery-py/src/parsing/expressions/expression.py +0 -141
- package/flowquery-py/src/parsing/expressions/expression_map.py +0 -26
- package/flowquery-py/src/parsing/expressions/f_string.py +0 -27
- package/flowquery-py/src/parsing/expressions/identifier.py +0 -21
- package/flowquery-py/src/parsing/expressions/number.py +0 -32
- package/flowquery-py/src/parsing/expressions/operator.py +0 -271
- package/flowquery-py/src/parsing/expressions/reference.py +0 -47
- package/flowquery-py/src/parsing/expressions/string.py +0 -27
- package/flowquery-py/src/parsing/functions/__init__.py +0 -127
- package/flowquery-py/src/parsing/functions/aggregate_function.py +0 -60
- package/flowquery-py/src/parsing/functions/async_function.py +0 -65
- package/flowquery-py/src/parsing/functions/avg.py +0 -55
- package/flowquery-py/src/parsing/functions/coalesce.py +0 -43
- package/flowquery-py/src/parsing/functions/collect.py +0 -75
- package/flowquery-py/src/parsing/functions/count.py +0 -79
- package/flowquery-py/src/parsing/functions/date_.py +0 -61
- package/flowquery-py/src/parsing/functions/datetime_.py +0 -62
- package/flowquery-py/src/parsing/functions/duration.py +0 -159
- package/flowquery-py/src/parsing/functions/element_id.py +0 -50
- package/flowquery-py/src/parsing/functions/function.py +0 -68
- package/flowquery-py/src/parsing/functions/function_factory.py +0 -170
- package/flowquery-py/src/parsing/functions/function_metadata.py +0 -148
- package/flowquery-py/src/parsing/functions/functions.py +0 -67
- package/flowquery-py/src/parsing/functions/head.py +0 -39
- package/flowquery-py/src/parsing/functions/id_.py +0 -49
- package/flowquery-py/src/parsing/functions/join.py +0 -49
- package/flowquery-py/src/parsing/functions/keys.py +0 -34
- package/flowquery-py/src/parsing/functions/last.py +0 -39
- package/flowquery-py/src/parsing/functions/localdatetime.py +0 -60
- package/flowquery-py/src/parsing/functions/localtime.py +0 -57
- package/flowquery-py/src/parsing/functions/max_.py +0 -49
- package/flowquery-py/src/parsing/functions/min_.py +0 -49
- package/flowquery-py/src/parsing/functions/nodes.py +0 -48
- package/flowquery-py/src/parsing/functions/predicate_function.py +0 -47
- package/flowquery-py/src/parsing/functions/predicate_sum.py +0 -49
- package/flowquery-py/src/parsing/functions/properties.py +0 -50
- package/flowquery-py/src/parsing/functions/rand.py +0 -28
- package/flowquery-py/src/parsing/functions/range_.py +0 -41
- package/flowquery-py/src/parsing/functions/reducer_element.py +0 -15
- package/flowquery-py/src/parsing/functions/relationships.py +0 -46
- package/flowquery-py/src/parsing/functions/replace.py +0 -39
- package/flowquery-py/src/parsing/functions/round_.py +0 -34
- package/flowquery-py/src/parsing/functions/schema.py +0 -40
- package/flowquery-py/src/parsing/functions/size.py +0 -34
- package/flowquery-py/src/parsing/functions/split.py +0 -54
- package/flowquery-py/src/parsing/functions/string_distance.py +0 -92
- package/flowquery-py/src/parsing/functions/stringify.py +0 -49
- package/flowquery-py/src/parsing/functions/substring.py +0 -76
- package/flowquery-py/src/parsing/functions/sum.py +0 -51
- package/flowquery-py/src/parsing/functions/tail.py +0 -37
- package/flowquery-py/src/parsing/functions/temporal_utils.py +0 -186
- package/flowquery-py/src/parsing/functions/time_.py +0 -57
- package/flowquery-py/src/parsing/functions/timestamp.py +0 -37
- package/flowquery-py/src/parsing/functions/to_float.py +0 -46
- package/flowquery-py/src/parsing/functions/to_integer.py +0 -46
- package/flowquery-py/src/parsing/functions/to_json.py +0 -35
- package/flowquery-py/src/parsing/functions/to_lower.py +0 -37
- package/flowquery-py/src/parsing/functions/to_string.py +0 -41
- package/flowquery-py/src/parsing/functions/trim.py +0 -37
- package/flowquery-py/src/parsing/functions/type_.py +0 -47
- package/flowquery-py/src/parsing/functions/value_holder.py +0 -24
- package/flowquery-py/src/parsing/logic/__init__.py +0 -15
- package/flowquery-py/src/parsing/logic/case.py +0 -28
- package/flowquery-py/src/parsing/logic/else_.py +0 -12
- package/flowquery-py/src/parsing/logic/end.py +0 -8
- package/flowquery-py/src/parsing/logic/then.py +0 -12
- package/flowquery-py/src/parsing/logic/when.py +0 -12
- package/flowquery-py/src/parsing/operations/__init__.py +0 -46
- package/flowquery-py/src/parsing/operations/aggregated_return.py +0 -25
- package/flowquery-py/src/parsing/operations/aggregated_with.py +0 -22
- package/flowquery-py/src/parsing/operations/call.py +0 -73
- package/flowquery-py/src/parsing/operations/create_node.py +0 -35
- package/flowquery-py/src/parsing/operations/create_relationship.py +0 -35
- package/flowquery-py/src/parsing/operations/delete_node.py +0 -29
- package/flowquery-py/src/parsing/operations/delete_relationship.py +0 -29
- package/flowquery-py/src/parsing/operations/group_by.py +0 -148
- package/flowquery-py/src/parsing/operations/limit.py +0 -33
- package/flowquery-py/src/parsing/operations/load.py +0 -148
- package/flowquery-py/src/parsing/operations/match.py +0 -52
- package/flowquery-py/src/parsing/operations/operation.py +0 -69
- package/flowquery-py/src/parsing/operations/order_by.py +0 -114
- package/flowquery-py/src/parsing/operations/projection.py +0 -21
- package/flowquery-py/src/parsing/operations/return_op.py +0 -88
- package/flowquery-py/src/parsing/operations/union.py +0 -115
- package/flowquery-py/src/parsing/operations/union_all.py +0 -17
- package/flowquery-py/src/parsing/operations/unwind.py +0 -42
- package/flowquery-py/src/parsing/operations/where.py +0 -43
- package/flowquery-py/src/parsing/operations/with_op.py +0 -18
- package/flowquery-py/src/parsing/parser.py +0 -1384
- package/flowquery-py/src/parsing/parser_state.py +0 -26
- package/flowquery-py/src/parsing/token_to_node.py +0 -109
- package/flowquery-py/src/tokenization/__init__.py +0 -23
- package/flowquery-py/src/tokenization/keyword.py +0 -54
- package/flowquery-py/src/tokenization/operator.py +0 -29
- package/flowquery-py/src/tokenization/string_walker.py +0 -158
- package/flowquery-py/src/tokenization/symbol.py +0 -19
- package/flowquery-py/src/tokenization/token.py +0 -693
- package/flowquery-py/src/tokenization/token_mapper.py +0 -53
- package/flowquery-py/src/tokenization/token_type.py +0 -21
- package/flowquery-py/src/tokenization/tokenizer.py +0 -214
- package/flowquery-py/src/tokenization/trie.py +0 -125
- package/flowquery-py/src/utils/__init__.py +0 -6
- package/flowquery-py/src/utils/object_utils.py +0 -20
- package/flowquery-py/src/utils/string_utils.py +0 -113
- package/flowquery-py/tests/__init__.py +0 -1
- package/flowquery-py/tests/compute/__init__.py +0 -1
- package/flowquery-py/tests/compute/test_runner.py +0 -4902
- package/flowquery-py/tests/graph/__init__.py +0 -1
- package/flowquery-py/tests/graph/test_create.py +0 -56
- package/flowquery-py/tests/graph/test_data.py +0 -73
- package/flowquery-py/tests/graph/test_match.py +0 -40
- package/flowquery-py/tests/parsing/__init__.py +0 -1
- package/flowquery-py/tests/parsing/test_context.py +0 -34
- package/flowquery-py/tests/parsing/test_expression.py +0 -248
- package/flowquery-py/tests/parsing/test_parser.py +0 -1237
- package/flowquery-py/tests/test_extensibility.py +0 -611
- package/flowquery-py/tests/tokenization/__init__.py +0 -1
- package/flowquery-py/tests/tokenization/test_token_mapper.py +0 -60
- package/flowquery-py/tests/tokenization/test_tokenizer.py +0 -198
- package/flowquery-py/tests/tokenization/test_trie.py +0 -30
- package/flowquery-vscode/.vscode-test.mjs +0 -5
- package/flowquery-vscode/.vscodeignore +0 -13
- package/flowquery-vscode/LICENSE +0 -21
- package/flowquery-vscode/README.md +0 -11
- package/flowquery-vscode/demo/FlowQueryVSCodeDemo.gif +0 -0
- package/flowquery-vscode/eslint.config.mjs +0 -25
- package/flowquery-vscode/extension.js +0 -508
- package/flowquery-vscode/flowQueryEngine/flowquery.min.js +0 -1
- package/flowquery-vscode/flowquery-worker.js +0 -66
- package/flowquery-vscode/images/FlowQueryLogoIcon.png +0 -0
- package/flowquery-vscode/jsconfig.json +0 -13
- package/flowquery-vscode/libs/page.css +0 -53
- package/flowquery-vscode/libs/table.css +0 -13
- package/flowquery-vscode/libs/tabs.css +0 -66
- package/flowquery-vscode/package-lock.json +0 -2917
- package/flowquery-vscode/package.json +0 -51
- package/flowquery-vscode/test/extension.test.js +0 -196
- package/flowquery-vscode/test/worker.test.js +0 -25
- package/flowquery-vscode/vsc-extension-quickstart.md +0 -42
- package/jest.config.js +0 -14
- package/misc/apps/RAG/README.md +0 -29
- package/misc/apps/RAG/data/chats.json +0 -302
- package/misc/apps/RAG/data/emails.json +0 -182
- package/misc/apps/RAG/data/events.json +0 -226
- package/misc/apps/RAG/data/files.json +0 -172
- package/misc/apps/RAG/data/users.json +0 -158
- package/misc/apps/RAG/jest.config.js +0 -21
- package/misc/apps/RAG/package.json +0 -48
- package/misc/apps/RAG/public/index.html +0 -18
- package/misc/apps/RAG/src/App.css +0 -42
- package/misc/apps/RAG/src/App.tsx +0 -50
- package/misc/apps/RAG/src/components/AdaptiveCardRenderer.css +0 -172
- package/misc/apps/RAG/src/components/AdaptiveCardRenderer.tsx +0 -380
- package/misc/apps/RAG/src/components/ApiKeySettings.tsx +0 -245
- package/misc/apps/RAG/src/components/ChatContainer.css +0 -67
- package/misc/apps/RAG/src/components/ChatContainer.tsx +0 -242
- package/misc/apps/RAG/src/components/ChatInput.css +0 -23
- package/misc/apps/RAG/src/components/ChatInput.tsx +0 -76
- package/misc/apps/RAG/src/components/ChatMessage.css +0 -160
- package/misc/apps/RAG/src/components/ChatMessage.tsx +0 -286
- package/misc/apps/RAG/src/components/FlowQueryAgent.ts +0 -708
- package/misc/apps/RAG/src/components/FlowQueryRunner.css +0 -113
- package/misc/apps/RAG/src/components/FlowQueryRunner.tsx +0 -371
- package/misc/apps/RAG/src/components/index.ts +0 -28
- package/misc/apps/RAG/src/graph/index.ts +0 -19
- package/misc/apps/RAG/src/graph/initializeGraph.ts +0 -254
- package/misc/apps/RAG/src/index.tsx +0 -29
- package/misc/apps/RAG/src/prompts/FlowQuerySystemPrompt.ts +0 -327
- package/misc/apps/RAG/src/prompts/index.ts +0 -10
- package/misc/apps/RAG/src/tests/graph.test.ts +0 -35
- package/misc/apps/RAG/src/utils/FlowQueryExecutor.ts +0 -130
- package/misc/apps/RAG/src/utils/FlowQueryExtractor.ts +0 -208
- package/misc/apps/RAG/src/utils/Llm.ts +0 -248
- package/misc/apps/RAG/src/utils/index.ts +0 -12
- package/misc/apps/RAG/tsconfig.json +0 -22
- package/misc/apps/RAG/webpack.config.js +0 -43
- package/misc/apps/README.md +0 -1
- package/misc/queries/analyze_catfacts.cql +0 -75
- package/misc/queries/azure_openai_completions.cql +0 -13
- package/misc/queries/azure_openai_models.cql +0 -9
- package/misc/queries/mock_pipeline.cql +0 -84
- package/misc/queries/openai_completions.cql +0 -15
- package/misc/queries/openai_models.cql +0 -13
- package/misc/queries/test.cql +0 -6
- package/misc/queries/tool_inference.cql +0 -24
- package/misc/queries/wisdom.cql +0 -6
- package/misc/queries/wisdom_letter_histogram.cql +0 -8
- package/src/compute/flowquery.ts +0 -46
- package/src/compute/runner.ts +0 -66
- package/src/extensibility.ts +0 -45
- package/src/graph/data.ts +0 -130
- package/src/graph/database.ts +0 -143
- package/src/graph/hops.ts +0 -22
- package/src/graph/node.ts +0 -122
- package/src/graph/node_data.ts +0 -18
- package/src/graph/node_reference.ts +0 -38
- package/src/graph/pattern.ts +0 -110
- package/src/graph/pattern_expression.ts +0 -48
- package/src/graph/patterns.ts +0 -36
- package/src/graph/physical_node.ts +0 -23
- package/src/graph/physical_relationship.ts +0 -23
- package/src/graph/relationship.ts +0 -167
- package/src/graph/relationship_data.ts +0 -31
- package/src/graph/relationship_match_collector.ts +0 -64
- package/src/graph/relationship_reference.ts +0 -25
- package/src/index.browser.ts +0 -46
- package/src/index.node.ts +0 -55
- package/src/index.ts +0 -12
- package/src/io/command_line.ts +0 -74
- package/src/parsing/alias.ts +0 -23
- package/src/parsing/alias_option.ts +0 -5
- package/src/parsing/ast_node.ts +0 -153
- package/src/parsing/base_parser.ts +0 -98
- package/src/parsing/components/csv.ts +0 -9
- package/src/parsing/components/from.ts +0 -12
- package/src/parsing/components/headers.ts +0 -12
- package/src/parsing/components/json.ts +0 -9
- package/src/parsing/components/null.ts +0 -9
- package/src/parsing/components/post.ts +0 -9
- package/src/parsing/components/text.ts +0 -9
- package/src/parsing/context.ts +0 -54
- package/src/parsing/data_structures/associative_array.ts +0 -43
- package/src/parsing/data_structures/json_array.ts +0 -31
- package/src/parsing/data_structures/key_value_pair.ts +0 -37
- package/src/parsing/data_structures/lookup.ts +0 -44
- package/src/parsing/data_structures/range_lookup.ts +0 -36
- package/src/parsing/expressions/boolean.ts +0 -21
- package/src/parsing/expressions/expression.ts +0 -150
- package/src/parsing/expressions/expression_map.ts +0 -22
- package/src/parsing/expressions/f_string.ts +0 -26
- package/src/parsing/expressions/identifier.ts +0 -22
- package/src/parsing/expressions/number.ts +0 -40
- package/src/parsing/expressions/operator.ts +0 -354
- package/src/parsing/expressions/reference.ts +0 -45
- package/src/parsing/expressions/string.ts +0 -34
- package/src/parsing/functions/aggregate_function.ts +0 -58
- package/src/parsing/functions/async_function.ts +0 -64
- package/src/parsing/functions/avg.ts +0 -47
- package/src/parsing/functions/coalesce.ts +0 -49
- package/src/parsing/functions/collect.ts +0 -54
- package/src/parsing/functions/count.ts +0 -54
- package/src/parsing/functions/date.ts +0 -63
- package/src/parsing/functions/datetime.ts +0 -63
- package/src/parsing/functions/duration.ts +0 -143
- package/src/parsing/functions/element_id.ts +0 -51
- package/src/parsing/functions/function.ts +0 -60
- package/src/parsing/functions/function_factory.ts +0 -195
- package/src/parsing/functions/function_metadata.ts +0 -217
- package/src/parsing/functions/functions.ts +0 -70
- package/src/parsing/functions/head.ts +0 -42
- package/src/parsing/functions/id.ts +0 -51
- package/src/parsing/functions/join.ts +0 -40
- package/src/parsing/functions/keys.ts +0 -29
- package/src/parsing/functions/last.ts +0 -42
- package/src/parsing/functions/localdatetime.ts +0 -63
- package/src/parsing/functions/localtime.ts +0 -58
- package/src/parsing/functions/max.ts +0 -37
- package/src/parsing/functions/min.ts +0 -37
- package/src/parsing/functions/nodes.ts +0 -54
- package/src/parsing/functions/predicate_function.ts +0 -48
- package/src/parsing/functions/predicate_sum.ts +0 -47
- package/src/parsing/functions/properties.ts +0 -56
- package/src/parsing/functions/rand.ts +0 -21
- package/src/parsing/functions/range.ts +0 -37
- package/src/parsing/functions/reducer_element.ts +0 -10
- package/src/parsing/functions/relationships.ts +0 -52
- package/src/parsing/functions/replace.ts +0 -38
- package/src/parsing/functions/round.ts +0 -28
- package/src/parsing/functions/schema.ts +0 -39
- package/src/parsing/functions/size.ts +0 -28
- package/src/parsing/functions/split.ts +0 -45
- package/src/parsing/functions/string_distance.ts +0 -83
- package/src/parsing/functions/stringify.ts +0 -37
- package/src/parsing/functions/substring.ts +0 -68
- package/src/parsing/functions/sum.ts +0 -41
- package/src/parsing/functions/tail.ts +0 -39
- package/src/parsing/functions/temporal_utils.ts +0 -180
- package/src/parsing/functions/time.ts +0 -58
- package/src/parsing/functions/timestamp.ts +0 -37
- package/src/parsing/functions/to_float.ts +0 -50
- package/src/parsing/functions/to_integer.ts +0 -50
- package/src/parsing/functions/to_json.ts +0 -28
- package/src/parsing/functions/to_lower.ts +0 -28
- package/src/parsing/functions/to_string.ts +0 -32
- package/src/parsing/functions/trim.ts +0 -28
- package/src/parsing/functions/type.ts +0 -39
- package/src/parsing/functions/value_holder.ts +0 -13
- package/src/parsing/logic/case.ts +0 -26
- package/src/parsing/logic/else.ts +0 -12
- package/src/parsing/logic/end.ts +0 -9
- package/src/parsing/logic/then.ts +0 -12
- package/src/parsing/logic/when.ts +0 -12
- package/src/parsing/operations/aggregated_return.ts +0 -22
- package/src/parsing/operations/aggregated_with.ts +0 -18
- package/src/parsing/operations/call.ts +0 -69
- package/src/parsing/operations/create_node.ts +0 -39
- package/src/parsing/operations/create_relationship.ts +0 -38
- package/src/parsing/operations/delete_node.ts +0 -33
- package/src/parsing/operations/delete_relationship.ts +0 -32
- package/src/parsing/operations/group_by.ts +0 -137
- package/src/parsing/operations/limit.ts +0 -31
- package/src/parsing/operations/load.ts +0 -146
- package/src/parsing/operations/match.ts +0 -54
- package/src/parsing/operations/operation.ts +0 -69
- package/src/parsing/operations/order_by.ts +0 -126
- package/src/parsing/operations/projection.ts +0 -18
- package/src/parsing/operations/return.ts +0 -76
- package/src/parsing/operations/union.ts +0 -114
- package/src/parsing/operations/union_all.ts +0 -16
- package/src/parsing/operations/unwind.ts +0 -36
- package/src/parsing/operations/where.ts +0 -42
- package/src/parsing/operations/with.ts +0 -20
- package/src/parsing/parser.ts +0 -1641
- package/src/parsing/parser_state.ts +0 -25
- package/src/parsing/token_to_node.ts +0 -114
- package/src/tokenization/keyword.ts +0 -50
- package/src/tokenization/operator.ts +0 -25
- package/src/tokenization/string_walker.ts +0 -197
- package/src/tokenization/symbol.ts +0 -15
- package/src/tokenization/token.ts +0 -764
- package/src/tokenization/token_mapper.ts +0 -53
- package/src/tokenization/token_type.ts +0 -16
- package/src/tokenization/tokenizer.ts +0 -250
- package/src/tokenization/trie.ts +0 -117
- package/src/utils/object_utils.ts +0 -17
- package/src/utils/string_utils.ts +0 -114
- package/tests/compute/runner.test.ts +0 -4559
- package/tests/extensibility.test.ts +0 -643
- package/tests/graph/create.test.ts +0 -36
- package/tests/graph/data.test.ts +0 -58
- package/tests/graph/match.test.ts +0 -29
- package/tests/parsing/context.test.ts +0 -27
- package/tests/parsing/expression.test.ts +0 -303
- package/tests/parsing/parser.test.ts +0 -1327
- package/tests/tokenization/token_mapper.test.ts +0 -47
- package/tests/tokenization/tokenizer.test.ts +0 -191
- package/tests/tokenization/trie.test.ts +0 -20
- package/tsconfig.json +0 -19
- package/typedoc.json +0 -16
- package/vscode-settings.json.recommended +0 -16
- package/webpack.config.js +0 -26
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Graph Initialization Module
|
|
3
|
-
*
|
|
4
|
-
* Models the JSON data files as a virtual FlowQuery graph.
|
|
5
|
-
* Creates virtual nodes and relationships using FlowQuery Cypher.
|
|
6
|
-
* Uses native LOAD JSON FROM to read data from the /data/ endpoint.
|
|
7
|
-
*/
|
|
8
|
-
import FlowQuery from "flowquery";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Initializes the virtual FlowQuery graph with data from JSON files.
|
|
12
|
-
* Creates nodes for: User, Chat, Email, Event, File
|
|
13
|
-
* Creates relationships connecting them based on the data.
|
|
14
|
-
*/
|
|
15
|
-
export async function initializeGraph(): Promise<void> {
|
|
16
|
-
console.log("Initializing FlowQuery graph...");
|
|
17
|
-
|
|
18
|
-
// Create all nodes
|
|
19
|
-
await createUserNodes();
|
|
20
|
-
await createChatNodes();
|
|
21
|
-
await createEmailNodes();
|
|
22
|
-
await createEventNodes();
|
|
23
|
-
await createFileNodes();
|
|
24
|
-
|
|
25
|
-
// Create relationships
|
|
26
|
-
await createUserManagesRelationships();
|
|
27
|
-
await createChatMemberRelationships();
|
|
28
|
-
await createEmailSentByRelationships();
|
|
29
|
-
await createEmailReceivedByRelationships();
|
|
30
|
-
await createEventOrganizerRelationships();
|
|
31
|
-
await createEventAttendeeRelationships();
|
|
32
|
-
await createFileCreatedByRelationships();
|
|
33
|
-
await createFileSharedWithRelationships();
|
|
34
|
-
await createEmailAttachmentRelationships();
|
|
35
|
-
await createEventFileRelationships();
|
|
36
|
-
await createEventEmailRelationships();
|
|
37
|
-
|
|
38
|
-
console.log("FlowQuery graph initialized successfully.");
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// ============ Node Creation Functions ============
|
|
42
|
-
|
|
43
|
-
async function createUserNodes(): Promise<void> {
|
|
44
|
-
const runner = new FlowQuery(`
|
|
45
|
-
CREATE VIRTUAL (:User) AS {
|
|
46
|
-
LOAD JSON FROM '/data/users.json' AS user
|
|
47
|
-
RETURN
|
|
48
|
-
user.id AS id, user.displayName AS displayName, user.mail AS mail,
|
|
49
|
-
user.jobTitle AS jobTitle, user.department AS department,
|
|
50
|
-
user.officeLocation AS officeLocation, user.managerId AS managerId,
|
|
51
|
-
user.directReports AS directReports, user.hireDate AS hireDate,
|
|
52
|
-
user.skills AS skills, user.phone AS phone
|
|
53
|
-
}
|
|
54
|
-
`);
|
|
55
|
-
await runner.run();
|
|
56
|
-
console.log("Created User nodes");
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
async function createChatNodes(): Promise<void> {
|
|
60
|
-
const runner = new FlowQuery(`
|
|
61
|
-
CREATE VIRTUAL (:Chat) AS {
|
|
62
|
-
LOAD JSON FROM '/data/chats.json' AS chat
|
|
63
|
-
RETURN chat.id AS id, chat.topic AS topic, chat.type AS type,
|
|
64
|
-
chat.teamName AS teamName, chat.members AS members, chat.messages AS messages
|
|
65
|
-
}
|
|
66
|
-
`);
|
|
67
|
-
await runner.run();
|
|
68
|
-
console.log("Created Chat nodes");
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
async function createEmailNodes(): Promise<void> {
|
|
72
|
-
const runner = new FlowQuery(`
|
|
73
|
-
CREATE VIRTUAL (:Email) AS {
|
|
74
|
-
LOAD JSON FROM '/data/emails.json' AS email
|
|
75
|
-
RETURN
|
|
76
|
-
email.id AS id, email.subject AS subject, email.from AS fromUser,
|
|
77
|
-
email.to AS toUsers, email.cc AS cc, email.receivedDateTime AS receivedDateTime,
|
|
78
|
-
email.body AS body, email.importance AS importance,
|
|
79
|
-
email.hasAttachments AS hasAttachments, email.attachments AS attachments,
|
|
80
|
-
email.isRead AS isRead, email.conversationId AS conversationId,
|
|
81
|
-
email.categories AS categories
|
|
82
|
-
}
|
|
83
|
-
`);
|
|
84
|
-
await runner.run();
|
|
85
|
-
console.log("Created Email nodes");
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
async function createEventNodes(): Promise<void> {
|
|
89
|
-
const runner = new FlowQuery(`
|
|
90
|
-
CREATE VIRTUAL (:Event) AS {
|
|
91
|
-
LOAD JSON FROM '/data/events.json' AS event
|
|
92
|
-
RETURN
|
|
93
|
-
event.id AS id, event.subject AS subject, event.organizer AS organizer,
|
|
94
|
-
event.attendees AS attendees, event.start AS start, event.end AS end,
|
|
95
|
-
event.location AS location, event.isOnline AS isOnline,
|
|
96
|
-
event.onlineMeetingUrl AS onlineMeetingUrl, event.body AS body,
|
|
97
|
-
event.recurrence AS recurrence, event.relatedEmails AS relatedEmails,
|
|
98
|
-
event.relatedFiles AS relatedFiles, event.categories AS categories
|
|
99
|
-
}
|
|
100
|
-
`);
|
|
101
|
-
await runner.run();
|
|
102
|
-
console.log("Created Event nodes");
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
async function createFileNodes(): Promise<void> {
|
|
106
|
-
const runner = new FlowQuery(`
|
|
107
|
-
CREATE VIRTUAL (:File) AS {
|
|
108
|
-
LOAD JSON FROM '/data/files.json' AS file
|
|
109
|
-
RETURN
|
|
110
|
-
file.id AS id, file.name AS name, file.createdBy AS createdBy,
|
|
111
|
-
file.createdDateTime AS createdDateTime, file.lastModifiedBy AS lastModifiedBy,
|
|
112
|
-
file.lastModifiedDateTime AS lastModifiedDateTime, file.size AS size,
|
|
113
|
-
file.mimeType AS mimeType, file.webUrl AS webUrl, file.driveId AS driveId,
|
|
114
|
-
file.parentFolder AS parentFolder, file.sharedWith AS sharedWith,
|
|
115
|
-
file.relatedEmails AS relatedEmails, file.relatedEvents AS relatedEvents,
|
|
116
|
-
file.tags AS tags
|
|
117
|
-
}
|
|
118
|
-
`);
|
|
119
|
-
await runner.run();
|
|
120
|
-
console.log("Created File nodes");
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// ============ Relationship Creation Functions ============
|
|
124
|
-
|
|
125
|
-
async function createUserManagesRelationships(): Promise<void> {
|
|
126
|
-
const runner = new FlowQuery(`
|
|
127
|
-
CREATE VIRTUAL (:User)-[:MANAGES]-(:User) AS {
|
|
128
|
-
LOAD JSON FROM '/data/users.json' AS user
|
|
129
|
-
RETURN user.managerId AS left_id, user.id AS right_id
|
|
130
|
-
}
|
|
131
|
-
`);
|
|
132
|
-
await runner.run();
|
|
133
|
-
console.log("Created User-[:MANAGES]->User relationships");
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
async function createChatMemberRelationships(): Promise<void> {
|
|
137
|
-
const runner = new FlowQuery(`
|
|
138
|
-
CREATE VIRTUAL (:User)-[:MEMBER_OF]-(:Chat) AS {
|
|
139
|
-
LOAD JSON FROM '/data/chats.json' AS chat
|
|
140
|
-
UNWIND chat.members AS memberId
|
|
141
|
-
RETURN memberId AS left_id, chat.id AS right_id
|
|
142
|
-
}
|
|
143
|
-
`);
|
|
144
|
-
await runner.run();
|
|
145
|
-
console.log("Created User-[:MEMBER_OF]->Chat relationships");
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
async function createEmailSentByRelationships(): Promise<void> {
|
|
149
|
-
const runner = new FlowQuery(`
|
|
150
|
-
CREATE VIRTUAL (:User)-[:SENT]-(:Email) AS {
|
|
151
|
-
LOAD JSON FROM '/data/emails.json' AS email
|
|
152
|
-
RETURN email.from AS left_id, email.id AS right_id
|
|
153
|
-
}
|
|
154
|
-
`);
|
|
155
|
-
await runner.run();
|
|
156
|
-
console.log("Created User-[:SENT]->Email relationships");
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
async function createEmailReceivedByRelationships(): Promise<void> {
|
|
160
|
-
const runner = new FlowQuery(`
|
|
161
|
-
CREATE VIRTUAL (:Email)-[:RECEIVED_BY]-(:User) AS {
|
|
162
|
-
LOAD JSON FROM '/data/emails.json' AS email
|
|
163
|
-
UNWIND email.to AS recipient
|
|
164
|
-
RETURN email.id AS left_id, recipient AS right_id
|
|
165
|
-
}
|
|
166
|
-
`);
|
|
167
|
-
await runner.run();
|
|
168
|
-
console.log("Created Email-[:RECEIVED_BY]->User relationships");
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
async function createEventOrganizerRelationships(): Promise<void> {
|
|
172
|
-
const runner = new FlowQuery(`
|
|
173
|
-
CREATE VIRTUAL (:User)-[:ORGANIZES]-(:Event) AS {
|
|
174
|
-
LOAD JSON FROM '/data/events.json' AS event
|
|
175
|
-
RETURN event.organizer AS left_id, event.id AS right_id
|
|
176
|
-
}
|
|
177
|
-
`);
|
|
178
|
-
await runner.run();
|
|
179
|
-
console.log("Created User-[:ORGANIZES]->Event relationships");
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
async function createEventAttendeeRelationships(): Promise<void> {
|
|
183
|
-
const runner = new FlowQuery(`
|
|
184
|
-
CREATE VIRTUAL (:User)-[:ATTENDS]-(:Event) AS {
|
|
185
|
-
LOAD JSON FROM '/data/events.json' AS event
|
|
186
|
-
UNWIND event.attendees AS attendee
|
|
187
|
-
RETURN attendee.userId AS left_id, event.id AS right_id
|
|
188
|
-
}
|
|
189
|
-
`);
|
|
190
|
-
await runner.run();
|
|
191
|
-
console.log("Created User-[:ATTENDS]->Event relationships");
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
async function createFileCreatedByRelationships(): Promise<void> {
|
|
195
|
-
const runner = new FlowQuery(`
|
|
196
|
-
CREATE VIRTUAL (:User)-[:CREATED]-(:File) AS {
|
|
197
|
-
LOAD JSON FROM '/data/files.json' AS file
|
|
198
|
-
RETURN file.createdBy AS left_id, file.id AS right_id
|
|
199
|
-
}
|
|
200
|
-
`);
|
|
201
|
-
await runner.run();
|
|
202
|
-
console.log("Created User-[:CREATED]->File relationships");
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
async function createFileSharedWithRelationships(): Promise<void> {
|
|
206
|
-
const runner = new FlowQuery(`
|
|
207
|
-
CREATE VIRTUAL (:File)-[:SHARED_WITH]-(:User) AS {
|
|
208
|
-
LOAD JSON FROM '/data/files.json' AS file
|
|
209
|
-
UNWIND file.sharedWith AS userId
|
|
210
|
-
RETURN file.id AS left_id, userId AS right_id
|
|
211
|
-
}
|
|
212
|
-
`);
|
|
213
|
-
await runner.run();
|
|
214
|
-
console.log("Created File-[:SHARED_WITH]->User relationships");
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
async function createEmailAttachmentRelationships(): Promise<void> {
|
|
218
|
-
const runner = new FlowQuery(`
|
|
219
|
-
CREATE VIRTUAL (:Email)-[:HAS_ATTACHMENT]-(:File) AS {
|
|
220
|
-
LOAD JSON FROM '/data/emails.json' AS email
|
|
221
|
-
WHERE email.hasAttachments = true
|
|
222
|
-
UNWIND email.attachments AS fileId
|
|
223
|
-
RETURN email.id AS left_id, fileId AS right_id
|
|
224
|
-
}
|
|
225
|
-
`);
|
|
226
|
-
await runner.run();
|
|
227
|
-
console.log("Created Email-[:HAS_ATTACHMENT]->File relationships");
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
async function createEventFileRelationships(): Promise<void> {
|
|
231
|
-
const runner = new FlowQuery(`
|
|
232
|
-
CREATE VIRTUAL (:Event)-[:RELATED_TO_FILE]-(:File) AS {
|
|
233
|
-
LOAD JSON FROM '/data/events.json' AS event
|
|
234
|
-
UNWIND event.relatedFiles AS fileId
|
|
235
|
-
WHERE fileId IS NOT NULL
|
|
236
|
-
RETURN event.id AS left_id, fileId AS right_id
|
|
237
|
-
}
|
|
238
|
-
`);
|
|
239
|
-
await runner.run();
|
|
240
|
-
console.log("Created Event-[:RELATED_TO_FILE]->File relationships");
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
async function createEventEmailRelationships(): Promise<void> {
|
|
244
|
-
const runner = new FlowQuery(`
|
|
245
|
-
CREATE VIRTUAL (:Event)-[:RELATED_TO_EMAIL]-(:Email) AS {
|
|
246
|
-
LOAD JSON FROM '/data/events.json' AS event
|
|
247
|
-
UNWIND event.relatedEmails AS emailId
|
|
248
|
-
WHERE emailId IS NOT NULL
|
|
249
|
-
RETURN event.id AS left_id, emailId AS right_id
|
|
250
|
-
}
|
|
251
|
-
`);
|
|
252
|
-
await runner.run();
|
|
253
|
-
console.log("Created Event-[:RELATED_TO_EMAIL]->Email relationships");
|
|
254
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { createRoot } from 'react-dom/client';
|
|
3
|
-
import App from './App';
|
|
4
|
-
import { initializeGraph } from './graph';
|
|
5
|
-
|
|
6
|
-
// Initialize the FlowQuery graph and then render the app
|
|
7
|
-
initializeGraph().then(() => {
|
|
8
|
-
const container = document.getElementById('root');
|
|
9
|
-
if (container) {
|
|
10
|
-
const root = createRoot(container);
|
|
11
|
-
root.render(
|
|
12
|
-
<React.StrictMode>
|
|
13
|
-
<App />
|
|
14
|
-
</React.StrictMode>
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
}).catch((error) => {
|
|
18
|
-
console.error('Failed to initialize FlowQuery graph:', error);
|
|
19
|
-
// Still render the app even if graph initialization fails
|
|
20
|
-
const container = document.getElementById('root');
|
|
21
|
-
if (container) {
|
|
22
|
-
const root = createRoot(container);
|
|
23
|
-
root.render(
|
|
24
|
-
<React.StrictMode>
|
|
25
|
-
<App />
|
|
26
|
-
</React.StrictMode>
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
});
|
|
@@ -1,327 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FlowQuery System Prompt Generator
|
|
3
|
-
*
|
|
4
|
-
* Generates a system prompt that instructs the LLM to create FlowQuery statements
|
|
5
|
-
* based on natural language queries, with awareness of the graph schema.
|
|
6
|
-
*
|
|
7
|
-
* Uses FlowQuery's built-in schema() introspection to dynamically discover
|
|
8
|
-
* available nodes and relationships in the graph.
|
|
9
|
-
*/
|
|
10
|
-
import { getGraphSchema } from "../graph";
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* FlowQuery language reference documentation.
|
|
14
|
-
*/
|
|
15
|
-
const FLOWQUERY_LANGUAGE_REFERENCE = `
|
|
16
|
-
## FlowQuery Language Reference
|
|
17
|
-
|
|
18
|
-
FlowQuery is a Cypher-inspired declarative query language for querying graph data. It uses pattern matching to traverse nodes and relationships.
|
|
19
|
-
|
|
20
|
-
### Graph Query Clauses
|
|
21
|
-
|
|
22
|
-
1. **MATCH** - Match patterns in the graph
|
|
23
|
-
\`\`\`
|
|
24
|
-
MATCH (n:Person)
|
|
25
|
-
MATCH (a:User)-[:KNOWS]-(b:User)
|
|
26
|
-
MATCH (user:User)-[:SENT]->(email:Email)
|
|
27
|
-
MATCH p=(a:Person)-[:KNOWS*1..3]-(b:Person)
|
|
28
|
-
\`\`\`
|
|
29
|
-
|
|
30
|
-
2. **WHERE** - Filter matched patterns
|
|
31
|
-
\`\`\`
|
|
32
|
-
MATCH (n:Person)
|
|
33
|
-
WHERE n.age > 30
|
|
34
|
-
|
|
35
|
-
MATCH (a:User)-[:SENT]-(email:Email)
|
|
36
|
-
WHERE email.subject CONTAINS 'urgent'
|
|
37
|
-
\`\`\`
|
|
38
|
-
|
|
39
|
-
3. **RETURN** - Specify output columns
|
|
40
|
-
\`\`\`
|
|
41
|
-
RETURN n.name, n.email
|
|
42
|
-
RETURN n.name AS Name, n.email AS Email
|
|
43
|
-
RETURN n -- Return full node
|
|
44
|
-
RETURN * -- Return all matched variables
|
|
45
|
-
\`\`\`
|
|
46
|
-
|
|
47
|
-
4. **WITH** - Define intermediate variables or chain queries
|
|
48
|
-
\`\`\`
|
|
49
|
-
MATCH (n:User)
|
|
50
|
-
WITH n, size((n)-[:SENT]->()) AS emailCount
|
|
51
|
-
WHERE emailCount > 5
|
|
52
|
-
RETURN n.name, emailCount
|
|
53
|
-
\`\`\`
|
|
54
|
-
|
|
55
|
-
5. **UNWIND** - Expand arrays into individual rows
|
|
56
|
-
\`\`\`
|
|
57
|
-
UNWIND [1, 2, 3] AS number
|
|
58
|
-
UNWIND n.tags AS tag
|
|
59
|
-
\`\`\`
|
|
60
|
-
|
|
61
|
-
### Pattern Syntax
|
|
62
|
-
|
|
63
|
-
- **Nodes**: \`(variable:Label)\` or \`(variable)\` or \`(:Label)\`
|
|
64
|
-
- **Relationships**: \`-[:TYPE]-\` (undirected), \`-[:TYPE]->\` (outgoing), \`<-[:TYPE]-\` (incoming)
|
|
65
|
-
- **Variable-length paths**: \`-[:TYPE*1..3]-\` (1 to 3 hops), \`-[:TYPE*]-\` (any number)
|
|
66
|
-
- **Named paths**: \`p=(a)-[:KNOWS]-(b)\`
|
|
67
|
-
|
|
68
|
-
### Examples
|
|
69
|
-
|
|
70
|
-
\`\`\`
|
|
71
|
-
// Find all users
|
|
72
|
-
MATCH (u:User)
|
|
73
|
-
RETURN u.name, u.email
|
|
74
|
-
|
|
75
|
-
// Find users and their managers
|
|
76
|
-
MATCH (user:User)-[:MANAGES]-(manager:User)
|
|
77
|
-
RETURN user.name AS Employee, manager.name AS Manager
|
|
78
|
-
|
|
79
|
-
// Find emails sent by a specific user
|
|
80
|
-
MATCH (u:User)-[:SENT]->(e:Email)
|
|
81
|
-
WHERE u.name = 'Alice'
|
|
82
|
-
RETURN e.subject, e.sentDate
|
|
83
|
-
|
|
84
|
-
// Find chain of relationships
|
|
85
|
-
MATCH (a:User)-[:KNOWS*1..2]-(b:User)
|
|
86
|
-
WHERE a.name = 'Bob'
|
|
87
|
-
RETURN b.name AS Connection
|
|
88
|
-
\`\`\`
|
|
89
|
-
|
|
90
|
-
### Built-in Functions
|
|
91
|
-
|
|
92
|
-
- **Aggregation**: \`count()\`, \`sum()\`, \`avg()\`, \`min()\`, \`max()\`, \`collect()\`
|
|
93
|
-
- **String**: \`size()\`, \`trim()\`, \`toLower()\`, \`toUpper()\`, \`split()\`, \`join()\`, \`replace()\`
|
|
94
|
-
- **List**: \`range()\`, \`head()\`, \`tail()\`, \`last()\`, \`size()\`, \`reverse()\`
|
|
95
|
-
- **Type**: \`type()\`, \`toInteger()\`, \`toFloat()\`, \`toString()\`
|
|
96
|
-
- **Utility**: \`keys()\`, \`properties()\`
|
|
97
|
-
|
|
98
|
-
### F-Strings (Template Literals)
|
|
99
|
-
|
|
100
|
-
Use \`f"..."\` for string interpolation:
|
|
101
|
-
\`\`\`
|
|
102
|
-
MATCH (u:User)
|
|
103
|
-
RETURN f"Name: {u.name}, Email: {u.email}" AS info
|
|
104
|
-
\`\`\`
|
|
105
|
-
|
|
106
|
-
### Comparison Operators
|
|
107
|
-
|
|
108
|
-
- \`=\`, \`<>\` (not equal), \`<\`, \`>\`, \`<=\`, \`>=\`
|
|
109
|
-
- \`AND\`, \`OR\`, \`NOT\`
|
|
110
|
-
- \`IN\`, \`CONTAINS\`, \`STARTS WITH\`, \`ENDS WITH\`
|
|
111
|
-
- \`IS NULL\`, \`IS NOT NULL\`
|
|
112
|
-
`;
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* FlowQuery System Prompt Generator class.
|
|
116
|
-
* Provides methods to generate various system prompts for LLM interactions.
|
|
117
|
-
*/
|
|
118
|
-
export class FlowQuerySystemPrompt {
|
|
119
|
-
/**
|
|
120
|
-
* Format the graph schema into readable documentation.
|
|
121
|
-
* Accepts raw schema() results: array of { kind, label, type, sample }
|
|
122
|
-
*/
|
|
123
|
-
private static formatSchemaDocumentation(schema: any[]): string {
|
|
124
|
-
const sections: string[] = [];
|
|
125
|
-
|
|
126
|
-
sections.push("## Graph Schema\n");
|
|
127
|
-
sections.push(
|
|
128
|
-
"The following nodes and relationships are available in the graph for use with `MATCH` queries:\n"
|
|
129
|
-
);
|
|
130
|
-
|
|
131
|
-
// Filter nodes and relationships from raw schema results
|
|
132
|
-
const nodes = schema.filter((r) => r.kind === "node");
|
|
133
|
-
const relationships = schema.filter((r) => r.kind === "relationship");
|
|
134
|
-
|
|
135
|
-
// Document nodes
|
|
136
|
-
sections.push("### Node Labels\n");
|
|
137
|
-
if (nodes.length > 0) {
|
|
138
|
-
for (const node of nodes) {
|
|
139
|
-
sections.push(`#### \`${node.label}\``);
|
|
140
|
-
// Extract properties from sample data
|
|
141
|
-
if (node.sample && typeof node.sample === "object") {
|
|
142
|
-
const props = Object.entries(node.sample);
|
|
143
|
-
if (props.length > 0) {
|
|
144
|
-
sections.push("**Properties**:");
|
|
145
|
-
for (const [name, value] of props) {
|
|
146
|
-
const propType = Array.isArray(value) ? "array" : typeof value;
|
|
147
|
-
sections.push(` - \`${name}\`: ${propType}`);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
sections.push(`**Sample**: \`${JSON.stringify(node.sample)}\``);
|
|
151
|
-
}
|
|
152
|
-
sections.push("");
|
|
153
|
-
}
|
|
154
|
-
} else {
|
|
155
|
-
sections.push("No nodes defined.\n");
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Document relationships
|
|
159
|
-
sections.push("### Relationship Types\n");
|
|
160
|
-
if (relationships.length > 0) {
|
|
161
|
-
for (const rel of relationships) {
|
|
162
|
-
sections.push(`#### \`[:${rel.type}]\``);
|
|
163
|
-
// Extract properties from sample data
|
|
164
|
-
if (rel.sample && typeof rel.sample === "object") {
|
|
165
|
-
const props = Object.entries(rel.sample);
|
|
166
|
-
if (props.length > 0) {
|
|
167
|
-
sections.push("**Properties**:");
|
|
168
|
-
for (const [name, value] of props) {
|
|
169
|
-
const propType = Array.isArray(value) ? "array" : typeof value;
|
|
170
|
-
sections.push(` - \`${name}\`: ${propType}`);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
sections.push("");
|
|
175
|
-
}
|
|
176
|
-
} else {
|
|
177
|
-
sections.push("No relationships defined.\n");
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
return sections.join("\n");
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Internal helper to build the system prompt from schema documentation.
|
|
185
|
-
*/
|
|
186
|
-
private static buildSystemPrompt(schemaDocs: string, additionalContext?: string): string {
|
|
187
|
-
return `You are a FlowQuery assistant. Your primary role is to help users by creating and executing FlowQuery statements based on their natural language requests.
|
|
188
|
-
|
|
189
|
-
## How You Work
|
|
190
|
-
|
|
191
|
-
You operate in a multi-step process:
|
|
192
|
-
1. **Analyze** the user's natural language request
|
|
193
|
-
2. **Generate** a FlowQuery statement that fulfills the request using the graph schema
|
|
194
|
-
3. The system will **execute** your FlowQuery and provide you with the results
|
|
195
|
-
4. You will then **interpret** the results and present them to the user in a helpful way
|
|
196
|
-
|
|
197
|
-
## Response Format for Query Generation
|
|
198
|
-
|
|
199
|
-
When the user makes a request that requires fetching or processing data:
|
|
200
|
-
1. Generate a FlowQuery statement wrapped in a code block with \`\`\`flowquery language tag
|
|
201
|
-
2. Keep any explanation brief - the main focus should be the query
|
|
202
|
-
3. The query will be automatically executed and you'll receive the results
|
|
203
|
-
|
|
204
|
-
When the user asks a question that doesn't require data fetching (e.g., asking about FlowQuery syntax or general questions):
|
|
205
|
-
1. Start your response with [NO_QUERY_NEEDED]
|
|
206
|
-
2. Then provide your direct answer
|
|
207
|
-
|
|
208
|
-
## Important Guidelines
|
|
209
|
-
|
|
210
|
-
- Only use the nodes and relationships documented in the graph schema below
|
|
211
|
-
- Use proper FlowQuery syntax as documented in the language reference
|
|
212
|
-
- Use MATCH patterns to query the graph
|
|
213
|
-
- Always alias loaded items with \`AS\` for clarity
|
|
214
|
-
- Use meaningful aliases in RETURN statements for better readability
|
|
215
|
-
- Generate the simplest query that fulfills the user's request
|
|
216
|
-
- If you cannot determine what the user needs, ask clarifying questions (with [NO_QUERY_NEEDED])
|
|
217
|
-
- Do not use order by or coalesce
|
|
218
|
-
- Do not use list comprehension [i for i in ...]
|
|
219
|
-
- Do not use substring function
|
|
220
|
-
- Do not use limit or skip
|
|
221
|
-
|
|
222
|
-
${FLOWQUERY_LANGUAGE_REFERENCE}
|
|
223
|
-
|
|
224
|
-
${schemaDocs}
|
|
225
|
-
|
|
226
|
-
${additionalContext ? `## Additional Context\n\n${additionalContext}` : ""}
|
|
227
|
-
|
|
228
|
-
## Example Response Format
|
|
229
|
-
|
|
230
|
-
**When a query is needed**:
|
|
231
|
-
\`\`\`flowquery
|
|
232
|
-
MATCH (n:NodeLabel)-[:RELATIONSHIP]-(m:OtherLabel)
|
|
233
|
-
WHERE n.property = 'value'
|
|
234
|
-
RETURN n.name AS Name, m.value AS Value
|
|
235
|
-
\`\`\`
|
|
236
|
-
|
|
237
|
-
**When no query is needed** (e.g., general questions about FlowQuery):
|
|
238
|
-
[NO_QUERY_NEEDED]
|
|
239
|
-
Your direct answer here...
|
|
240
|
-
|
|
241
|
-
Now help the user with their request.`;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* Generate the complete FlowQuery system prompt.
|
|
246
|
-
* Uses FlowQuery's schema() introspection to discover the graph structure.
|
|
247
|
-
*
|
|
248
|
-
* @param additionalContext - Optional additional context to include in the prompt
|
|
249
|
-
* @returns Promise resolving to the complete system prompt string
|
|
250
|
-
*/
|
|
251
|
-
public static async generate(additionalContext?: string): Promise<string> {
|
|
252
|
-
const schema = await getGraphSchema();
|
|
253
|
-
const schemaDocs = this.formatSchemaDocumentation(schema);
|
|
254
|
-
|
|
255
|
-
return this.buildSystemPrompt(schemaDocs, additionalContext);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Generate a system prompt for the interpretation phase.
|
|
260
|
-
* Used after FlowQuery execution to interpret results.
|
|
261
|
-
*
|
|
262
|
-
* @returns The interpretation system prompt string
|
|
263
|
-
*/
|
|
264
|
-
public static generateInterpretationPrompt(): string {
|
|
265
|
-
return `You are a helpful assistant interpreting FlowQuery execution results.
|
|
266
|
-
|
|
267
|
-
## Your Role
|
|
268
|
-
|
|
269
|
-
The user made a natural language request, which was converted to a FlowQuery statement and executed.
|
|
270
|
-
You are now receiving the execution results. Your job is to:
|
|
271
|
-
|
|
272
|
-
1. **Summarize** the results in a clear, user-friendly way
|
|
273
|
-
2. **Highlight** key insights or patterns in the data
|
|
274
|
-
3. **Format** the data appropriately (tables, lists, or prose depending on the data)
|
|
275
|
-
4. **Answer** the user's original question using the data
|
|
276
|
-
|
|
277
|
-
## Guidelines
|
|
278
|
-
|
|
279
|
-
- Be concise but thorough
|
|
280
|
-
- If the results contain many items, summarize rather than listing all
|
|
281
|
-
- If there's an error, explain what went wrong in user-friendly terms
|
|
282
|
-
- Use markdown formatting for better readability
|
|
283
|
-
- If the data doesn't fully answer the user's question, note what's missing`;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
/**
|
|
287
|
-
* Get a minimal system prompt without full documentation.
|
|
288
|
-
* Useful for contexts where token count is a concern.
|
|
289
|
-
*
|
|
290
|
-
* @returns Promise resolving to minimal prompt string
|
|
291
|
-
*/
|
|
292
|
-
public static async getMinimalPrompt(): Promise<string> {
|
|
293
|
-
const schema = await getGraphSchema();
|
|
294
|
-
const nodes = schema.filter((r: any) => r.kind === "node");
|
|
295
|
-
const relationships = schema.filter((r: any) => r.kind === "relationship");
|
|
296
|
-
|
|
297
|
-
const nodeList =
|
|
298
|
-
nodes.length > 0 ? nodes.map((n: any) => `- \`${n.label}\``).join("\n") : "None";
|
|
299
|
-
const relList =
|
|
300
|
-
relationships.length > 0
|
|
301
|
-
? relationships.map((r: any) => `- \`[:${r.type}]\``).join("\n")
|
|
302
|
-
: "None";
|
|
303
|
-
|
|
304
|
-
return `You are a FlowQuery assistant. Generate FlowQuery statements based on user requests.
|
|
305
|
-
|
|
306
|
-
Available node labels:
|
|
307
|
-
${nodeList}
|
|
308
|
-
|
|
309
|
-
Available relationships:
|
|
310
|
-
${relList}
|
|
311
|
-
|
|
312
|
-
FlowQuery uses Cypher-like syntax: MATCH, WITH, UNWIND, WHERE, RETURN.
|
|
313
|
-
Use f"..." for string interpolation. Access properties with dot notation or brackets.
|
|
314
|
-
|
|
315
|
-
Always wrap FlowQuery code in \`\`\`flowquery code blocks.`;
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// Convenience function exports
|
|
320
|
-
export const generateFlowQuerySystemPrompt =
|
|
321
|
-
FlowQuerySystemPrompt.generate.bind(FlowQuerySystemPrompt);
|
|
322
|
-
export const generateInterpretationPrompt =
|
|
323
|
-
FlowQuerySystemPrompt.generateInterpretationPrompt.bind(FlowQuerySystemPrompt);
|
|
324
|
-
export const getMinimalFlowQueryPrompt =
|
|
325
|
-
FlowQuerySystemPrompt.getMinimalPrompt.bind(FlowQuerySystemPrompt);
|
|
326
|
-
|
|
327
|
-
export default FlowQuerySystemPrompt;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for the FlowQuery graph initialization
|
|
3
|
-
*
|
|
4
|
-
* Note: The tests that depend on graph initialization
|
|
5
|
-
* are skipped due to Jest module isolation issues with the flowquery package.
|
|
6
|
-
* These tests work correctly when the app runs directly.
|
|
7
|
-
*/
|
|
8
|
-
import FlowQuery from "flowquery";
|
|
9
|
-
|
|
10
|
-
describe("Graph - Basic FlowQuery Operations", () => {
|
|
11
|
-
test("should execute simple WITH/RETURN query", async () => {
|
|
12
|
-
const runner = new FlowQuery("WITH 42 AS value RETURN value");
|
|
13
|
-
await runner.run();
|
|
14
|
-
expect(runner.results).toEqual([{ value: 42 }]);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
test("should execute UNWIND query", async () => {
|
|
18
|
-
const runner = new FlowQuery("UNWIND [1, 2, 3] AS num RETURN num");
|
|
19
|
-
await runner.run();
|
|
20
|
-
expect(runner.results.length).toBe(3);
|
|
21
|
-
expect(runner.results).toEqual([{ num: 1 }, { num: 2 }, { num: 3 }]);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
test("should execute expression with functions", async () => {
|
|
25
|
-
const runner = new FlowQuery("WITH size([1, 2, 3, 4, 5]) AS len RETURN len");
|
|
26
|
-
await runner.run();
|
|
27
|
-
expect(runner.results).toEqual([{ len: 5 }]);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
test("should execute aggregation query", async () => {
|
|
31
|
-
const runner = new FlowQuery("UNWIND [10, 20, 30] AS n RETURN sum(n) AS total");
|
|
32
|
-
await runner.run();
|
|
33
|
-
expect(runner.results).toEqual([{ total: 60 }]);
|
|
34
|
-
});
|
|
35
|
-
});
|