我已经阅读了有关子查询的问题,但仍然坚持使用此用例。
我的文档包含一个或多个关键字,每个文档都将用户评论与状态属性相关联。我想获得查询中每个文档的最新状态(如果存在)。如果我运行如下的查询,我只得到一行。
MATCH (d:Document)-[:Keys]->(k:Keywords)
WITH d,k
OPTIONAL MATCH (d)--(c:Comments)
ORDER BY c.created DESC LIMIT 1
RETURN d.Title as Title, k.Word as Keyword, c.Status as Status
我想要以最新状态返回数百份文件,如:
Title Keyword Status
War in the 19th Century WWI Reviewed
War in the 19th Century Weapons Reviewed
The Great War WWI Pending
World War I WWI <null>
我尝试过使用WITH子句的多个查询,但还没有运气。任何建议将不胜感激。
答案 0 :(得分:2)
此查询应该按照您的意图执行:
MATCH (d:Document)-[:Keys]->(k:Keywords)
OPTIONAL MATCH (d)--(c:Comments)
WITH d, COLLECT(k.Word) AS Keywords, c
ORDER BY c.created DESC
WHERE c IS NOT NULL
RETURN d.Title as Title, Keywords, COLLECT(c)[0] AS Status
由于评论与文档有关,而与文档/关键字对无关,因此为每个标题/状态对返回关键字集合更有意义。您的原始查询如果有效,将多次返回相同的标题/状态对,每次都使用不同的关键字。
答案 1 :(得分:1)
我们有knowledge base article解释如何限制每行匹配的结果,这应该会为您提供一些不错的选择。
修改
这是一个完整的示例,使用apoc.cypher.run()
执行有限的子查询。
MATCH (d:Document)-[:Keys]->(k:Keywords)
WITH d, COLLECT(k.Word) AS Keywords
// collect keywords first so each document on a row
CALL apoc.cypher.run('
OPTIONAL MATCH (d)--(c:Comments)
RETURN c
ORDER BY c.created DESC
LIMIT 1
', {d:d}) YIELD value
RETURN d.Title as Title, Keywords, value.c.status as Status