想象一下填充了有关个人数据的图表。每个节点都有一个名为" age"的属性。现在我想返回一个包含尽可能多的节点的样本作为" age"存在,所以如果0到90之间的每个年龄都有一个节点,则样本大小为91。
我如何通过密码实现这一目标?
我真正想要做的是返回一定数量的随机元素,每个元素都有一个不同的值" age",所以只获得每个不同的属性值而没有相应的节点是不够的。
答案 0 :(得分:2)
这可能对您有用:
MATCH (p:Person)
RETURN p.age AS age, COLLECT(p)[TOINT(rand() * COUNT(p))] AS person;
该查询收集所有在数据库中具有不同年龄的人,并为每个年龄选择一个随机的人。
答案 1 :(得分:0)
如果您已经或可以获得更改图表的功能,您可能希望将个人年龄提取到:年龄节点(仅适用于您的数据中年龄是静态的)。
APOC程序有一个categorization refactoring procedure可以帮到这里。
为了获得每个年龄段的人,您只需匹配所有:年龄节点和get one connected node for each of them。
修改
至于随机选择每个年龄,我们可以使用cybersam的方法来收集和获取随机索引。
使用APOC程序,我们还可以选择使用apoc.coll.randomItem()
从集合中获取随机项。它基本上是在做同样的事情。
完整的查询(假设你有不同的:年龄节点(带有" age"属性)与关系到:Person节点)看起来像这样:
MATCH (age:Age)<-[:HasAge]-(p:Person)
RETURN age.age as age, apoc.coll.randomItem(collect(p)) as randomPerson
你提到你需要&#34;一定数量的随机元素&#34;每个都有不同的年龄,所以我们可以修改上面的查询来收集randomPersons-per-age,并使用apoc.coll.randomItems()
获得你需要的许多随机条目。
MATCH (age:Age)<-[:HasAge]-(p:Person)
WITH age, apoc.coll.randomItem(collect(p)) as randomPerson
RETURN apoc.coll.randomItems(collect(randomPerson), {numberOfItemsDesired}) as randomPeople