如何在cypher子查询

时间:2017-05-13 15:27:35

标签: neo4j cypher

我已经阅读了有关子查询的问题,但仍然坚持使用此用例。

我的文档包含一个或多个关键字,每个文档都将用户评论与状态属性相关联。我想获得查询中每个文档的最新状态(如果存在)。如果我运行如下的查询,我只得到一行。

    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子句的多个查询,但还没有运气。任何建议将不胜感激。

2 个答案:

答案 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