Cypher 查询以在到达集线器时停止图遍历
Posted
技术标签:
【中文标题】Cypher 查询以在到达集线器时停止图遍历【英文标题】:Cypher query to stop graph traversal when reaching a hub 【发布时间】:2015-06-24 07:35:53 【问题描述】:我有一个图形数据库,其中包含高度连接的节点(集线器)。这些节点可以有超过 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;
【问题讨论】:
【参考方案1】:如果您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
我在类似的案例中使用了这种方法。
【讨论】:
谢谢你,马丁,我会试试这个。【参考方案2】:从 Neo4j 2.2 开始,有一个很酷的技巧可以使用内部 getDegree()
函数来确定节点是否为密集节点。
您还忘记了n
的标签(可能还有索引)
对于您的情况,这意味着:
MATCH p=(n:Label)-[r*..10]-(m)
WHERE n.name='MyNodeName' AND size((m)--()) < 10
RETURN p;
【讨论】:
以上是关于Cypher 查询以在到达集线器时停止图遍历的主要内容,如果未能解决你的问题,请参考以下文章
是否可以通过从集线器到 USB 端口的 USB 测试移动设备
GL3520 USB3.0集线器USB HUB电路AD设计硬件原理图+PCB+集成库