我有一个 neo4j 数据库架构,如下所示:
(a:Author)<-[r:HAS_AUTHOR]-(n:Article)-[rel:HAS_DESCRIPTOR]->(d:Descriptor)
Run Code Online (Sandbox Code Playgroud)
我想做一个查询,显示作者和描述符之间的链接,筛选出多次发表的作者 (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
Run Code Online (Sandbox Code Playgroud)
它似乎没有达到我的预期。我仍然看到链接到一篇文章的作者或描述符。
请注意,关系计数应仅在查询上下文中考虑(即:限制为 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
Run Code Online (Sandbox Code Playgroud)
collect(n) 作为 a,d 对的文章迫使作者在同一描述符上发布两次,这是不可取的。我希望允许一位发表过关于 2 个不同描述符的论文的作者出现。

建议的第二个查询生成如下图所示的图表:
MATCH (d:Descriptor)
WHERE size((d)<-[:HAS_DESCRIPTOR]-()) > …Run Code Online (Sandbox Code Playgroud)