在练习 Neo4j 在线课程 - Neo4j 图数据科学基础知识时,我对以下课程示例感到困惑:
首先,创建图形投影。
CALL gds.graph.project('proj',
['Person','Movie'],
{
ACTED_IN:{orientation:'UNDIRECTED'},
DIRECTED:{orientation:'UNDIRECTED'}
}
);
然后我们就可以运行Dijkstra最短路径了。
MATCH (a:Actor)
WHERE a.name IN ['Kevin Bacon', 'Denzel Washington']
WITH collect(id(a)) AS nodeIds
CALL gds.shortestPath.dijkstra.stream('proj', {sourceNode:nodeIds[0], TargetNode:nodeIds[1]})
YIELD sourceNode, targetNode, path
RETURN gds.util.asNode(sourceNode).name AS sourceNodeName,
gds.util.asNode(targetNode).name AS targetNodeName,
nodes(path) as path;
关于
gds.graph.project
我的理解是它从原始图创建一个子图(子集)。
但是,在创建该子图时,不存在带有
Actor
标签的节点。那么为什么执行Dijkstra算法时可以执行MATCH (a:Actor)
呢?
MATCH (a:Actor)
子句正在查询完整数据库,而不是GDS投影('proj')。只有名称以 gds.
开头的程序才能访问 GDS。
此外,一个节点可以有任意数量的标签。因此,
Person
节点也可以具有 Actor
标签,或 Director
,或全部 3。