Spanner Graph 算法目录

Spanner Graph 与 Google 研究 图挖掘团队紧密合作,提供了一套算法,可满足以下应用场景的图分析需求:

中心性

中心性算法会根据节点在图中的结构重要性对节点进行排名。它可以帮助您识别金融科技领域的欺诈性账号、社交图谱中的网红、电信网络中的关键路由器等。

PageRank

PageRank 会按重要性对节点进行评分。如果许多其他重要节点都链接到某个节点,则该节点会被视为更重要。该算法模拟通过图的随机游走。在此游走中访问频率较高的节点被视为更重要。如需了解算法详情,请参阅网页排名。

函数签名

PageRank(input_parameters) YIELD node, score

输入参数

所有常见输入参数以及:

名称 类型 必填 默认 说明
source_nodes 图节点数组 否 (无) 如果存在,则为个性化 PageRank 的来源。
damping_factor FLOAT64 否 0.85 在任何给定的迭代中,算法选择遍历当前节点的某个传出边缘的概率。必须介于 [0, 1) 之间。
max_iterations INT64 否 10 算法的最大迭代次数。必须为正值。 迭代次数越多,结果往往越精确,但运行时间也会更长。
approx_precision FLOAT64 否 1e-2 算法的近似精度阈值。必须为非负数。较小的值往往会产生更精确的结果,但代价是运行时间更长。

输出

函数生成:

名称 类型 说明
节点 GRAPH_ELEMENT(节点) 图表中的节点。
得分 FLOAT64 节点的 PageRank 得分。

示例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/my-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL PageRank(
    node_labels => ['Account'], edge_labels => ['Transfers'],
    source_nodes => ARRAY {
                      MATCH (n:Account {id:7})
                      RETURN n
                    }
  ) YIELD node, score
RETURN node.id, score;

BetweennessCentrality

BetweennessCentrality 用于衡量某个节点位于其他节点对之间最短路径上的次数。具有高中介中心性的节点通常充当连接图表不同部分的关键桥梁。如需了解算法详情,请参阅中介中心性。

函数签名

BetweennessCentrality(input_parameters) YIELD node, score

输入参数

所有常见输入参数以及:

名称 类型 必填 默认 说明
num_source_nodes INT64 否 (无) 如果设置,则必须为正数,并指定算法应选择多少个源节点来计算近似中介中心性。如果未设置,或设置的数字大于图中的节点数,则所有节点都将用作源节点,即算法会计算精确的中介中心性。值越高,近似值越好,但运行时间也越长。

输出

函数生成:

名称 类型 说明
节点 GRAPH_ELEMENT(节点) 图表中的节点。
得分 FLOAT64 节点的中心性得分。

示例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/my-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL BetweennessCentrality(
    node_labels => ['Account'], edge_labels => ['Transfers'], num_source_nodes => 5
  ) YIELD node, score
RETURN node.id, score;

ClosenessCentrality

ClosenessCentrality 用于衡量一个节点与图中所有其他节点的接近程度。具有高紧密中心性的节点可以通过较短的路径到达其他节点。如需了解算法详情,请参阅紧密中心性。

函数签名

ClosenessCentrality(input_parameters) YIELD node, score

输入参数

所有常见输入参数以及:

名称 类型 必填 默认 说明
模式 STRING 否 完全匹配 算法模式。支持的值包括 EXACT 和 HYBRID。
use_wasserman_faust 布尔值 否 FALSE 如果为 false,则计算标准紧密中心性。如果为 true,则计算 Wasserman-Faust 接近中心性。
epsilon FLOAT64 否 0.1 仅用于 HYBRID 算法。必须介于 (0.0, 1.0) 之间。 值越小,精确度通常越高。值越大,算法执行速度通常越快。
sample_size INT64 否 0 仅用于 HYBRID 算法。用于近似计算中心性值的透视节点数量。必须为非负数。 如果未设置或为零,则使用默认值 min(100 * ln(N), N),其中 N 是输入图的节点数。

输出

函数生成:

名称 类型 说明
节点 GRAPH_ELEMENT(节点) 图表中的节点。
得分 FLOAT64 节点的紧密中心性得分。

示例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/my-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL ClosenessCentrality(
    node_labels => ['Account'], edge_labels => ['Transfers'],
    mode => 'EXACT'
  ) YIELD node, score
RETURN node.id, score;

聚簇

聚类算法将节点分组到聚类(也称为社区)中,使得每个聚类中的节点彼此之间的连接比与其他聚类中的节点之间的连接更密集。这有助于检测金融科技领域的潜在欺诈团伙、识别零售领域的细分客户群等。

WeaklyConnectedComponents

WeaklyConnectedComponents 会查找不相交的节点集,使得一个集中的每个节点都可以从同一集中的任何其他节点访问,但不能从其他集中的节点访问。如需了解算法详情,请参阅连通分量。

函数签名

WeaklyConnectedComponents(input_parameters) YIELD node, cluster

输入参数

所有常见输入参数。

输出

函数生成:

名称 类型 说明
节点 GRAPH_ELEMENT(节点) 图表中的节点。
集群 INT64 节点所属的连接组件/集群的 ID。 范围为 [0, N),其中 N 是图中的节点数。

示例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/wcc-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL WeaklyConnectedComponents(
    node_labels => ['Account'], edge_labels => ['Transfers']
  ) YIELD node, cluster
RETURN node.id, cluster;

ModularityClustering

ModularityClustering 通过优化模块化程度(一种衡量聚类内连接密度相对于随机网络中预期连接密度的质量指标)将图划分为聚类。如需了解算法详情,请参阅模块化聚类。

函数签名

ModularityClustering(input_parameters) YIELD node, cluster

输入参数

所有常见输入参数以及:

名称 类型 必填 默认 说明
分辨率 FLOAT64 否 1.0 控制聚类的粒度。必须是有限的非负数。分辨率值越小,聚类往往越大。 典型值介于 [0.5, 5] 范围内。当分辨率为零时,算法(在迭代次数足够的情况下)会找到图的连通分量(忽略权重为零的边)。
max_iterations INT64 否 10 算法的外部迭代次数上限。必须为正值。 值越大,聚类质量通常越高,但运行时间也越长。
max_inner_iterations INT64 否 10 算法的内部迭代次数上限。必须为正值。 值越大,聚类质量通常越高,但运行时间也越长。

输出

函数生成:

名称 类型 说明
节点 GRAPH_ELEMENT(节点) 图表中的节点。
集群 INT64 节点所属的社区/集群的 ID。 在 [0, N) 范围内,其中 N 是图中的节点数。

示例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/modularity-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL ModularityClustering(
    node_labels => ['Account'], edge_labels => ['Transfers'],
    resolution => 1.0, max_iterations => 10
  ) YIELD node, cluster
RETURN node.id, cluster;

CorrelationClustering

CorrelationClustering 根据节点的成对相似性或相异性对节点进行划分,旨在将相似的节点分组在一起,同时将相异的节点分开。如需了解算法详情,请参阅相关性聚类。

函数签名

CorrelationClustering(input_parameters) YIELD node, cluster

输入参数

所有常见输入参数以及:

名称 类型 必填 默认 说明
分辨率 FLOAT64 是 (无) 控制聚类的粒度。必须由客户端明确定义。必须是有限的非负数。值越小,聚类往往越大。当分辨率为零且所有边缘权重均为正时,算法(经过足够次数的迭代)会找到图的连通分量。
max_iterations INT64 否 10 算法的外部迭代次数上限。必须为正值。 值越大,聚类质量通常越高,但运行时间也越长。
max_inner_iterations INT64 否 10 算法的内部迭代次数上限。必须为正值。 值越大,聚类质量通常越高,但运行时间也越长。

输出

函数生成:

名称 类型 说明
节点 GRAPH_ELEMENT(节点) 图表中的节点。
集群 INT64 节点所属的社区/集群的 ID。 在 [0, N) 范围内,其中 N 是图中的节点数。

示例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/correlation-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL CorrelationClustering(
    node_labels => ['Account'], edge_labels => ['Transfers'],
    resolution => 0.5
  ) YIELD node, cluster
RETURN node.id, cluster;

LabelPropagation

LabelPropagation 使用标签传播技术将节点分配给聚类,从初始标签开始,该标签可以使用输入中提供的种子标签。随着节点迭代采用大多数邻居共享的标签,连接密集的群组会收敛到共识标签,从而形成社区。如需了解算法详情,请参阅标签传播。

函数签名

LabelPropagation(input_parameters) YIELD node, cluster

输入参数

所有常见输入参数以及:

名称 类型 必填 默认 说明
seed_label_property STRING 否 (无) 种子标签的节点属性名称。
max_iterations INT64 否 10 算法执行的标签传播迭代次数上限。必须是有限的正数。

输出

函数生成:

名称 类型 说明
节点 GRAPH_ELEMENT(节点) 图表中的节点。
集群 INT64 节点的传播集群/标签 ID。

示例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/lp-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL LabelPropagation(
    node_labels => ['Account'], edge_labels => ['Transfers'],
    max_iterations => 10
  ) YIELD node, cluster
RETURN node.id, cluster;

CliqueFinding

CliqueFinding 用于识别满足最低密度阈值的潜在重叠密集社区,以便每个派系(一组节点,其中每个节点都连接到所有其他节点)都包含在至少一个聚类中。如需了解算法详情,请参阅派系聚合器。

函数签名

CliqueFinding(input_parameters) YIELD node, clique

注意:与大多数算法不同,同一节点可以有多行,因为一个节点可能是多个派系的一部分。

输入参数

所有常见输入参数以及:

名称 类型 必填 默认 说明
min_density FLOAT64 否 0.9 要返回的集群的最小密度。必须介于 [0, 1] 之间。

输出

函数生成:

名称 类型 说明
节点 GRAPH_ELEMENT(节点) 图表中的节点。
clique INT64 节点所属派系的 ID。

示例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/clique-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL CliqueFinding(
    node_labels => ['Account'], edge_labels => ['Transfers'],
    min_density => 0.9
  ) YIELD node, clique
RETURN node.id, clique;

相似度

相似度算法根据节点邻域的结构量化节点对的相似程度。这对于推断节点之间缺失的边以进行实体解析、推荐等非常有用。

Spanner Graph 支持以下成对节点相似度,其中相似度得分是根据节点的邻域计算的。

  • JaccardSimilarity:基于共同邻居与总邻居的比率
  • CosineSimilarity:基于共同邻居的边权重
  • CommonNeighborsSimilarity:基于共享邻居的数量
  • TotalNeighborsSimilarity:基于至少一个节点的邻居数量

如需了解算法详情,请参阅成对节点相似度。

这四种算法具有相同的实参和输出结构。

函数签名

[JaccardSimilarity|CosineSimilarity|CommonNeighborsSimilarity|TotalNeighborsSimilarity](input_parameters) YIELD source_node, target_node, similarity

输入参数

所有常见输入参数以及:

名称 类型 必填 默认 说明
source_nodes 图节点数组 是 不适用 用于计算两两相似度的源节点。
target_nodes 图节点数组 是 不适用 用于成对相似度计算的目标节点。

输出

函数生成:

名称 类型 说明
source_node GRAPH_ELEMENT(节点) 相似度计算中使用的源节点。
target_node GRAPH_ELEMENT(节点) 相似度计算中使用的目标节点。
相似度 FLOAT64 源节点与目标节点之间的计算相似度得分。

示例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/jaccard-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL JaccardSimilarity(
    source_nodes => ARRAY {
                      MATCH (n:Account {id: 7})
                      RETURN n
                    },
    target_nodes => ARRAY {
                      MATCH (n:Account)
                      WHERE n.id != 7
                      RETURN n
                    }
  ) YIELD source_node, target_node, similarity
RETURN source_node.id AS source_id, target_node.id AS target_id, similarity;

寻路

路径查找算法用于计算节点之间的最佳路线。这有助于确定供应链中的最低成本路线、评估网络安全中的漏洞等。

ShortestPath

ShortestPath 用于计算一组给定的源节点与一组给定的目标节点之间的最短路径。如需了解算法详情,请参阅多对多最短路径。

函数签名

ShortestPath(input_parameters) YIELD source_node, target_node, path, cost

输入参数

所有常见输入参数以及:

名称 类型 必填 默认 说明
source_nodes 图节点数组 是 不适用 用于计算最短路径的源节点。
target_nodes 图节点数组 是 不适用 用于计算最短路径的目标节点。

输出

函数生成:

名称 类型 说明
source_node GRAPH_ELEMENT(节点) 路径的源节点。
target_node GRAPH_ELEMENT(节点) 路径的目标节点。
路径 GRAPH_PATH 找到的最短路径。
费用 FLOAT64 最短路径的费用。

示例

EXPORT DATA OPTIONS (
  uri = "gs://my-bucket-name/shortest-path-output.csv",
  format = "csv"
) AS
GRAPH FinGraph
CALL ShortestPath(
    source_nodes => ARRAY {
                      MATCH (n:Account {id: 7})
                      RETURN n
                    },
    target_nodes => ARRAY {
                      MATCH (n:Account {id: 16})
                      RETURN n
                    }
  ) YIELD source_node, target_node, path, cost
RETURN source_node.id AS source_id, target_node.id AS target_id, PATH_LENGTH(path) AS length, cost;

后续步骤