基本工作流程

图中最常见的问题之一是查找节点之间的最短路径。本示例展示了如何从 Neo4j 数据创建 GDS 图,运行路径查找算法,并将结果写回 Neo4j。

创建图

以下 Cypher 查询在 Neo4j 数据库中创建了一个小型火车网络图。每个关系都包含一个数值属性 distance,表示两个站点之间的距离。

CREATE
  // Add the stations
  (a:Station {name: 'Kings Cross'}),
  (b:Station {name: 'Euston'}),
  (c:Station {name: 'Camden Town'}),
  (d:Station {name: 'Mornington Crescent'}),
  (e:Station {name: 'Kentish Town'}),

  // Add the connections between stations
  (a)-[:CONNECTION {distance: 0.7}]->(b),
  (b)-[:CONNECTION {distance: 1.3}]->(c),
  (b)-[:CONNECTION {distance: 0.7}]->(d),
  (d)-[:CONNECTION {distance: 0.6}]->(c),
  (c)-[:CONNECTION {distance: 1.3}]->(e)

图如下所示

Tube graph.

下一个查询将从 :Station 节点和具有 distance 属性的 :CONNECTION 关系中创建一个名为 trainGraph 的内存图。

MATCH (source:Station)-[r:CONNECTION]->(target:Station)
RETURN gds.graph.project(
  'trainGraph',
  source,
  target,
  { relationshipProperties: r { .distance } }
)

stream 模式运行算法

计算图中最短路径的第一个好的候选算法是 Dijkstra 源-目标最短路径算法。要试用它,请在 stream 模式下使用它,以在查询输出中查看结果。

MATCH  (1)
  (source:Station {name: 'Kings Cross'}),
  (target:Station {name: 'Kentish Town'})
CALL gds.shortestPath.dijkstra.stream(  (2)
  'trainGraph',  (3)
  {  (4)
    sourceNode: source,
    targetNode: target,
    relationshipWeightProperty: 'distance'
  }
)
YIELD  (5)
  index,
  sourceNode,
  targetNode,
  totalCost,
  path
RETURN  (6)
  index,
  gds.util.asNode(sourceNode).name AS sourceNodeName,
  gds.util.asNode(targetNode).name AS targetNodeName,
  totalCost,
  nodes(path) AS path
ORDER BY index
1 用于定义源节点和目标节点的 MATCH 子句。
2 stream 模式运行的 gds.shortestPath.dijkstra 算法。
3 要运行算法的投影图名称。
4 算法 语法部分中列出的配置参数(Stream mode 面板)。
5 算法 语法部分中列出的结果字段(Stream mode 面板)。仅包含您需要的字段。
6 查询结果字段,通常是 YIELD 子句中用 Cypher 函数包装的结果字段。gds.util.asNode() 函数检索与投影节点对应的 Neo4j 节点。在路径查找算法中,nodes() Cypher 函数对于将节点路径作为节点列表返回很有用。
查询结果
索引 源节点名称 目标节点名称 总成本 路径

0

"国王十字"

"肯蒂什镇"

3.3

[节点[0], 节点[1], 节点[2], 节点[4]]

写入结果

如果算法结果符合预期,下一步可以将其写回 Neo4j 数据库。以下查询与 stream 查询非常相似,只是增加了 write 模式特有的一些配置参数和不同的结果格式。

MATCH  (1)
  (source:Station {name: 'Kings Cross'}),
  (target:Station {name: 'Kentish Town'})
CALL gds.shortestPath.dijkstra.write(  (2)
  'trainGraph',  (3)
  {  (4)
    sourceNode: source,
    targetNode: target,
    relationshipWeightProperty: 'distance',
    writeRelationshipType: 'PATH',
    writeNodeIds: true,
    writeCosts: true
  }
)
YIELD relationshipsWritten
RETURN relationshipsWritten
1 用于定义源节点和目标节点的 MATCH 子句。
2 write 模式运行的 gds.shortestPath.dijkstra 算法。
3 投影图的名称。
4 算法 语法部分中列出的配置参数(Write mode 面板)。在本例中,使用三个参数 writeRelationshipTypewriteNodeIdswriteCosts 来创建新的 :PATH 关系及其 totalCostnodeIdscosts 属性。
查询结果
已写入关系数

1

查询 Neo4j 数据库

要检查算法结果是否已正确写回 Neo4j,您可以运行一个 Cypher 查询,其中包含上一步中写入的新关系和关系属性(在本例中,是带有 nodeIdscoststotalCost 属性的 PATH 关系)。

MATCH (source)-[r:PATH]->(target)
RETURN
  source.name,
  [nodeId IN r.nodeIds | gds.util.asNode(nodeId).name] AS nodeNames,
  r.costs,
  r.totalCost,
  target.name
查询结果
源.名称 节点名称 r.成本 r.总成本 目标.名称

"国王十字"

["国王十字", "尤斯顿", "卡姆登镇", "肯蒂什镇"]

[0.0, 0.7, 2.0, 3.3]

3.3

"肯蒂什镇"

下一步

本示例涵盖了使用 GDS 算法的基础知识。 下一个示例展示了一个完整的端到端工作流程,包括如何将一个算法的输出用于另一个算法。

© . All rights reserved.