首页 > 解决方案 > Neo4j 随机关系

问题描述

我有顶点 v,它有很多(数百万)条边。每次我查询这些边的一小部分(1K)。我希望这些边缘在每个查询中都不同。可能吗?

标签: neo4j

解决方案


这是一种方法(使用 Cypher):

MATCH (v:Foo)
WHERE v.id = 'node_with_millions_of_BAR_relationships'
WITH v, [(v)-[r:BAR]->() | r] AS rels
WITH v, rels, CASE WHEN $limit >= SIZE(rels)
  THEN 1.0
  ELSE TOFLOAT($limit) / SIZE(rels) END AS pct
RETURN v, CASE WHEN pct >= 1.0
  THEN rels
  ELSE REDUCE(s = [], x IN rels | CASE
    WHEN SIZE(s) < $limit AND rand() < pct THEN s + x
    ELSE s END)
  END AS randomRels

此示例所做的假设:

  • 要返回的(最大)随机关系数由limit 参数指定。
  • 感兴趣的节点有Foo标签,感兴趣的关系是传出的,有BAR类型的。

推荐阅读