存储过程

GraphScope Interactive中的存储过程提供了一种强大的方式来封装和复用复杂的图操作。本文档提供了关于如何编译、启用和管理这些过程的指南。我们将以电影图为例进行说明。

注意

在执行以下代码之前,请确保您处于内置图gs_interactive_default_graph的上下文中:gsctl use GRAPH gs_interactive_default_graph

定义存储过程

要编译存储过程,首先需要用一个名为procedure.yaml的YAML文件来定义它,该文件定义了一个存储过程,用于搜索由指定名称的人创建的softwares。该人名已被参数化为$personName

name: test_procedure
description: "Ths is a test procedure"
query: 'MATCH (p: person)-[c:created]->(s: software) where p.name = $personName RETURN s.id as softwareId, s.name as softwareName;'
type: cypher

注意:

  • name 是必填项。它作为存储过程的唯一标识符,用于从交互式SDK或Neo4j原生工具中调用该过程。唯一性是在图的上下文中维护的,允许在不同图中使用相同的名称。在调用存储过程时,请确保交互式实例正在所需的图上运行。

  • description 是可选的。它是一个字符串,用于帮助您记忆和说明该过程的用途。如果省略,将分配一个默认描述。

  • query 字段可以包含Cypher查询或C++代码。Cypher查询支持模板,运行时参数可以表示为$param_name,在调用存储过程时可以为这些参数赋值。关于如何用C++定义存储过程,请参阅C++ procedure

  • 在编译Cypher代码时,将应用compiler.planner中指定的优化规则来生成更高效的程序。

创建存储过程

然后使用gsctl创建该过程:

gsctl create storedproc -f ./procedure.yaml

这将调用编译流程,将Cypher查询转换为物理执行计划,随后生成C++代码并进行编译,因此可能需要一定时间。

重启服务是必要的以激活存储过程:

gsctl service restart

删除存储过程

要删除单个存储过程,只需使用:

gsctl delete storedproc test_procedure

查看存储过程

查看单个存储过程,

gsctl desc storedproc test_procedure

或者,在cypher shell中显示所有有效的程序。

@neo4j> Show Procedures;

查询存储过程

通过交互式SDK调用存储过程

您可以通过交互式Python SDK调用存储过程。(请确保环境变量设置正确,详见部署交互式环境)。

export INTERACTIVE_ADMIN_ENDPOINT=http://127.0.0.1:7777
export INTERACTIVE_STORED_PROC_ENDPOINT=http://127.0.0.1:10000
export INTERACTIVE_CYPHER_ENDPOINT=neo4j://127.0.0.1:7687

注意

如果在部署Interactive时自定义了端口,请记得将默认端口替换为您自定义的端口。

from gs_interactive.client.driver import Driver
from gs_interactive.client.session import Session
from gs_interactive.models import *

driver = Driver()
with driver.getNeo4jSession() as session:
    result = session.run('CALL test_procedure("marko") YIELD *;')
    for record in result:
        print(record)

通过Neo4j原生工具调用存储过程

您也可以通过neo4j原生工具调用存储过程,例如cypher-shellneo4j-driver。关于如何连接到cypher服务,请参阅此文档

./cypher-shell -a ${INTERACTIVE_CYPHER_ENDPOINT}
CALL test_procedure("marko") YIELD *;

除了通过Cypher查询定义存储过程外,我们还支持通过C++存储过程自定义查询执行。详见C++ Stored Procedure

内置过程

为了提升Interactive用户体验,我们集成了内置存储过程。这些过程既简化了常见查询的执行,也支持那些设计复杂但至关重要且频繁使用的查询。要使用这些功能,只需输入正确的存储过程名称及必要参数即可。

count_vertices

该过程返回指定标签的顶点数量。

CALL count_vertices(vertex_label_name)

参数

  • vertex_label_name: 要统计的顶点标签名称。

返回值

  • count: 顶点的总数量。

k_hop_neighbors

这可以找到从起始顶点出发在k跳范围内可到达的所有顶点。

CALL k_neighbors(src_vertex_label_name, src_vertex_pk, k)

参数

  • src_vertex_label_name: 起始顶点的标签。

  • src_vertex_pk: 标识起始顶点的主键。

  • k: 跳数,必须大于或等于0。

返回值

  • label_name: 每个可达顶点的标签。

  • vertex_pk: 每个可达顶点的主键。

三点间最短路径

此功能用于查找连接三个指定顶点的最短路径。

CALL shortest_path_among_three(label_1, pk_1, label_2, pk_2, label_3, pk_3)

参数

  • label_1: 第一个顶点的标签。

  • pk_1: 第一个顶点的主键。

  • label_2: 第二个顶点的标签。

  • pk_2: 第二个顶点的主键。

  • label_3: 第三个顶点的标签。

  • pk_3: 第三个顶点的主键。

返回值

  • path: 最短路径,以字符串形式表示。

pagerank

计算当前图子图的PageRank值。

Currently, we only support calculating PageRank on a subgraph with a single type of vertex and a single type of relationship.
CALL page_rank(vertex_label, edge_label, damping_factor, max_iterations, epsilon)
  • vertex_label: 要查询的顶点标签。

  • edge_label: 顶点之间关系的标签。

  • damping_factor: PageRank算法的一个参数。

  • max_iterations: 最大迭代次数。

  • epsilon: PageRank算法的收敛参数。