2017-04-19 154 views
0

想象一个填充了关于个人数据的图。每个节点都有一个名为“age”的属性。现在我想返回一个包含“年龄”不同值的节点样本,因此如果每个年龄在0到90之间的节点都有一个节点,则样本大小为91.Neo4j/Cypher - 通过不同的属性值返回节点

我该如何实现这一点通过密码?

我真正想要做的是恢复一定量的随机元素,每个元素与“年龄”的独特价值,因此只要获得每个不同的属性值没有相应的节点是不够的。

+0

这是您必须支持的常见用例,还是只是一次性查询?您可能需要考虑对模型进行更改以更好地支持此类查询的快速执行 – InverseFalcon

+0

数据中的年龄也是静态的,或者年龄与出生日期相关,所以年龄随着时间的推移而增加? – InverseFalcon

+0

这是一个常见用例,数据是静态的。我没有建模数据库,所以改变数据组织将是。 – rinderwahn

回答

1

这可能会为你工作:

MATCH (p:Person) 
RETURN p.age AS age, COLLECT(p)[TOINT(rand() * COUNT(p))] AS person; 

查询收集所有谁拥有在DB每个不同年龄的人,并挑选一个随机各年龄。

0

如果你拥有或能获得更改图形的能力,你可能要提取出个人的年龄到:年龄节点(这只能是因为年龄在您的数据是静态的)。

APOC程序有一个categorization refactoring procedure可以帮助在这里。

这种方式来获得一个人各年龄,你只是匹配所有上:年龄节点,get one connected node for each of them

编辑

至于让每个年龄段随机的选择,我们可以使用收集和抓住一个随机指数cybersam的做法。

随着APOC程序,我们还可以选择使用apoc.coll.randomItem()抓住从一个集合中的随机项目的选项。它基本上是在引擎盖下做同样的事情。

完整的查询(假设你有不同的:年龄节点(与同向关系“年龄”属性):个人节点)应该是这样的:

MATCH (age:Age)<-[:HasAge]-(p:Person) 
RETURN age.age as age, apoc.coll.randomItem(collect(p)) as randomPerson 

你提到需要“一定的随机元素数量“,每个元素都有不同的年龄,所以我们可以修改上面的查询来收集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 
+0

不错的建议。但是,这不能保证随机结果。 – cybersam

+0

是的。更新了我的答案,包括每个年龄段的随机选择(每个人都有不同的年龄),随机选择不同年龄的随机人员需要多少人。 – InverseFalcon