Neo4j电影数据库中的Cypher结果顺序没有以正确的方式显示

时间:2017-01-17 23:23:24

标签: neo4j

我试图找到随机的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应位于列表的底部,但它位于错误的位置。任何人都可以建议我如何解决它?

1 个答案:

答案 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%的电影节点都在限制之前的结果集中。您可能想要选择较低的值。