我正在使用 neo4j 数据库制作一个包管理器,其中包作为节点和 DEPENDS_ON 关系。例如,要构建包
A
,我首先需要构建包 B
和 C
。为此,我需要进行拓扑排序,但不知道如何使用 gds.graph.project()
来投影路径。
这是我如何获取需要投影的路径:
MATCH path = (n:Package{name: 'neofetch'})-[r:DEPENDS_ON*]->(l:Leaf)
我使用以下方法将上述路径投影到 GDS 图表:
RETURN gds.graph.project("g", n, l, {})
然后进行拓扑排序:
CALL gds.dag.topologicalSort.stream("g", {computeMaxDistanceFromSource: true})
YIELD nodeId, maxDistanceFromSource
RETURN gds.util.asNode(nodeId).name AS name, maxDistanceFromSource
ORDER BY maxDistanceFromSource, name
排序结果只有第一个节点和最后一个节点,没有中间节点出现。
您需要传递路径中每对相邻的节点,而不仅仅是第一个和最后一个节点。这应该对你有用:
MATCH (:Package{name: 'neofetch'})-[rels:DEPENDS_ON*]->(:Leaf)
UNWIND rels AS r
WITH DISTINCT r
RETURN gds.graph.project("g", STARTNODE(r), ENDNODE(r))