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

时间:2015-06-24 07:35:54

标签: graph neo4j 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 个答案:

答案 0 :(得分:2)

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

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

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

我在类似的情况下使用了这种方法。

答案 1 :(得分:1)

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

您还忘记了n

的标签(可能还有索引)

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

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