Neo4j中存在一个错误,其中接受节点列表的过程被多次调用。例如,algo.personalizedPageRank.stream在具有8个节点的图形上使用单个节点调用8次:
MATCH p = (n)
CALL algo.personalizedPageRank.stream(nodes(p), 'Page', 'LINKS', {iterations:20, dampingFactor:0.85})
YIELD node, score
RETURN node,score order by score desc limit 20
有谁知道如何解决这个问题?一种选择是按节点分组并使用SUM聚合来查找个性化的PageRank,但我宁愿不为其输入列表中的每个项目调用算法一次。
错误报告(供参考): https://github.com/neo4j/neo4j/issues/10959
答案 0 :(得分:1)
这不是错误。
在Cypher中,操作生成记录/行,并且每个记录执行操作。这适用于几乎所有条款,包括过程调用。如果您对查询进行了剖析,则可以看到这一点:您的匹配产生了8行,因此该过程将被调用8次。
如果您只希望该过程只执行一次,请收集您想要的节点,这样您只有一个带有节点列表的行,然后调用该查询。
MATCH (n)
WITH collect(n) as nodes
CALL algo.personalizedPageRank.stream(nodes, 'Page', 'LINKS', {iterations:20, dampingFactor:0.85})
YIELD node, score
RETURN node,score order by score desc limit 20