精华 Neo4j官方教程:第16节, 如何扩展 Cypher
发布于 1 天前 作者 pangguoming 19 次浏览 来自 分享

教程目录 引自:https://neo4j.com/docs/getting-started/cypher-intro/procedures-functions/

如何扩展 Cypher

本指南介绍了如何创建、使用和部署用户定义的程序和函数,这是 Cypher®(Neo4j 的查询语言)的扩展机制。

扩展 Cypher

Cypher 是一种强大且富有表达力的语言,具有一流的图模式和集合支持。但有时您需要做更多的事情,如额外的图算法、并行化或自定义转换。

Cypher 可以通过用户定义的程序和函数进行扩展,详见 Java 参考 → 用户定义程序和 Java 参考 → 用户定义函数。

Neo4j 本身提供并使用自定义程序。Neo4j 浏览器公开的许多监控、自检和安全功能都是使用程序实现的。 image

Neo4j 中的程序和函数

  • 函数是简单的计算/转换,返回单个值
  • 函数可以在任何表达式或谓词中使用
  • 程序是更复杂的操作,生成结果流
  • 程序可以生成、获取或计算数据,供 Cypher 查询的后续处理步骤使用

要调用数据库中部署的程序,请使用 CALL 子句(详见 Cypher 手册 → CALL 程序)。

列出和使用 Neo4j 的函数和程序

Neo4j 带有多个内置程序。要了解更多信息,请参阅操作手册 → 程序。

要列出 DBMS 中所有可用的函数和程序,使用以下 Cypher 命令:

SHOW FUNCTIONS
SHOW PROCEDURES

您可以参考 Cypher 速查表以快速了解如何使用这些命令。

每个程序返回一列或多列数据。通过 YIELD 子句,可以选择这些列并设置别名,然后在 Cypher 查询中使用。

像其他 Cypher 管理命令一样,SHOW PROCEDURES 可以与 Cypher 子句的子集一起使用,如下所示,我们按 ‘db.’ 前缀过滤并按名称排序返回结果:

SHOW PROCEDURES
YIELD name, signature, description as text
WHERE name STARTS WITH 'db.'
RETURN * ORDER BY name ASC

下面是另一个示例,展示如何按选定的类别(例如包)对可用程序进行分组:

SHOW PROCEDURES 
YIELD name, signature, description
RETURN split(name,".")[0..-1] AS package, count(*) AS count,
       collect(split(name,".")[-1]) AS names
ORDER BY count DESC

可用程序集取决于您的安装类型和配置设置。结果可能如下:

package count names
[“dbms”] 20 [“checkConfigValue”, “components”, “info”,…]
[“db”] 16 [“awaitIndex”, “awaitIndexes”, “checkpoint”,…]
[“db”,“stats”] 6 [“clear”, “collect”, “retrieve”,…]
[“dbms”, “cluster”] 6 [“checkConnectivity”, “cordonServer”, “protocols”,…]
[“db”, “index”, “fulltext”] 4 [“awaitEventuallyConsistentIndexRefresh”, “listAvailableAnalyzers”,…]

用户定义的函数用 Java 编写,部署到数据库中,其调用方式与其他 Cypher 函数相同。可以开发和使用两种主要类型的函数:

  • 用户定义的标量函数
  • 用户定义的聚合函数

详细信息请参见 Cypher 手册 → 用户定义函数。

您可以将任何程序库部署到自管理服务器,以使用其他程序和函数。

另请查看 Neo4j Java 参考中的程序部分。

部署程序和函数

如果您构建自己的程序或从社区项目下载程序,它们会打包在 JAR 文件中。您可以将该文件复制到 Neo4j 服务器的 $NEO4J_HOME/plugins 目录并重启。

由于程序和函数使用低级 Java API,它们可以访问所有 Neo4j 内部组件以及文件系统和机器。这就是为什么您应该了解部署哪些程序以及原因。只安装来自可信源的程序。如果它们是开源的,请检查其源代码,最好自己构建。

有关如何确保这些附加组件安全性的最佳实践,请参见操作手册 → 保护扩展。

某些程序和函数可用于自管理的 Neo4j 企业版和社区版。 本节中描述的自定义代码与 AuraDB 不兼容。 在 Neo4j AuraDB 中,可用的程序和函数仅限于内置程序和函数以及 APOC Core 库的子集。

程序和函数库

APOC Core 库为您提供了一组有用的 Cypher 程序,以增强数据集成、图算法和数据转换等领域的功能。

例如,用于格式化和解析不同分辨率时间戳的函数:

RETURN apoc.date.format(timestamp()) as time,
       apoc.date.format(timestamp(),'ms','yyyy-MM-dd') as date,
       apoc.date.parse('13.01.1975','s','dd.MM.yyyy') as unixtime,
       apoc.date.parse('2017-01-05 13:03:07') as millis
time date unixtime millis
“2017-01-05 13:06:39” “2017-01-05” 158803200 1483621387000

在我们的 Neo4j Labs 项目中,您可以找到由社区和员工构建的库集。看看已有的内容,很多需求已经被覆盖,例如:

  • 索引操作
  • 数据库/API 集成
  • 图重构
  • 导入和导出
  • 空间索引查找
  • RDF 导入和导出
  • 等等

社区和 Neo4j Labs 项目不受官方支持,我们不提供任何 SLA 或向后兼容性和弃用的保证。

开发自己的程序和函数

您可以在 Neo4j Java 参考中找到有关编写和测试程序的详细信息。

示例 GitHub 存储库包含详细的文档和注释,您可以直接克隆并用作起点。

以下是一些初步提示。

用户定义的函数比较简单,让我们从它们开始:

  • @UserFunction 注解的公共 Java 类中的方法
  • 默认名称是包名.方法名
  • 返回单个值
  • 只读

用户定义的程序类似:

  • @Procedure 注解的 Java 方法
  • 带有附加模式属性(READ, WRITE, DBMS)
  • 返回具有公共字段的简单对象的 Java 8 流
  • 这些字段名称转换为可用于 YIELD 的结果列

这些特性对两者都有效:

  • 使用 @Name 注解的参数(带可选默认值)
  • 可以使用注入的 @Context public GraphDatabaseService
  • 在 Cypher 语句的事务中运行
  • 支持的参数和结果类型有:Long、Double、Boolean、String、Node、Relationship、Path、Object
回到顶部