我有一个neo4j数据库架构,如下所示:
(a:Author)<-[r:HAS_AUTHOR]-(n:Article)-[rel:HAS_DESCRIPTOR]->(d:Descriptor)
我想执行一个查询,以显示作者和描述符之间的链接,并针对发表了不止一次的作者(count(r)> 1)和出现在多篇文章中的描述符(count(rel) )> 1)
这是我写的查询:
MATCH (a:Author)<-[r:HAS_AUTHOR]-(n:Article)-[rel:HAS_DESCRIPTOR]->(d:Descriptor)
WITH a,count(r) as cnt WHERE cnt>1
MATCH (a:Author)<-[r:HAS_AUTHOR]-(n:Article)-[rel:HAS_DESCRIPTOR]->(d:Descriptor)
WITH d,count(rel) as cnt1 WHERE cnt1>1
MATCH (a:Author)<-[r:HAS_AUTHOR]-(n:Article)-[rel:HAS_DESCRIPTOR]->(d:Descriptor)
RETURN * limit 100
它似乎并没有达到我的期望。我仍然看到作者或描述符链接到单篇文章。
请注意,关系计数应仅在查询的上下文中考虑(即:在限制为100的情况下,所有作者应链接到查询输出图中的多篇文章)。
这是编写此查询的正确方法吗? 谢谢
编辑
很抱歉,我不清楚。
如果我运行一个简单的查询以显示所有作者-文章-描述符图,则可以在下面的图片中看到一些场景。
在所有图像中,黄色节点是文章,绿色是作者,粉红色是描述符。
场景1:唯一提及提及描述符的文章。我想过滤掉只有一篇文章中提到的那些描述符。
场景2:多篇文章提到的描述符,但其作者未发表任何其他文章。我想过滤掉那些只发表了一篇文章的作者
这两个过滤器应在子图级别应用。例如:如果我过滤到特定的描述符类型,则在此新的子图中应满足两个条件(作者和具有多篇文章的描述符)。
提出的第一个查询将生成图形,如下图所示:
MATCH (a:Author)
WHERE size((a)<-[:HAS_AUTHOR]-()) > 1
MATCH (a)<-[:HAS_AUTHOR]-(n:Article)-[:HAS_DESCRIPTOR]->(d:Descriptor)
WITH a, d, collect(n) as articles
WHERE size(articles) > 1
RETURN a, d, articles
collect(n)作为a,d对的文章会迫使作者在同一描述符上发表两次,这是不希望的。我希望允许一位发表过2种不同描述符的论文的作者出现。
建议的第二个查询生成图形,如下图所示:
MATCH (d:Descriptor)
WHERE size((d)<-[:HAS_DESCRIPTOR]-()) > 1
WITH collect(d) as descriptors
MATCH (a:Author)
WHERE size((a)<-[:HAS_AUTHOR]-()) > 1
MATCH (a)<-[:HAS_AUTHOR]-(n:Article)-[:HAS_DESCRIPTOR]->(d)
WHERE d in descriptors
RETURN a, n, d
请注意,我在描述符类型上添加了一个过滤器,以便查询可以运行,并且我不确定这是否会影响过滤条件。在这里,它显示了链接到单个文章的描述符和作者。
答案 0 :(得分:1)
第一个优化用于过滤已发布多次的:Author。所需要做的只是对作者的:HAS_AUTHOR关系进行程度检查,这可以廉价地完成,因为节点知道与它关联的关系的类型和数量。您可以在模式上使用size()
函数来获取此信息:WHERE size((author)<-[:HAS_AUTHOR]-()) > 1
。
接下来要获得涉及多于一篇文章的描述符的模式,我们需要按作者和描述符对文章进行汇总,仅保留多于一篇文章的行。
尝试一下:
MATCH (a:Author)
WHERE size((a)<-[:HAS_AUTHOR]-()) > 1
MATCH (a)<-[:HAS_AUTHOR]-(n:Article)-[:HAS_DESCRIPTOR]->(d:Descriptor)
WITH a, d, collect(n) as articles
WHERE size(articles) > 1
RETURN a, d, articles
这将返回包含作者,描述符以及具有给定描述符的文章的文章集(> 1)的行。
编辑
看起来您想过滤:描述符总数超过一次的描述符,而不考虑作者,而不是根据查询中形成的子图进行过滤。
在这种情况下,最好先对它们进行预匹配并进行过滤,然后收集,然后在扩展子图时将其用于某些设置操作。
MATCH (d:Descriptor)
WHERE size((d)<-[:HAS_DESCRIPTION]-()) > 1
WITH collect(d) as descriptors
MATCH (a:Author)
WHERE size((a)<-[:HAS_AUTHOR]-()) > 1
MATCH (a)<-[:HAS_AUTHOR]-(n:Article)-[:HAS_DESCRIPTOR]->(d)
WHERE d in descriptors
RETURN a, n, d