Source code for py2neo.cypher.proc

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

# Copyright 2011-2021, Nigel Small
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


from py2neo.cypher import cypher_escape


[docs] class ProcedureLibrary(object): """ Accessor for listing and calling procedures. This object is typically constructed and accessed via the :meth:`.Graph.call` attribute. See the documentation for that attribute for usage information. *New in version 2020.0.* """ def __init__(self, graph): self.graph = graph def __getattr__(self, name): return Procedure(self.graph, name) def __getitem__(self, name): return Procedure(self.graph, name) def __dir__(self): return list(self) def __iter__(self): proc = Procedure(self.graph, "dbms.procedures") for record in proc(keys=["name"]): yield record[0] def __call__(self, procedure, *args): """ Call a procedure by name. For example: >>> from py2neo import Graph >>> g = Graph() >>> g.call("dbms.components") name | versions | edition --------------|-----------|----------- Neo4j Kernel | ['4.0.2'] | community :param procedure: fully qualified procedure name :param args: positional arguments to pass to the procedure :returns: :class:`.Cursor` object wrapping the result """ return Procedure(self.graph, procedure)(*args)
[docs] class Procedure(object): """ Represents an individual procedure. *New in version 2020.0.* """ def __init__(self, graph, name): self.graph = graph self.name = name def __getattr__(self, name): return Procedure(self.graph, self.name + "." + name) def __getitem__(self, name): return Procedure(self.graph, self.name + "." + name) def __dir__(self): proc = Procedure(self.graph, "dbms.procedures") prefix = self.name + "." return [record[0][len(prefix):] for record in proc(keys=["name"]) if record[0].startswith(prefix)] def __call__(self, *args, **kwargs): """ Call a procedure by name. For example: >>> from py2neo import Graph >>> g = Graph() >>> g.call("dbms.components") name | versions | edition --------------|-----------|----------- Neo4j Kernel | ['4.0.2'] | community :param procedure: fully qualified procedure name :param args: positional arguments to pass to the procedure :returns: :class:`.Cursor` object wrapping the result """ procedure_name = ".".join(cypher_escape(part) for part in self.name.split(".")) arg_list = [(str(i), arg) for i, arg in enumerate(args)] cypher = "CALL %s(%s)" % (procedure_name, ", ".join("$" + a[0] for a in arg_list)) keys = kwargs.get("keys") if keys: cypher += " YIELD %s" % ", ".join(keys) return self.graph.run(cypher, dict(arg_list))