介绍
通常,您发现自己无法提出适合当前问题的完美查询。每个查询语言都有其缺点, cypher 也不例外。但值得庆幸的是,总有可以编写自己的自定义程序。
。memgraph介绍了查询模块的概念,这是自定义密码程序的集合。您可以使用Python或C API实现它们。
在本教程中,您将完成一些以JSON格式加载和导出数据的简单实用程序的过程。
介绍Memgraph Mage
法师代表 memgraph Advanced Graph Extensions 。这是一个由Memgraph启动的开源项目,该项目鼓励开发人员共享创新且有用的查询模块,以便整个社区可以从中受益。
您可以找到法师存储库on this link。
先决条件
要完成本教程,您将需要:
- Memgraph DB的安装:构建的本机完全分布的内存中图数据库,该数据库构建了用于在企业尺度上处理实时用例。按照 Docker安装在Quick Start页面上的说明开始。
- Memgraph Lab的安装:用于导入数据,开发,调试和配置文件数据库查询并可视化查询结果的集成开发环境。
从JSON文件导入数据
memgraph并不是将JSON开箱即用的选择。那么,如果您在即将到来的项目中需要此功能,您有什么选择?
好吧,实际上有两种导入此类数据的方法:
- 独立于memgraph,
- 使用Memgraph中的查询模块。
第一个选项是一个非常简单的黑客。您只需解析所需的JSON文档,并创建适当的查询以填充数据库。这样,Memgraph就不知道JSON文件,您必须自己处理它,并且仅通过从JSON文件中提取的数据运行完成的查询。
第二选项更优雅,您将在本教程的其余部分中学习。
编写自定义密码程序
首先。要开始研究新的查询模块,您需要熟悉开发过程。如果您要在Docker以外的任何其他内容上运行MEMGRAPH,请继续下一个段落,否则跳到Developing Custom Query Modules using Docker部分。
在启动时,Memgraph将尝试从其默认值(/usr/lib/memgraph/query_modules
)目录中找到的所有*.so
和*.py
文件中加载查询模块。如果要更改Memgraph搜索查询模块的目录,只需在主配置文件(/etc/memgraph/memgraph.conf
)中更改--query-modules-directory
标志,或将其作为命令行参数(例如,使用Docker时)将其提供为:
docker run -p 7687:7687 --query-modules-directory /usr/lib/memgraph/new_query_modules memgraph
如果要添加一个新的查询模块,则需要将其放置在此目录中。 Memgraph启动时,它将自动加载,但是在数据库运行以下查询时,您也可以重新加载它:
CALL mg.load("QUERY_MODULE_NAME")
使用Docker开发自定义查询模块
使用Docker时,您无法直接访问默认查询模块目录,因为它在Docker容器中。创建一个音量并安装以访问/usr/lib/memgraph/query_modules
目录。这可以通过创建一个空目录modules
并执行以下命令来完成:
docker volume create --driver local --opt type=none --opt device=~modules --opt o=bind modules
现在,您可以启动memgraph并安装创建的卷:
`
docker run -it --rm -v modules:/usr/lib/memgraph/query_modules -p 7687:7687 memgraph
目录/usr/lib/memgraph/query_modules
的所有内容都可以在您安装的modules
卷中可见/可编辑,反之亦然。
在Python中实现JSON实用程序查询模块
您将命名查询模块json_util.py
,因为它将包含使用JSON文件所需的实用程序功能。现在,让我们实现以下三个过程:
- 从本地文件加载JSON
- 从远程地址加载JSON
- 导出节点为JSON文档
1.从本地文件加载JSON
在您的json_util.py
模块中添加以下代码:
`python
导入JSON
导入MGP
导入urllib.request
@mgp.read_proc
def load_from_path(ctx:mgp.procctx,
json_path:str) - > mgp.record(objects = mgp.list [object]):
with open(json_path) as json_file:
objects = json.load(json_file)
if type(objects) is dict:
objects = [objects]
return mgp.Record(objects=objects)
`
这样,您已经实施了第一个程序。 @mgp.read_proc
装饰器将功能注册为当前模块的仅阅读过程。 if
语句确保该过程返回list
,即使这只是一个元素。这对于以后处理数据将很有用。
您如何测试此过程?让我们在/usr/lib/memgraph/query_modules
目录中创建一个文件,然后将其命名为data.txt
。将以下内容放在其中:
json
[{"name":"Leslie"}, {"name":"Ron"}, {"name":"Donna"}]
开始 memgraph Lab 如果您还没有这样做,并运行以下查询:
cypher
CALL json_util.load_from_path("/usr/lib/memgraph/query_modules/data.txt")
YIELD *
RETURN *
2.从远程地址加载JSON
虽然从本地文件加载数据可能会有所帮助,尤其是在开发新过程时,需要通过URL从远程位置加载数据的过程更需要。值得庆幸的是,您只需要对load_from_path()
功能添加少量调整即可实现此功能。让我们命名这个新过程load_from_url
:
`python
@mgp.read_proc
def load_from_url(ctx:mgp.procctx,
json_path:str) - > mgp.record(objects = mgp.list [object]):
with urllib.request.urlopen(json_path) as url:
objects = json.loads(url.read().decode())
if type(objects) is dict:
objects = [objects]
return mgp.Record(objects=objects)
`
您可以通过运行以下查询来对其进行测试:
cypher
CALL json_util.load_from_url('ADDRESS')
YIELD objects
UNWIND objects AS o
RETURN o.name
3.将节点导出为JSON文档
此过程将收到节点列表,并以JSON格式将其保存到本地文件。
`python
@mgp.read_proc
def export_nodes(ctx:mgp.procctx,
节点:mgp.list [mgp.vertex],
file_path:str
) - > mgp.record(成功= bool):
json_nodes_list = []
for node in nodes:
json_node = {}
json_node['labels'] = []
for label in node.labels:
json_node['labels'].append(label.name)
json_node['properties'] = dict(node.properties.items())
json_nodes_list.append(json_node)
with open(file_name, 'w') as fp:
json.dump(json_nodes_list, fp)
return mgp.Record(success=True)
`
您可以通过运行:
测试该过程 cypher
MATCH (n)
WITH COLLECT(n) AS listn
CALL json_util.export_nodes(listn, "/usr/lib/memgraph/query_modules/data.json")
YIELD success RETURN success
文件data.json
应该在/usr/lib/memgraph/query_modules
目录中。
结论
在本教程中,您了解了如何通过编写自己的程序来轻松地为Cypher查询语言添加其他功能。虽然从JSON文档中导入数据被认为是一个实用程序过程,但查询模块可以是编写自定义图形算法或从图形理论领域实现各种构造的强大工具。
。如果您正在使用自己的查询模块,并且想分享它,请查看contributing guidelines。我们将很乐意提供反馈并将模块添加到 MAGE repository 。
。有关如何创建自己的自定义密码程序的更深入的解释,请查看我们的documentation。如果您想逐步探索自定义查询模块的更多逐步教程,请确保阅读我们的How to Write Custom Cypher Procedures with NetworkX and Memgraph教程。