Neo4j / Cypher - 按不同的属性值返回节点

时间:2017-04-19 21:45:19

标签: neo4j cypher

想象一下填充了有关个人数据的图表。每个节点都有一个名为" age"的属性。现在我想返回一个包含尽可能多的节点的样本作为" age"存在,所以如果0到90之间的每个年龄都有一个节点,则样本大小为91。

我如何通过密码实现这一目标?

我真正想要做的是返回一定数量的随机元素,每个元素都有一个不同的值" age",所以只获得每个不同的属性值而没有相应的节点是不够的。

2 个答案:

答案 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