使用 GDS 和复合数据库(以前称为 Fabric)
AuraDS 中不提供此功能。 |
Neo4j 复合数据库是一种在多个数据库中存储和检索数据的方式,无论它们是在同一个 Neo4j DBMS 上还是在多个 DBMS 上,都使用单个 Cypher 查询。有关复合数据库/Fabric 本身的更多信息,请访问
为简单起见,此文档页面仅进一步提及从 Neo4j 5.0 开始提供的复合数据库。由于 GDS 支持 4.x 和 5.x Neo4j 版本,因此此文档也可以应用于使用完全相同的查询和示例的 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
使用复合数据库,我们现在可以计算每个人的 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托管在复合数据库上时,不支持过程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数据库一样使用。