PageRank

介绍

PageRank 算法基于入站关系的数量和相应源节点的重要性,来衡量图中每个节点的重要性。粗略地说,其基本假设是:一个页面的重要性取决于指向它的那些页面的重要性。

PageRank 在 Google 的原始论文中被引入,作为一个求解以下方程的函数:

page rank formula

其中,

  • 假设页面 A 有指向它的页面 T1Tn

  • d 是阻尼系数(damping factor),取值范围为 0(含)到 1(不含)。通常设为 0.85。

  • C(A) 定义为页面 A 的出链数量。

该方程用于迭代更新候选解,从而得出该方程的近似解。

有关此算法的更多信息,请参阅

注意事项

使用 PageRank 算法时,需要注意以下几点:

  • 如果一组页面内部没有指向该组外部的关系,则该组被视为“蜘蛛陷阱”(spider trap)。

  • 当页面网络形成无限循环时,可能会出现排名汇聚 (rank sink)。

  • 当页面没有任何出口关系时,会出现死胡同 (dead-ends)。

改变阻尼系数可以帮助解决上述所有问题。它可被解释为网络冲浪者有时会跳到一个随机页面的概率,从而避免陷入汇聚点。

语法

本节涵盖执行 PageRank 算法所需的语法。

运行 PageRank。
CALL graph.page_rank(
  'CPU_X64_XS',                    (1)
  {
    ['defaultTablePrefix': '...',] (2)
    'project': {...},              (3)
    'compute': {...},              (4)
    'write':   {...}               (5)
  }
);
1 计算池选择器。
2 表引用的可选前缀。
3 项目配置。
4 计算配置。
5 写入配置。
表 1. 参数
名称 类型 默认 可选 描述

computePoolSelector

字符串

不适用

用于运行 PageRank 作业的计算池选择器。

配置

Map

{}

用于图项目、算法计算和结果回写的配置。

配置映射由以下三个条目组成。

有关以下项目配置的更多详细信息,请参阅 项目文档
表 2. 项目配置
名称 类型

nodeTables

节点表列表。

relationshipTables

关系类型到关系表的映射。

表 3. 计算配置
名称 类型 默认 可选 描述

resultProperty

字符串

'pageRank'

将回写到 Snowflake 数据库的节点属性。

dampingFactor(阻尼系数)

浮点数

0.85

PageRank 计算的阻尼系数。必须在 [0, 1) 范围内。

maxIterations

整数

20

运行 PageRank 的最大迭代次数。

tolerance

浮点数

0.0000001

迭代间得分的最小变化量。如果所有得分的变化均小于该容差值,则结果被视为稳定,算法随即返回。

relationshipWeightProperty

字符串

null

用作权重的关系属性名称。如果未指定,算法将作为无权重运行。

sourceNodes

节点/数字或列表,或作为列表的对列表

[]

用于计算个性化 PageRank (Personalized Page Rank) 的节点、节点 ID 或节点-偏置对。若要为不同的源节点使用不同的偏置,请使用以下语法: [[nodeId1, bias1], [nodeId2, bias2], …​]

sourceNodesTable

字符串

null

1

包含源节点的表名。

scaler

字符串或映射

None

应用于最终得分的缩放器名称。支持的值包括 NoneMinMaxMaxMeanLogStdScore。如需应用特定的缩放器配置,请使用映射语法:{scaler: 'name', …​}

1 当指定 sourceNodes 参数时,sourceNodesTable 参数是强制性的。

关于下文写入配置的更多详细信息,请参考 写入文档
表 4. 写入配置
名称 类型 默认 可选 描述

nodeLabel

字符串

不适用

内存中图中用于写入节点属性的节点标签。

nodeProperty

字符串

'pageRank'

将回写到 Snowflake 数据库的节点属性。

outputTable

字符串

不适用

Snowflake 数据库中写入节点属性的表。

示例

在本节中,我们将展示在具体图表上运行 PageRank 算法的示例。目的是说明结果的样子,并为如何在实际环境中使用该算法提供指导。我们将在一个由少量节点按特定模式连接的小型网络图上演示。示例图如下所示:

Visualization of the example graph
以下 SQL 语句将在 Snowflake 数据库中创建示例图表:
CREATE OR REPLACE TABLE EXAMPLE_DB.DATA_SCHEMA.PAGES (NODEID VARCHAR);
INSERT INTO EXAMPLE_DB.DATA_SCHEMA.PAGES VALUES
  ('Home'),
  ('About'),
  ('Product'),
  ('Links'),
  ('Site A'),
  ('Site B'),
  ('Site C'),
  ('Site D');

CREATE OR REPLACE TABLE EXAMPLE_DB.DATA_SCHEMA.LINKS (SOURCENODEID VARCHAR, TARGETNODEID VARCHAR, WEIGHT FLOAT);
INSERT INTO EXAMPLE_DB.DATA_SCHEMA.LINKS VALUES
  ('Home',    'About',   0.2),
  ('Home',    'Links',   0.2),
  ('Home',    'Product', 0.6),
  ('About',   'Home',    1.0),
  ('Product', 'Home',    1.0),
  ('Site A',  'Home',    1.0),
  ('Site B',  'Home',    1.0),
  ('Site C',  'Home',    1.0),
  ('Site D',  'Home',    1.0),
  ('Links',   'Home',    0.8),
  ('Links',   'Site A',  0.05),
  ('Links',   'Site B',  0.05),
  ('Links',   'Site C',  0.05),
  ('Links',   'Site D',  0.05);

此图表示八个页面,它们相互链接。每个关系都有一个名为 weight 的属性,用于描述关系的重要性。

运行作业

运行 PageRank 作业涉及三个步骤:投影 (Project)、计算 (Compute) 和写入 (Write)。

要运行查询,需要为应用程序、您的消费者角色和您的环境设置必要的权限。请参阅 入门 页面以了解更多信息。

我们还假设应用程序名称为默认的 Neo4j_Graph_Analytics。如果您在安装过程中选择了不同的应用程序名称,请将其替换为该名称。

以下代码将运行 PageRank 作业:
CALL Neo4j_Graph_Analytics.graph.page_rank('CPU_X64_XS', {
    'defaultTablePrefix': 'EXAMPLE_DB.DATA_SCHEMA',
    'project': {
        'nodeTables': [ 'PAGES' ],
        'relationshipTables': {
            'LINKS': {
                'sourceTable': 'PAGES',
                'targetTable': 'PAGES'
            }
        }
    },
    'compute': {
        'resultProperty': 'score'
    },
    'write': [{
        'nodeLabel': 'PAGES',
        'outputTable': 'PAGES_CENTRALITY',
        'nodeProperty': 'score'
    }]
});
表 5. 结果
JOB_ID JOB_STATUS JOB_START JOB_END JOB_RESULT

job_389ecfb0408e407187049486effebf43

SUCCESS

2025-06-25 09:48:14.968

2025-06-25 09:48:20.425

 {
    "page_rank_1": {
      "centralityDistribution": {
        "max": 3.215682983398437,
        "mean": 0.9612393379211426,
        "min": 0.32785606384277344,
        "p50": 0.32785606384277344,
        "p75": 1.0542736053466797,
        "p90": 3.2156810760498047,
        "p95": 3.2156810760498047,
        "p99": 3.2156810760498047,
        "p999": 3.2156810760498047
      },
      "computeMillis": 106,
      "configuration": {
        "concurrency": 2,
        "dampingFactor": 0.85,
        "maxIterations": 20,
        "resultProperty": "score",
        "nodeLabels": ["*"],
        "relationshipTypes": ["*"],
        "scaler": "NONE",
        "sourceNodes": [],
        "tolerance": 1.000000000000000e-07
      },
      "didConverge": false,
      "ranIterations": 20
    },
    "project_1": {
      "graphName": "snowgraph",
      "nodeCount": 8,
      "nodeLabels": ...,
      "nodeMillis": 291,
      "relationshipCount": 14,
      "relationshipMillis": 442,
      "relationshipTypes": ...,
      "totalMillis": 733
    },
    "write_node_property_1": {
      "nodeLabel": "PAGES",
      "nodeProperty": "score",
      "outputTable": "EXAMPLE_DB.DATA_SCHEMA.PAGES_CENTRALITY",
      "rowsWritten": 8,
      "writeMillis": 2100
    }
}

返回的结果包含有关作业执行和结果分布的信息。中心度分布直方图对于检查计算出的分数或执行归一化很有用。此外,七个节点中每个节点的中心度分数已被写回 Snowflake 数据库。我们可以通过以下方式进行查询:

SELECT * FROM EXAMPLE_DB.DATA_SCHEMA.PAGES_CENTRALITY ORDER BY score DESC;
表 6. 结果
NODEID SCORE

首页

3.215682

关于

1.054270055

产品

1.054270055

链接

1.054270055

站点 A

0.3278578964

站点 B

0.3278578964

站点 C

0.3278578964

站点 D

0.3278578964

上述查询以 unweighted(未加权)模式运行 PageRank 算法,返回的分数未进行归一化。在下面,您可以找到加权图的示例。另一个示例展示了如何使用缩放器 (scaler) 对最终分数进行归一化。

加权 (Weighted)

默认情况下,算法认为图的关系是 unweighted(未加权)的。要改变这种行为,可以使用名为 relationshipWeightProperty 的配置参数。在 weighted(加权)情况下,节点发送给邻居的前一个分数会乘以关系权重,然后除以其传出关系权重的总和。如果关系属性的值为负数,它将在计算过程中被忽略。以下是使用关系属性运行算法的示例。

以下代码将运行带权重的 PageRank 作业:
CALL Neo4j_Graph_Analytics.graph.page_rank('CPU_X64_XS', {
    'defaultTablePrefix': 'EXAMPLE_DB.DATA_SCHEMA',
    'project': {
        'nodeTables': [ 'PAGES' ],
        'relationshipTables': {
            'LINKS': {
                'sourceTable': 'PAGES',
                'targetTable': 'PAGES'
            }
        }
    },
    'compute': {
        'resultProperty': 'score',
        'maxIterations': 20,
        'dampingFactor': 0.85,
        'relationshipWeightProperty': 'WEIGHT'
    },
    'write': [{
        'nodeLabel': 'PAGES',
        'outputTable': 'PAGES_CENTRALITY',
        'nodeProperty': 'score'
    }]
});
表 7. 结果
JOB_ID JOB_STATUS JOB_START JOB_END JOB_RESULT

job_acdcd121d84c49bdb50739ce7c1fe07f

SUCCESS

2025-06-25 09:54:25.390

2025-06-25 09:54:30.822

 {
    "page_rank_1": {
      "centralityDistribution": {
        "max": 3.537521362304687,
        "mean": 0.9612407684326172,
        "min": 0.18152618408203125,
        "p50": 0.18152618408203125,
        "p75": 0.7452611923217773,
        "p90": 3.537520408630371,
        "p95": 3.537520408630371,
        "p99": 3.537520408630371,
        "p999": 3.537520408630371
      },
      "computeMillis": 101,
      "configuration": {
        "concurrency": 2,
        "dampingFactor": 0.85,
        "maxIterations": 20,
        "resultProperty": "score",
        "nodeLabels": ["*"],
        "relationshipTypes": ["*"],
        "relationshipWeightProperty": "WEIGHT",
        "scaler": "NONE",
        "sourceNodes": [],
        "tolerance": 1.000000000000000e-07
      },
      "didConverge": false,
      "ranIterations": 20
    },
    "project_1": {
      "graphName": "snowgraph",
      "nodeCount": 8,
      "nodeLabels": ...,
      "nodeMillis": 139,
      "relationshipCount": 14,
      "relationshipMillis": 593,
      "relationshipTypes": ...,
      "totalMillis": 732
    },
    "write_node_property_1": {
      "nodeLabel": "PAGES",
      "nodeProperty": "score",
      "outputTable": "EXAMPLE_DB.DATA_SCHEMA.PAGES_CENTRALITY",
      "rowsWritten": 8,
      "writeMillis": 1824
    }
}

与未加权示例相比,正如预期的那样,Product 的排名有所提升。

SELECT * FROM EXAMPLE_DB.DATA_SCHEMA.PAGES_CENTRALITY ORDER BY score DESC;
表 8. 结果
NODEID SCORE

首页

3.537510284

产品

1.935783829

关于

0.7452612764

链接

0.7452612764

站点 A

0.1815267714

站点 B

0.1815267714

站点 C

0.1815267714

站点 D

0.1815267714

容差 (Tolerance)

tolerance 配置参数表示迭代之间分数变化的最小值。如果所有分数的变化都小于配置的 tolerance 值,则结果趋于稳定,算法返回。

以下代码将运行带容差的 PageRank 作业:
CALL Neo4j_Graph_Analytics.graph.page_rank('CPU_X64_XS', {
    'defaultTablePrefix': 'EXAMPLE_DB.DATA_SCHEMA',
    'project': {
        'nodeTables': [ 'PAGES' ],
        'relationshipTables': {
            'LINKS': {
                'sourceTable': 'PAGES',
                'targetTable': 'PAGES'
            }
        }
    },
    'compute': {
        'resultProperty': 'score',
        'maxIterations': 20,
        'dampingFactor': 0.85,
        'tolerance': 0.1
    },
    'write': [{
        'nodeLabel': 'PAGES',
        'outputTable': 'PAGES_CENTRALITY',
        'nodeProperty': 'score'
    }]
});
表 9. 结果
JOB_ID JOB_STATUS JOB_START JOB_END JOB_RESULT

job_3c7ea7a540594934b06adef0b1e8a55a

SUCCESS

2025-06-25 09:59:32.257

2025-06-25 09:59:37.375

 {
    "page_rank_1": {
      "centralityDistribution": {
        "max": 1.581245422363281,
        "mean": 0.5387876033782959,
        "min": 0.2337493896484375,
        "p50": 0.2337493896484375,
        "p75": 0.5980215072631836,
        "p90": 1.5812444686889648,
        "p95": 1.5812444686889648,
        "p99": 1.5812444686889648,
        "p999": 1.5812444686889648
      },
      "computeMillis": 69,
      "configuration": {
        "concurrency": 2,
        "dampingFactor": 0.85,
        "maxIterations": 20,
        "resultProperty": "score",
        "nodeLabels": ["*"],
        "relationshipTypes": ["*"],
        "scaler": "NONE",
        "sourceNodes": [],
        "tolerance": 0.1
      },
      "didConverge": true,
      "ranIterations": 6
    },
    "project_1": {
      "graphName": "snowgraph",
      "nodeCount": 8,
      "nodeLabels": ...,
      "nodeMillis": 151,
      "relationshipCount": 14,
      "relationshipMillis": 398,
      "relationshipTypes": ...,
      "totalMillis": 549
    },
    "write_node_property_1": {
      "nodeLabel": "PAGES",
      "nodeProperty": "score",
      "outputTable": "EXAMPLE_DB.DATA_SCHEMA.PAGES_CENTRALITY",
      "rowsWritten": 8,
      "writeMillis": 1810
    }
}
SELECT * FROM EXAMPLE_DB.DATA_SCHEMA.PAGES_CENTRALITY ORDER BY score DESC;
表 10. 结果
NODEID SCORE

首页

1.581245067

关于

0.5980194356

产品

0.5980194356

链接

0.5980194356

站点 A

0.2337495515

站点 B

0.2337495515

站点 C

0.2337495515

站点 D

0.2337495515

与原始示例相比,我们在三分之一的时间内(6 次迭代而不是 20 次)得到了相当的结果。

阻尼系数 (Damping Factor)

阻尼系数配置参数接受 0(含)到 1(不含)之间的值。如果该值过高,可能会出现汇聚点(sinks)和蜘蛛陷阱(spider traps)问题,且数值可能会振荡,导致算法无法收敛。如果该值过低,则所有分数都会被推向 1,结果将无法充分反映图的结构。

以下代码将运行带容差的 PageRank 作业:
CALL Neo4j_Graph_Analytics.graph.page_rank('CPU_X64_XS', {
    'defaultTablePrefix': 'EXAMPLE_DB.DATA_SCHEMA',
    'project': {
        'nodeTables': [ 'PAGES' ],
        'relationshipTables': {
            'LINKS': {
                'sourceTable': 'PAGES',
                'targetTable': 'PAGES'
            }
        }
    },
    'compute': {
        'resultProperty': 'score',
        'maxIterations': 20,
        'dampingFactor': 0.05
    },
    'write': [{
        'nodeLabel': 'PAGES',
        'outputTable': 'PAGES_CENTRALITY',
        'nodeProperty': 'score'
    }]
});
表 11. 结果
JOB_ID JOB_STATUS JOB_START JOB_END JOB_RESULT

job_199788cefb85415aa435e07b4f0b16a7

SUCCESS

2025-06-25 10:03:45.996

2025-06-25 10:03:51.061

 {
    "page_rank_1": {
      "centralityDistribution": {
        "max": 1.2487335205078123,
        "mean": 0.999997615814209,
        "min": 0.9597053527832031,
        "p50": 0.9597053527832031,
        "p75": 0.9708099365234375,
        "p90": 1.2487297058105469,
        "p95": 1.2487297058105469,
        "p99": 1.2487297058105469,
        "p999": 1.2487297058105469
      },
      "computeMillis": 76,
      "configuration": {
        "concurrency": 2,
        "dampingFactor": 0.05,
        "maxIterations": 20,
        "resultProperty": "score",
        "nodeLabels": ["*"],
        "relationshipTypes": ["*"],
        "scaler": "NONE",
        "sourceNodes": [],
        "tolerance": 1.000000000000000e-07
      },
      "didConverge": true,
      "ranIterations": 6
    },
    "project_1": {
      "graphName": "snowgraph",
      "nodeCount": 8,
      "nodeLabels": ...,
      "nodeMillis": 188,
      "relationshipCount": 14,
      "relationshipMillis": 369,
      "relationshipTypes": ...,
      "totalMillis": 557
    },
    "write_node_property_1": {
      "nodeLabel": "PAGES",
      "nodeProperty": "score",
      "outputTable": "EXAMPLE_DB.DATA_SCHEMA.PAGES_CENTRALITY",
      "rowsWritten": 8,
      "writeMillis": 1934
    }
}
SELECT * FROM EXAMPLE_DB.DATA_SCHEMA.PAGES_CENTRALITY ORDER BY score DESC;
表 12. 结果
NODEID SCORE

首页

1.248730943

关于

0.9708121819

产品

0.9708121819

链接

0.9708121819

站点 A

0.9597081216

站点 B

0.9597081216

站点 C

0.9597081216

站点 D

0.9597081216

与使用 dampingFactor 默认值的原始示例结果相比,当使用 dampingFactor: 0.05 时,分数更加接近。以牺牲信息量为代价,实现了更快的收敛(6 次迭代)。

个性化 PageRank (Personalised PageRank)

个性化 PageRank 是 PageRank 的一种变体,它偏向于一组 sourceNodes(源节点)。这种 PageRank 变体通常用作推荐系统的一部分。

以下示例展示了如何运行以“站点 A”为中心的 PageRank。

以下代码将运行指定了源节点的 PageRank 作业:
CALL Neo4j_Graph_Analytics.graph.page_rank('CPU_X64_XS', {
    'defaultTablePrefix': 'EXAMPLE_DB.DATA_SCHEMA',
    'project': {
        'nodeTables': [ 'PAGES' ],
        'relationshipTables': {
            'LINKS': {
                'sourceTable': 'PAGES',
                'targetTable': 'PAGES'
            }
        }
    },
    'compute': {
        'resultProperty': 'score',
        'maxIterations': 20,
        'dampingFactor': 0.85,
        'sourceNodes': ['Site A'],
        'sourceNodesTable': 'PAGES'
    },
    'write': [{
        'nodeLabel': 'PAGES',
        'outputTable': 'PAGES_CENTRALITY',
        'nodeProperty': 'score'
    }]
});
表 13. 结果
JOB_ID JOB_STATUS JOB_START JOB_END JOB_RESULT

job_83844b41641b48a8a2c547c14c4ff6d9

SUCCESS

2025-06-25 10:08:14.987

2025-06-25 10:08:19.910

 {
    "page_rank_1": {
      "centralityDistribution": {
        "max": 0.3990230560302734,
        "mean": 0.12015484273433685,
        "min": 0.018903136253356934,
        "p50": 0.11220157146453857,
        "p75": 0.11220157146453857,
        "p90": 0.3990229368209839,
        "p95": 0.3990229368209839,
        "p99": 0.3990229368209839,
        "p999": 0.3990229368209839
      },
      "computeMillis": 77,
      "configuration": {
        "concurrency": 2,
        "dampingFactor": 0.85,
        "maxIterations": 20,
        "resultProperty": "score",
        "nodeLabels": ["*"],
        "relationshipTypes": ["*"],
        "scaler": "NONE",
        "sourceNodes": ["Site A"],
        "sourceNodesTable": "EXAMPLE_DB.DATA_SCHEMA.PAGES",
        "tolerance": 1.000000000000000e-07
      },
      "didConverge": false,
      "ranIterations": 20
    },
    "project_1": {
      "graphName": "snowgraph",
      "nodeCount": 8,
      "nodeLabels": ...,
      "nodeMillis": 135,
      "relationshipCount": 14,
      "relationshipMillis": 355,
      "relationshipTypes": ...,
      "totalMillis": 490
    },
    "write_node_property_1": {
      "nodeLabel": "PAGES",
      "nodeProperty": "score",
      "outputTable": "EXAMPLE_DB.DATA_SCHEMA.PAGES_CENTRALITY",
      "rowsWritten": 8,
      "writeMillis": 1714
    }
}

我们可以看到,通过将重点放在站点 A 上,它在排名中上升了。

SELECT * FROM EXAMPLE_DB.DATA_SCHEMA.PAGES_CENTRALITY ORDER BY score DESC;
表 14. 结果
NODEID SCORE

首页

0.3990229044

站点 A

0.168903253

关于

0.1122015175

产品

0.1122015175

链接

0.1122015175

站点 B

0.01890325302

站点 C

0.01890325302

站点 D

0.01890325302

带偏置的个性化 PageRank

在 GDS 中,个性化 PageRank 也可以在源节点之间以不同的偏置运行。与常规的个性化 PageRank 一样,这模拟了一个在特定源节点集重启的随机游走。在带偏置的情况下,重启的可能性 (1-dampingFactor) 保持不变,但重启的目标位置将根据设置进行偏置。

以下示例展示了如何运行以“站点 A”和“站点 B”为中心、且“站点 B”的偏置是“站点 A”两倍的 PageRank。带偏置的源节点以节点-值对(列表)的形式输入。

以下代码将运行指定了源节点的 PageRank 作业:
CALL Neo4j_Graph_Analytics.graph.page_rank('CPU_X64_XS', {
    'defaultTablePrefix': 'EXAMPLE_DB.DATA_SCHEMA',
    'project': {
        'nodeTables': [ 'PAGES' ],
        'relationshipTables': {
            'LINKS': {
                'sourceTable': 'PAGES',
                'targetTable': 'PAGES'
            }
        }
    },
    'compute': {
        'resultProperty': 'score',
        'maxIterations': 20,
        'dampingFactor': 0.85,
        'sourceNodes': [['Site A', 1], ['Site B', 2]],
        'sourceNodesTable': 'PAGES'
    },
    'write': [{
        'nodeLabel': 'PAGES',
        'outputTable': 'PAGES_CENTRALITY',
        'nodeProperty': 'score'
    }]
});
表 15. 结果
JOB_ID JOB_STATUS JOB_START JOB_END JOB_RESULT

job_4c4c590a9dcb4df08a55d6e6e6f5e4c7

SUCCESS

2025-06-25 10:14:10.288

2025-06-25 10:14:15.641

 {
    "page_rank_1": {
      "centralityDistribution": {
        "max": 1.1970748901367185,
        "mean": 0.3604651689529419,
        "min": 0.05670952796936035,
        "p50": 0.3366048336029053,
        "p75": 0.3366048336029053,
        "p90": 1.1970746517181396,
        "p95": 1.1970746517181396,
        "p99": 1.1970746517181396,
        "p999": 1.1970746517181396
      },
      "computeMillis": 66,
      "configuration": {
        "concurrency": 2,
        "dampingFactor": 0.85,
        "maxIterations": 20,
        "resultProperty": "score",
        "nodeLabels": ["*"],
        "relationshipTypes": ["*"],
        "scaler": "NONE",
        "sourceNodes": [["Site A",1],["Site B",2]],
        "sourceNodesTable": "EXAMPLE_DB.DATA_SCHEMA.PAGES",
        "tolerance": 1.000000000000000e-07
      },
      "didConverge": false,
      "ranIterations": 20
    },
    "project_1": {
      "graphName": "snowgraph",
      "nodeCount": 8,
      "nodeLabels": ...,
      "nodeMillis": 138,
      "relationshipCount": 14,
      "relationshipMillis": 323,
      "relationshipTypes": ...,
      "totalMillis": 461
    },
    "write_node_property_1": {
      "nodeLabel": "PAGES",
      "nodeProperty": "score",
      "outputTable": "EXAMPLE_DB.DATA_SCHEMA.PAGES_CENTRALITY",
      "rowsWritten": 8,
      "writeMillis": 2104
    }
}

我们观察到,由于 B 获得了偏置,B 的排名远高于 A,而 A 的排名又高于 C 和 D。

SELECT * FROM EXAMPLE_DB.DATA_SCHEMA.PAGES_CENTRALITY ORDER BY score DESC;
表 16. 结果
NODEID SCORE

首页

1.197068713

站点 B

0.3567097591

关于

0.3366045524

产品

0.3366045524

链接

0.3366045524

站点 A

0.2067097591

站点 C

0.05670975905

站点 D

0.05670975905

缩放中心度得分

要将最终分数的归一化作为算法执行的一部分,可以使用 scaler 配置参数。所有可用缩放器的描述可以在 附录:缩放器 中找到。

让我们看一看:

以下代码将运行带缩放器的 PageRank 作业:
CALL Neo4j_Graph_Analytics.graph.page_rank('CPU_X64_XS', {
    'defaultTablePrefix': 'EXAMPLE_DB.DATA_SCHEMA',
    'project': {
        'nodeTables': [ 'PAGES' ],
        'relationshipTables': {
            'LINKS': {
                'sourceTable': 'PAGES',
                'targetTable': 'PAGES'
            }
        }
    },
    'compute': {
        'resultProperty': 'score',
        'scaler': 'Mean'
    },
    'write': [{
        'nodeLabel': 'PAGES',
        'outputTable': 'PAGES_CENTRALITY',
        'nodeProperty': 'score'
    }]
});
表 17. 结果
JOB_ID JOB_STATUS JOB_START JOB_END JOB_RESULT

job_840d6ac0dfa245bb82456017a24d2b71

SUCCESS

2025-06-24 13:47:43.484

2025-06-24 13:47:48.661

 {
    "page_rank_1": {
      "centralityDistribution": {
        "Error": "Unable to create histogram due to range of scores exceeding implementation limits."
      },
      "computeMillis": 136,
      "configuration": {
        "concurrency": 2,
        "dampingFactor": 0.85,
        "maxIterations": 20,
        "resultProperty": "score",
        "nodeLabels": ["*"],
        "relationshipTypes": ["*"],
        "scaler": "MEAN",
        "sourceNodes": [],
        "tolerance": 1.000000000000000e-07
      },
      "didConverge": false,
      "ranIterations": 20
    },
    "project_1": {
      "graphName": "snowgraph",
      "nodeCount": 8,
      "nodeLabels": ...,
      "nodeMillis": 195,
      "relationshipCount": 14,
      "relationshipMillis": 399,
      "relationshipTypes": ...,
      "totalMillis": 594
    },
    "write_node_property_1": {
      "nodeLabel": "PAGES",
      "nodeProperty": "score",
      "outputTable": "EXAMPLE_DB.DATA_SCHEMA.PAGES_CENTRALITY",
      "rowsWritten": 8,
      "writeMillis": 1891
    }
}

正如您在上面的输出中所见,记录概率分布存在已知的局限性。这不会影响结果。

SELECT * FROM EXAMPLE_DB.DATA_SCHEMA.PAGES_CENTRALITY ORDER BY score DESC;
表 18. 结果
NODEID SCORE

首页

0.7806713464

关于

0.03221442268

产品

0.03221442268

链接

0.03221442268

站点 A

-0.2193286536

站点 B

-0.2193286536

站点 C

-0.2193286536

站点 D

-0.2193286536

将结果与第一个示例进行比较,我们可以看到,即使分数已缩放,分数的相对顺序也是相同的。