存储过程¶
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-shell、neo4j-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算法的收敛参数。