提问者:小点点

到达集线器时停止图遍历的Cypher查询


我有一个包含高度连接节点(集线器)的图数据库。这些节点可以有超过40000个关系。

当我想从一个节点开始遍历图时,我想在这些中心停止遍历,以免检索太多节点。

我认为我应该根据每个节点的关系计数使用聚合功能和条件停止,但我没有设法编写好的密码查询。

我试过了:

MATCH p=(n)-[r*..10]-(m)
WHERE n.name='MyNodeName' AND ALL (x IN nodes(p) WHERE count(x) < 10)
RETURN p;

以及:

MATCH (n)-[r*..10]-(m) WHERE n.name='MyNodeName' AND COUNT(r) < 10 RETURN p;

共2个答案

匿名用户

我认为如果您MATCH长度为10的路径,则无法在某个节点停止查询。您可以计算路径中所有节点的关系数,但仅在路径匹配之后。

您可以通过向中心节点添加附加标签并在查询中过滤来解决此问题:

MATCH (a:YourLabel)
OPTIONAL MATCH (a)-[r]-()
WITH a, count(r) as count_rels
CASE
WHEN count_rels > 20000
THEN SET a :Hub
END

您的查询:

MATCH p=(n)-[r*..10]-(m)
WHERE n.name='MyNodeName' AND NONE (x IN nodes(p) WHERE x:Hub)
RETURN p

我在类似的案例中使用了这种方法。

匿名用户

从Neo4j 2.2开始,有一个很酷的技巧可以使用内部getDecree()函数来确定节点是否是密集节点。

您还忘记了n的标签(可能还有索引)

对于您的情况,这意味着:

MATCH p=(n:Label)-[r*..10]-(m)
WHERE n.name='MyNodeName'  AND size((m)--()) < 10
RETURN p;