使用 GDS 和复合数据库(前身为 Fabric)
| 此功能在 AuraDS 中不可用。 |
Neo4j 复合数据库是一种使用单个 Cypher 查询来存储和检索多个数据库中数据的方法,无论这些数据库位于同一个 Neo4j DBMS 还是多个 DBMS 中。有关复合数据库/Fabric 本身的更多信息,请访问
| 为简洁起见,本文档页面后续仅提及从 Neo4j 5.0 版本开始提供的复合数据库。由于 GDS 支持 Neo4j 4.x 和 5.x 版本,因此本文档也适用于使用下方所示完全相同查询和示例的 Fabric 设置。 |
典型的 Neo4j 复合设置由两个组件组成:一个或多个保存数据的分片(组成部分),以及一个协调分布式查询的复合数据库。在复合部署中运行 Neo4j 图数据科学库有两种方式,本节将涵盖这两种方式。
在分片上运行 GDS
在这种使用 GDS 的复合环境模式下,GDS 操作在分片上执行。图投影和算法随后在每个分片上分别执行,结果可以通过复合数据库进行组合。如果图被分区为跨分片的互不相交的子图(即不同分片上的节点之间没有逻辑关系),则此场景非常有用。另一个用例是将图的拓扑结构复制到多个分片上,其中一些分片充当操作数据库,另一些分片充当分析数据库。
设置
在这种场景下,我们需要配置分片以运行 Neo4j 图数据科学库。
每个将运行图数据科学库的分片都应按照独立 GDS 数据库的方式进行配置,更多信息请参阅 安装。
复合数据库不需要任何特殊配置,即不需要安装 GDS 库插件。但是,应配置复合数据库以处理从分片接收到的数据量。
示例
假设我们有一个包含两个分片的复合设置。一个分片作为操作数据库,持有一个模式为 (Person)-[KNOWS]→(Person) 的图。每个 Person 节点还存储一个标识属性 id 以及人员的 name 和可能的其他属性。
另一个分片,即分析数据库,存储了一个除了唯一标识符外没有其他属性的相同图数据。
首先,我们需要在分析数据库分片上投影一个命名图。
CALL () {
USE COMPOSITE_DB_NAME.ANALYTICS_DB
CALL gds.graph.project('graph', 'Person', 'KNOWS')
YIELD graphName
RETURN graphName
}
RETURN graphName
使用复合数据库,我们现在可以计算每个 Person 的 PageRank 分数,并将结果与该 Person 的姓名连接起来。
CALL () {
USE COMPOSITE_DB_NAME.ANALYTICS_DB
CALL gds.pagerank.stream('graph', {})
YIELD nodeId, score AS pageRank
RETURN gds.util.asNode(nodeId).id AS personId, pageRank
}
CALL () {
USE COMPOSITE_DB_NAME.OPERATIONAL_DB
WITH personId
MATCH (p {id: personId})
RETURN p.name AS name
}
RETURN name, personId, pageRank
该查询首先连接到分析数据库,其中 PageRank 算法计算匿名图中每个节点的排名。算法结果与唯一节点 ID 一起流式传输到代理。对于第一个子查询返回的每一行,操作数据库随后被查询以获取人员姓名,同样使用唯一节点 ID 来识别跨分片的 Person 节点。
在复合数据库上运行 GDS
在这种使用 GDS 的复合环境模式下,GDS 操作在 Fabric 代理服务器上执行。图投影随后使用存储在分片上的数据来构建内存中图。
| 目前,在复合数据库上投影内存中图仅支持 Cypher 投影。 |
图算法可以在复合数据库上执行,类似于单机设置。如果一个逻辑上代表单个图的图被分发到不同的复合分片上,则此场景非常有用。
当 GDS 托管在复合数据库上时,不支持程序 write 模式。 |
设置
在该场景下,我们需要设置代理以运行 Neo4j 图数据科学库。
管理复合数据库的 DBMS 需要安装并配置 GDS 插件。有关更多信息,请参阅 安装。代理节点也应配置为处理从分片接收到的数据量,以及执行图投影和算法。
Fabric 分片不需要任何特殊配置,即不需要安装 GDS 库插件。
示例
假设我们有一个包含两个分片的复合设置。两个分片都充当操作数据库,并持有模式为 (Person)-[KNOWS]→(Person) 的图。
我们现在需要查询分片,以驱动代理节点上的导入过程。
CALL () {
USE COMPOSITE_DB_NAME.COMPOSITE_SHARD_0_NAME
MATCH (p:Person) OPTIONAL MATCH (p)-[:KNOWS]->(n:Person)
RETURN p, n
UNION
USE COMPOSITE_DB_NAME.COMPOSITE_SHARD_1_NAME
MATCH (p:Person) OPTIONAL MATCH (p)-[:KNOWS]->(n:Person)
RETURN p, n
}
WITH gds.graph.project('graph', p, n) AS graph
RETURN
graph.graphName AS graphName,
graph.nodeCount AS nodeCount,
graph.relationshipCount AS relationshipCount
我们现在已经投影了一个包含 5 个节点和 4 个关系的图。该图现在可以像任何独立 GDS 数据库一样使用。