使用 GDS 和复合数据库(以前称为 Fabric)

此功能在 AuraDS 中不可用。

Neo4j 复合数据库是一种在多个数据库中存储和检索数据的方式,无论这些数据库位于同一个 Neo4j DBMS 还是多个 DBMS 中,都只需使用单个 Cypher 查询。有关复合数据库/Fabric 本身的更多信息,请访问

为简化起见,本页文档后续仅提及自 Neo4j 5.0 起可用的复合数据库。由于 GDS 支持 4.x 和 5.x Neo4j 版本,因此本文档也适用于使用下方所示的完全相同查询和示例的 Fabric 设置。

典型的 Neo4j 复合设置由两个组件组成:一个或多个保存数据的分片(构成部分)和一个协调分布式查询的复合数据库。在复合部署中运行 Neo4j 图数据科学库有两种方式,本节将介绍这两种方式

  1. 在复合分片上运行 GDS

  2. 在复合数据库上运行 GDS

在分片上运行 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

使用复合数据库,我们现在可以计算每个人的 PageRank 分数,并将结果与该人的姓名连接起来。

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 托管在复合数据库上时,不支持过程写入模式。

设置

在这种场景下,我们需要设置代理来运行 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 数据库一样使用。

© . All rights reserved.