Aura 图形分析无服务器
Aura 图形分析无服务器是一个按需的临时计算环境,用于运行 GDS 工作负载。每个计算单元称为一个 GDS 会话。它是 Neo4j Aura 的一部分,Neo4j Aura 是一个快速、可扩展、始终在线、全自动化的云图平台。
GDS 会话有三种类型
-
附加型:数据源是 Neo4j AuraDB 实例。
-
自管理型:数据源是自管理的 Neo4j DBMS。
-
独立型:数据源不基于 Neo4j。
我们将用数据填充会话的过程称为 远程投影。一旦填充,GDS 会话就可以运行 GDS 工作负载,例如算法和机器学习模型。这些计算的结果可以使用附加型和自管理型中的 远程写回 功能写回到原始源。
主要 API 接口
GDS 会话无需安装到 Neo4j DBMS。相反,GDS 会话是按需启动的,用于执行 GDS 计算。GDS 会话有两种主要 API:GDS Python 客户端和 GDS 会话 Cypher API。
GDS Python 客户端
使用该客户端,可以对 GDS 会话执行所有操作。有关包括示例和教程在内的全面 API 概述,请参阅GDS Python 客户端手册。
具体来说,GDS Python 客户端允许您
入门的好地方是教程
会话生命周期和配置
在 Cypher API 中,会话是隐式管理的。这意味着没有创建或删除会话的操作。相反,当远程投影运行时,会话会创建;当图被删除时,会话会删除。会话不能直接列出,但可以使用 gds.graph.list()
列出图。
会话大小
请求图投影时,必须指定一个强制性的 memory
参数,指示会话的大小。会话大小是分配给分析过程的最大内存量。更大的大小意味着更快的运行时间以及处理更大容量数据的能力,但它也会更昂贵。
支持的值包括:4GB
、8GB
、16GB
、24GB
、32GB
、48GB
、64GB
、96GB
、128GB
、192GB
、256GB
、384GB
和 512GB
。
可以为您的 Aura 组织配置会话最大大小。请咨询您的组织管理员以了解您的最大大小。 |
AuraDB 源实例限制
GDS 会话 Cypher API 仅适用于商业关键型或虚拟专用云方案中的 AuraDB 实例。根据所使用的方案,会有不同的限制。请参阅Aura 中的图分析以查看比较。
语法
GDS 会话 Cypher API 尽可能地与 GDS 插件 API 匹配。因此,本手册中的大部分内容适用于这两种产品。通常,您可以使用本手册中的所有查询示例以及 GDS 会话 Cypher API,但要遵守本节中描述的限制。
Aura API 认证
一个关键区别是 GDS 会话 Cypher API 需要向 Aura API 进行认证。这通过在每个 Cypher 查询中调用 gds.aura.api.credentials()
函数来完成。一个简单的方法是在所有查询中使用前导 WITH
子句。
该函数不返回任何值,但会在该查询的查询上下文中注册凭据。凭据不会在任何地方持久化,并且在 Cypher 查询完成后会立即被遗忘。
由于此要求,不能使用短格式的仅 CALL
查询。有关更多详细信息,请参阅Cypher 手册。
CALL
子句调用算法CALL gds.wcc.stream('g')
上述操作将失败,并显示错误,指示缺少对 gds.aura.api.credentials()
的调用。
RETURN gds.aura.api.credentials(
clientId: String,
clientSecret: String
) AS credentials
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
clientId |
字符串 |
|
否 |
Aura API 密钥对的客户端 ID。 |
clientSecret |
字符串 |
|
否 |
Aura API 密钥对的客户端密钥。 |
名称 | 类型 | 描述 |
---|---|---|
- |
- |
始终返回 |
示例
// you can use any alias
CYPHER runtime=parallel
WITH gds.aura.api.credentials($clientId, $clientSecret) AS credentials
MATCH (n)
OPTIONAL MATCH (n)-->(m)
RETURN gds.graph.project('g', n, m, {}, {memory: '4GB'})
// you can use any alias
WITH gds.aura.api.credentials($clientId, $clientSecret) AS c
CALL gds.pageRank.stream('g')
YIELD nodeId, score // must specify YIELD
RETURN *
投影图
使用Cypher 投影将图投影到 GDS 会话中。请确保包含带有 Aura Graph Analytics Serverless
标签的所有附加参数。
使用 Cypher 并行运行时,在投影期间获得最佳性能。
不支持原生投影和旧版 Cypher 投影。 |
运行算法
GDS 会话 Cypher API 支持所有现有执行模式下的大多数算法和机器学习操作。语法与 GDS 插件相同,但增加了 WITH gds.aura.api.credentials() AS credentials
子句。
API 限制
GDS 会话 Cypher API 不支持 GDS 插件中所有可用的过程和函数。此处提到的一些可能在未来得到支持,而另一些可能永远不会得到支持。
图目录
GDS 会话 Cypher API 不支持以下图目录过程
-
gds.graph.project
-
gds.graph.project.estimate
-
gds.graph.project.cypher
-
gds.graph.project.cypher.estimate
-
gds.graph.export
-
gds.graph.export.csv
-
gds.graph.export.csv.estimate
-
gds.backup
-
gds.restore
-
gds.graph.graphProperty.drop
-
gds.graph.graphProperty.stream
机器学习
训练好的模型只能在训练它们的相同会话中使用进行预测。会话删除后,所有训练好的模型都将丢失。
GDS 会话 Cypher API 不支持以下机器学习过程
-
gds.model.publish
-
gds.model.store
-
gds.model.load
-
gds.model.delete
-
gds.alpha.linkprediction.adamicAdar
-
gds.alpha.linkprediction.commonNeighbors
-
gds.alpha.linkprediction.preferentialAttachment
-
gds.alpha.linkprediction.resourceAllocation
-
gds.alpha.linkprediction.sameCommunity
-
gds.alpha.linkprediction.totalNeighbors
-
gds.alpha.ml.splitRelationships
此外,所有 pipeline
过程都不受支持。
示例
在本节中,我们将演示如何使用 GDS 会话 Cypher API 投影图、运行一些算法并处理结果。
投影图
为了将图投影到 GDS 会话中,我们需要在数据库中拥有一些数据。
CREATE
(a:User {name: 'Alice', age: 23}),
(b:User {name: 'Bridget', age: 34}),
(c:User {name: 'Charles', age: 45}),
(d:User {name: 'Dana', age: 56}),
(e:User {name: 'Eve', age: 67}),
(f:User {name: 'Fawad', age: 78}),
(a)-[:LINK {weight: 0.5}]->(b),
(b)-[:LINK {weight: 0.2}]->(a),
(a)-[:LINK {weight: 4}]->(c),
(c)-[:LINK {weight: 2}]->(e),
(e)-[:LINK {weight: 1.1}]->(d),
(e)-[:LINK {weight: -2}]->(f);

首先,使用远程 Cypher 投影将图投影到 GDS 会话中。指定 memory
和 ttl
参数。
CYPHER runtime=parallel
WITH gds.aura.api.credentials($clientId, $clientSecret) AS credentials
MATCH (source:User)
OPTIONAL MATCH (source)-[r:LINK]->(target:User)
WITH gds.graph.project('myGraph', source, target, {
sourceNodeProperties: source { .age },
targetNodeProperties: target { .age },
relationshipProperties: r { .weight }
}, {
memory: '4GB', ttl: duration({minutes: 5})
}) AS g
RETURN g.graphName, g.nodeCount, g.relationshipCount
图名称 | 节点数 | 关系数 |
---|---|---|
'myGraph' |
6 |
6 |
完成后,我们现在拥有一个带投影图的 GDS 会话。如果打开 Aura Console,您应该能够在 Sessions
视图中看到列出的会话。接下来,使用 gds.graph.list()
过程列出投影图。
WITH gds.aura.api.credentials($clientId, $clientSecret) AS credentials
CALL gds.graph.list()
YIELD graphName, nodeCount, relationshipCount
RETURN graphName, nodeCount, relationshipCount
图名称 | 节点数 | 关系数 |
---|---|---|
"myGraph" |
6 |
6 |
运行算法
mutate
模式运行 PageRankWITH gds.aura.api.credentials($clientId, $clientSecret) AS credentials
CALL gds.pageRank.mutate('myGraph', { mutateProperty: 'pageRank' })
YIELD ranIterations, nodePropertiesWritten
RETURN ranIterations, nodePropertiesWritten
运行迭代次数 | 写入的节点属性 |
---|---|
1 |
6 |
使用突变的 pageRank
属性作为 FastRP 算法的输入。
mutate
模式运行 FastRPWITH gds.aura.api.credentials($clientId, $clientSecret) AS credentials
CALL gds.fastRP.mutate('myGraph', {
featureProperties: ['pageRank'],
relationshipWeightProperty: 'weight',
iterationWeights: [1, 1, 1],
randomSeed: 42,
embeddingDimension: 8,
mutateProperty: 'fastrp'
})
YIELD nodePropertiesWritten
RETURN nodePropertiesWritten
写入的节点属性 |
---|
6 |
现在,将节点属性流式传输回 AuraDB 实例。
WITH gds.aura.api.credentials($clientId, $clientSecret) AS credentials
CALL gds.graph.nodeProperty.stream('myGraph', "fastrp")
YIELD nodeId, propertyValue
RETURN nodeId, propertyValue
ORDER BY nodeId
节点 ID | 属性值 |
---|---|
0 |
[-0.8200507164, -0.0124960952, 0.2896471024, -0.2785570323, -0.8645128608, -0.1037763357, 0.0, 0.4556654692] |
1 |
[-0.3894904256, -0.5124961138, 0.9440460801, -0.9576280117, 0.0673641935, -1.0132695436, 0.0, 0.4451318979] |
2 |
[-0.4223886132, 0.0, 0.3452976346, 0.190074876, -0.4223886132, 0.4223886132, 0.0, 0.0] |
3 |
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] |
4 |
[-0.4223886132, 0.0, -0.6547023654, 0.190074876, -0.4223886132, 0.4223886132, 0.0, 0.0] |
5 |
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] |
将结果写入数据库
可以使用 gds.graph.nodeProperty.write()
过程写入突变结果。有关更多详细信息,请参阅写入节点属性和标签。
您还可以使用 write
算法执行模式直接写入结果。
write
模式运行 LouvainWITH gds.aura.api.credentials($clientId, $clientSecret) AS credentials
CALL gds.louvain.write('myGraph', { writeProperty: 'louvain' })
YIELD communityCount, modularity
RETURN communityCount, modularity
社区数 | 模块度 |
---|---|
2 |
0.3333333333333333 |