ec4d8c7bb1
Summary: This is an overview on how the example Query Module will look in Python. Reviewers: mferencevic, ipaljak, buda, tlastre, dsantl Reviewed By: ipaljak, tlastre, dsantl Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D2642
38 lines
2.0 KiB
Python
38 lines
2.0 KiB
Python
# Build Memgraph with Python 3.5+ support and run Memgraph so that it loads
|
|
# this file as a Query Module. The procedure implemented in this module is just
|
|
# a rewrite of the `example.c` procedure.
|
|
import mgp
|
|
|
|
import copy
|
|
|
|
# mgp.read_proc will use inspect.signature to get the arguments and types which
|
|
# we map to our C API. Alternative registration examples are written below
|
|
# this definition. Also, we can support other builtin types that make sense, as
|
|
# well as the `typing` module, but `typing.Any` maps to `mgp.Nullable(mgp.Any)`
|
|
# instead of `mgp.Any` which prevents `None`. Additionally, all `mgp.read_proc`
|
|
# decorator registration relies on the assumption that they will have a
|
|
# globally visible `mgp_module` on which procedures are registered. For this to
|
|
# work, importing Python modules as Query Modules will need to go through a
|
|
# single thread or should use a thread local variable. Currently, we load
|
|
# everything on startup in a single thread, so there are no issues.
|
|
@mgp.read_proc
|
|
def procedure(context: mgp.ProcCtx,
|
|
required_arg: mgp.Nullable[mgp.Any],
|
|
optional_arg: mgp.Nullable[mgp.Any] = None
|
|
) -> mgp.Record(result=str, args=list):
|
|
'''
|
|
This example procedure returns 2 fields: `args` and `result`.
|
|
* `args` is a copy of arguments passed to the procedure.
|
|
* `result` is the result of this procedure, a "Hello World!" string.
|
|
Any errors can be reported by raising an Exception.
|
|
|
|
The procedure can be invoked in openCypher using the following calls:
|
|
CALL example.procedure(1, 2) YIELD args, result;
|
|
CALL example.procedure(1) YIELD args, result;
|
|
Naturally, you may pass in different arguments or yield less fields.
|
|
'''
|
|
# Copying to make it equivalent to the C example.
|
|
args_copy = [copy.deepcopy(required_arg), copy.deepcopy(optional_arg)]
|
|
# Multiple rows can be produced by returning an iterable of mgp.Record
|
|
return mgp.Record(args=args_copy, result='Hello World!')
|