neo4j:有没有办法根据结果的总长度跳过结果

时间:2017-01-04 20:35:55

标签: neo4j cypher

我有一个查询返回某个类型的所有节点。我试图只返回10个均匀分布在整个集合上的结果。

我试过了:

$START t=node(*) 
MATCH (image:Image) RETURN image.name ORDER BY image.name 
SKIP toInt(count(image.name)/10);

然而,这会返回一条错误消息,指出我不允许在SKIP中使用变量。

我认为我可以尝试在count函数中重新运行整个语句:

START t=node(*) 
MATCH (image:Image) RETURN image.name ORDER BY image.name
SKIP toInt(count(MATCH (image:Image) RETURN image.name)/10);

但是这会返回无效的输入错误:

Invalid input 'R': expected whitespace, comment, '.', node labels, '[', "=~", IN, STARTS, ENDS, CONTAINS, IS, '^', '*', '/', '%', '+', '-', '=', "<>", "!=", '<', '>', "<=", ">=", AND, XOR, OR, ',' or ')' (line 3, column 38 (offset: 112))
"SKIP toInt(count(MATCH (image:Image) RETURN image.name)/10);"
                                      ^

1 个答案:

答案 0 :(得分:0)

您可以将结果collect添加到列表中,然后从集合中返回10个元素:

MATCH (image:Image)
WITH image.name AS imageName
ORDER BY imageName
WITH COLLECT(imageName) AS imageNames, range(0, 10) AS indices
UNWIND indices AS index
RETURN imageNames[toInt(length(imageNames) * index / 10)]

为了获得索引,我们创建了一个包含10个数字(0,...,9),UNWIND的列表,它们获得了10个单独的行并将它们分布在索引中。

请注意,此查询效率不高,因为服务器必须计算和收集所有结果,但结果集只包含10行。

(注意:我没有测试过查询。)