我有一个包含高度连接节点(集线器)的图数据库。这些节点可以有超过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;
我认为如果您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;