根据输入数组保留匹配查询的顺序

时间:2015-03-25 20:39:39

标签: neo4j cypher

如果我这样做

UNWIND ['3','1','2'] AS id MATCH (director:Director)-[:DIRECTED]->(movie:Movie {id:id}) return movie, director

电影按顺序排列[3,1,2],但当我更改查询并尝试获取更多信息时,如下所示

UNWIND ['3','1','2'] AS id MATCH (director:Director)-[:DIRECTED]->(movie:Movie {id:id}) with director, movie OPTIONAL MATCH (movie)<-[actors:ACTED_IN]-() return movie, director, count(actors)

订单与[3,1,2]不同。应该如何更改第二个查询以便保存输入数组的顺序?

3 个答案:

答案 0 :(得分:2)

如果要根据参数列表中的顺序控制输出的顺序,请尝试传递一个对象数组,如下所示:

UNWIND [{id:'3',order:1},{id:'1',order:2},{id:'2',order:3}] AS param
MATCH (director:Director)-[:DIRECTED]->(movie:Movie {id:param.id})
WITH param.order AS o, movie AS m, director AS d
ORDER BY o
RETURN m, d;

我没有运行查询,但这就是我解决问题的方法。

答案 1 :(得分:1)

永远不要依赖cypher查询的任何默认排序。匹配时,结果会以任何适合密码的顺序返回,并且无法保证语言能够为您提供。这实际上是一个很好的功能,而不是一个bug - 它可以让密码释放到以最有效的顺序获取的东西。你没有明确指定一个订单,所以无论密码做什么,我认为正确反对语言应该做的规范。

现在回答您的直接问题,如果您想要以特定方式订购结果,则应使用ORDER BY clause

您的第一个查询很容易,最后只需要ORDER BY movie.id DESC,然后就完成了。

您的第二个查询有什么奇怪之处在于您没有在return子句中包含movies。您需要通过根据return子句中没有涉及的值对事物进行排序来更具体地说明您的意思。

答案 2 :(得分:1)

我尝试过类似的情况并且有效。你可以尝试这样的事情:

UNWIND ['3','1','2'] AS id 
MATCH (director:Director)-[:DIRECTED]->(movie:Movie {id:id}) 
WITH id, director, movie 
OPTIONAL MATCH (movie)<-[actors:ACTED_IN]-() 
RETURN id, movie, director, count(actors)

它通过UNWIND订单修复最终订单。 RETURN子句中有非常重要的位置。 id必须是第一个。