我有一堆“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)输出。
这就是数据的样子
答案 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;