我试图找到随机的100部电影,然后使用电影ID对结果进行排序。为此,我使用以下查询:
MATCH (movie:Movie)
WHERE RAND() < 0.3
RETURN movie.title as title,movie.id AS id
ORDER BY id DESC
LIMIT 100
但结果不好:
标题----------------------------------------- ID
大联盟--------------------------- 9942
El Chupacabra ------------------------- 9937
哈利茨维尔------------------------------ 9935
猎犬------------------------------------- 993
林格------------------------------- 9927
吸血----------------------------- 9926
993
应位于列表的底部,但它位于错误的位置。任何人都可以建议我如何解决它?
答案 0 :(得分:0)
节点上的id属性值是字符串,而不是整数。字符串“102”出现在前缀为“102”的任何字符串之前,这可以解释您的订购。
在节点上设置id属性时,不要使用引号来处理整数而不是字符串。
你从哪里获得电影数据库,你使用的是什么版本的Neo4j?在Neo4j 3.1上,电影图中没有id属性。
修改
从链接下载示例数据库后,我可以确认它使用的是字符串ID值。因此,此属性的任何比较和排序都将基于字符串,而不是数字。
在实际图表中,您需要确保从一开始就为您的属性使用正确的数据类型。
为了这个查询,如果您不想将所有id属性转换为整数,那么您至少可以转换您在查询中使用的值并根据这些值进行排序(它赢了不要将它们保存回图表,因此虽然查询中的排序是正确的,但属性仍然是基于字符串的。)
MATCH (movie:Movie)
WHERE RAND() < 0.3
RETURN movie.title as title,movie.id AS id
ORDER BY toInt(id) DESC
LIMIT 100
编辑2
您只获得更高价值的原因是您的查询首先明确地对结果进行排序,然后获取有序结果的前100个。如果你想避免这种情况,先取100个结果,然后按顺序排列:
MATCH (movie:Movie)
WHERE RAND() < 0.3
WITH movie LIMIT 100
RETURN movie.title as title,movie.id AS id
ORDER BY toInt(id) DESC
如果您希望所选电影的ID更多变化,那么您需要更改随机数的阈值。现在,30%的电影节点都在限制之前的结果集中。您可能想要选择较低的值。