neo4j - Neo4j 随机关系
问题描述
我有顶点 v,它有很多(数百万)条边。每次我查询这些边的一小部分(1K)。我希望这些边缘在每个查询中都不同。可能吗?
解决方案
这是一种方法(使用 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
类型的。