用于计算介数误差的py2neo查询

py2neo query for calculating betweenness error

我想使用 py2neo 在 neo4j 中的一个非常大的图中计算介数。

我正在使用这样的密码查询:

MATCH p=allShortestPaths((source:DOLPHIN)-[*]-(target:DOLPHIN)) 
WHERE id(source) < id(target) 
AND length(p) > 1 
UNWIND nodes(p)[1..-1] as n 
RETURN n.name, count(*) as betweenness 
ORDER BY betweenness DESC

它适用于小图,但不适用于具有 100 万个节点的大图。我已经使用 py2neo 传递了这个查询。

早些时候我收到错误超时,但现在在 运行 一段时间后它说无法处理查询。 我收到以下错误:-

    File "/usr/local/lib/python2.7/dist-packages/py2neo/cypher/core.py", line 111, in execute
    results = tx.commit()
    File "/usr/local/lib/python2.7/dist-packages/py2neo/cypher/core.py", line 306, in commit
    return self.post(self.__commit or self.__begin_commit)
    File "/usr/local/lib/python2.7/dist-packages/py2neo/cypher/core.py", line 261, in post
    raise self.error_class.hydrate(error)
    py2neo.cypher.error.statement.ExecutionFailure: The statement has been closed.

我已经搜索了很多。请帮我解决这个问题

我无法对您用来对作者进行排名的 algorithm/approach 发表评论。最终很难,您 运行 宁的查询是一个完整的图形搜索,带有一些聚合。 Neo4j 不是为这种情况设计的。随着数据的增加,运行 查询将变得更加困难。

理想情况下,查询应该只遍历图的一小部分。因此,对于您的情况,您可以询问每个作者在每个查询中的排名,而不是询问谁最受欢迎。对所有人都这样做,一次一个,然后自己对它们进行排名,在这里可能会更好。除非你采取不同的方法,比如限制要遍历的邻居节点的范围,或者最长路径的长度,或者两者兼而有之。但我怀疑这会影响你的结果。

我建议你根据你的需要重新审视你的领域模型,并根据你的计算找出一个可以帮助你轻松回答你的问题的设计模型,比如谁是最受欢迎的作者方法。并仔细检查以确保您使用的是索引,以防万一。

使用 neo4j 建模:

有时最简单的模型并不能帮助我们回答某些问题;我不得不自己改造几次,并将关系转化为时间数据排序的节点,因为第一次并不明显。无论如何,我希望你能想出一个解决办法。

干杯