yoa*_*ann 1 filtering neo4j cypher
我有一个 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]-()) > 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
Run Code Online (Sandbox Code Playgroud)
请注意,我在描述符类型上添加了一个过滤器,以便查询可以运行,但我不确定这是否会影响过滤条件。此处显示链接到单篇文章的描述符和作者。

第一个优化是过滤:多次发表的作者。所有这一切都需要对作者的 :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
Run Code Online (Sandbox Code Playgroud)
这将返回包含作者、描述符以及具有给定描述符的文章的文章集合 (> 1) 的行。
编辑
看起来您想要过滤 :Descriptors ,无论作者是谁,而不是根据我们在查询中形成的子图,总共多次提到的描述符。
在这种情况下,最好预先匹配这些并过滤,然后收集,并在我们扩展子图时使用该集合进行某些集合操作。
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3459 次 |
| 最近记录: |