拆分关系
此功能处于 Alpha 级别。有关功能级别的更多信息,请参阅API 级别。
引言
拆分关系算法是一种实用算法,用于对图进行预处理,以便进行模型训练。它将关系拆分为一个保留集和一个剩余集。保留集分为两类:正样本,即现有关系,以及负样本,即不存在的关系。关系的label
属性指示其类别。这使得保留集可以用于训练或测试机器学习模型。保留集和剩余关系都会添加到投影图中。
如果指定了配置选项relationshipWeightProperty
,则相应的关系属性将保留在剩余的关系集中。但请注意,保留集只有label
属性;由于保留集也包含负样本,因此无法在保留集上引入关系权重。
语法
本节介绍在每种执行模式下运行拆分关系算法所使用的语法。我们正在描述命名图语法的变体。要了解更多关于通用语法变体的信息,请参阅语法概览。
CALL gds.alpha.ml.splitRelationships.mutate(
graphName: String,
configuration: Map
)
YIELD
preProcessingMillis: Integer,
computeMillis: Integer,
mutateMillis: Integer,
relationshipsWritten: Integer,
configuration: Map
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图名称。 |
configuration |
映射 |
|
是 |
算法特定配置和/或图过滤配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
sourceNodeLabels |
字符串列表 |
|
是 |
过滤源节点具有至少一个 |
targetNodeLabels |
字符串列表 |
|
是 |
过滤目标节点具有至少一个 |
字符串列表 |
|
是 |
使用给定关系类型过滤命名图。 |
|
整数 |
|
是 |
运行算法时使用的并发线程数。 |
|
字符串 |
|
是 |
一个 ID,可以提供以便更轻松地跟踪算法进度。 |
|
布尔值 |
|
是 |
如果禁用,将不会记录进度百分比。 |
|
holdoutFraction |
浮点数 |
|
否 |
用作保留集的有效关系的比例。剩余的 |
negativeSamplingRatio |
浮点数 |
|
否 |
保留集中负样本与正样本的期望比例。 |
holdoutRelationshipType |
字符串 |
|
否 |
用于保留集的关系类型。每个关系都有一个 |
remainingRelationshipType |
字符串 |
|
否 |
如果某个节点不包含源或目标标签中的任何一个,则该关系将被省略。所有无效关系都将添加到剩余集中。 |
nonNegativeRelationshipTypes |
字符串列表 |
|
是 |
不用于负采样的额外关系类型。 |
字符串 |
|
是 |
|
|
randomSeed |
整数 |
|
是 |
用于关系随机选择的可选种子值。 |
名称 | 类型 | 描述 |
---|---|---|
|
整数 |
数据预处理的毫秒数。 |
|
整数 |
运行算法的毫秒数。 |
|
整数 |
向投影图添加属性的毫秒数。 |
|
整数 |
算法创建的关系数量。 |
|
映射 |
用于运行算法的配置。 |
示例
以下所有示例均应在空数据库中运行。 示例通常使用Cypher 投影。原生投影将在未来的版本中弃用。 |
在本节中,我们将展示在具体图上运行拆分关系算法的示例。目的是说明结果如何以及提供如何在实际环境中利用该算法的指南。我们将在一个由少量节点以特定模式连接而成的小图上进行此操作。示例图如下所示
考虑通过以下 Cypher 语句创建的图
CREATE
(n0:Label),
(n1:Label),
(n2:Label),
(n3:Label),
(n4:Label),
(n5:Label),
(n0)-[:TYPE { prop: 0} ]->(n1),
(n1)-[:TYPE { prop: 1} ]->(n2),
(n2)-[:TYPE { prop: 4} ]->(n3),
(n3)-[:TYPE { prop: 9} ]->(n4),
(n4)-[:TYPE { prop: 16} ]->(n5)
给定上述图,我们希望使用 20% 的关系作为保留集。保留集将分为两个大小相同的类别:正样本和负样本。正样本关系将从现有关系中随机选择并标记属性label: 1
。负样本关系将随机生成,即它们在输入图中不存在,并标记属性label: 0
。
MATCH (source:Label)-[r:TYPE]->(target:Label)
RETURN gds.graph.project(
'graph',
source,
target,
{
sourceNodeLabels: ['Label'],
targetNodeLabels: ['Label'],
relationshipType: 'TYPE'
},
{ undirectedRelationshipTypes: ['TYPE'] }
)
现在我们可以通过指定适当的比例和输出关系类型来运行算法。我们使用随机种子值以产生确定性结果。
CALL gds.alpha.ml.splitRelationships.mutate('graph', {
holdoutRelationshipType: 'TYPE_HOLDOUT',
remainingRelationshipType: 'TYPE_REMAINING',
holdoutFraction: 0.2,
negativeSamplingRatio: 1.0,
randomSeed: 1337
}) YIELD relationshipsWritten
relationshipsWritten |
---|
10 |
输入图包含 5 个关系。我们使用 20%(1 个关系)的关系来创建“TYPE_HOLDOUT”关系类型(保留集)。这会创建 1 个带有正标签的关系。由于negativeSamplingRatio
,还会创建 1 个带有负标签的关系。最后,使用剩余的 80%(4 个关系)形成TYPE_REMAINING
关系类型。这些关系以方向UNDIRECTED
写入,这相当于写入 8 个关系。
TEST
和TRAIN
关系过滤时,修改后的图将如下所示。CREATE
(n0:Label),
(n1:Label),
(n2:Label),
(n3:Label),
(n4:Label),
(n5:Label),
(n2)-[:TYPE_HOLDOUT { label: 0 } ]->(n5), // negative, non-existing
(n3)-[:TYPE_HOLDOUT { label: 1 } ]->(n2), // positive, existing
(n0)<-[:TYPE_REMAINING { prop: 0} ]-(n1),
(n1)<-[:TYPE_REMAINING { prop: 1} ]-(n2),
(n3)<-[:TYPE_REMAINING { prop: 9} ]-(n4),
(n4)<-[:TYPE_REMAINING { prop: 16} ]-(n5),
(n0)-[:TYPE_REMAINING { prop: 0} ]->(n1),
(n1)-[:TYPE_REMAINING { prop: 1} ]->(n2),
(n3)-[:TYPE_REMAINING { prop: 9} ]->(n4),
(n4)-[:TYPE_REMAINING { prop: 16} ]->(n5)