在Neo4j中挑选随机对

时间:2017-02-05 23:49:06

标签: neo4j cypher nosql

我有一堆“a”。 每个“a”都有一些“b”与“r”关系。 我需要选择5个随机的“r”。 但是,没有2“r”可以使用相同的“a”。

我尝试过选择5“a”

MATCH (a:solution)
WITH a, rand() AS number
RETURN a 
ORDER BY number
LIMIT 5

但我不知道如何从每个“a”中获得一个“r”

还尝试选择5“r”

MATCH ()-[r]->()
WITH r, rand() AS number
RETURN ()-[r]->()
ORDER BY number
LIMIT 5

然而,我无法弄清楚如何使它成为一个“r”来自“a”

我需要(a,b)输出。

这就是数据的样子

enter image description here

2 个答案:

答案 0 :(得分:1)

您已经关闭,我们可以使用您第一次查询中的那些内容,并通过r&b匹配到b&#39。但是我们不能在这些b上使用LIMIT,因为LIMIT会影响查询中的所有行,而你真的只想限制每个a的r。我们可以将()将每个a的r()收集到一个列表中,并将列表的头部作为r。

MATCH (a:solution)
WITH a, rand() AS number
WITH a 
ORDER BY number
LIMIT 5
MATCH (a)-->(b)
RETURN a, HEAD(COLLECT(b)) as b

如果您对b上的关系类型或标签有任何限制,请随意将其添加到匹配中。

修改

编辑使用b节点而不是a和b之间的关系(在您的要求中明确这一点非常重要,您的查询之前只使用过a和r)。

请记住a的选择是随机的,但对于每个a,b的选择不是随机的。如果您需要随机选择的话,修改后的cybersam查询应该可以帮助您。

答案 1 :(得分:1)

此解决方案类似于@InverseFalcon中的解决方案,但它也会为5个随机选择的r节点中的每一个真正随机选择a个结果。

MATCH (a:solution)
WITH a, rand() AS number
ORDER BY number
LIMIT 5
MATCH (a)-[r]->()
WITH a, COLLECT(r) AS rs
RETURN a, rs[TOINT(SIZE(rs)*rand())] AS r;
相关问题