neo4j - 如何编写密码查询来查找由特定标签标记的节点?
问题描述
数据库结构:
(:Event)-[:IS_TAGGED_BY]->(:EventTag {value})
结构评论:
- 有事件节点
- 有 EventTag 节点
- 标签节点有一个字符串属性,称为“值”
- 事件可以通过 IS_TAGGED_BY 传出 rel 由标签标记
我需要编写一个查询,它将只返回那些由一组特定标签标记的事件。
这种查询可能有两种变体,它们返回:
- 事件,由至少一个指定标签标记(我们称之为
findTaggedByAny
)。 - 由所有指定标签标记的事件(我们称之为
findTaggedByAll
)。
我可以编写findTaggedByAny
查询:
MATCH (et:EventTag)--(e:Event) WHERE et.value in {0} RETURN e
这里的 {0} - 将替换包含一组标记值的查询参数。
因此,替换后的查询将如下所示:
MATCH (et:EventTag)--(e:Event) WHERE et.value in ["tag1", "tag2"] RETURN e
但是我在尝试实现findTaggedByAll
查询时遇到了困难,它也应该采用相同的参数并返回事件,由集合中的所有标签标记。事件是否被任何其他标签标记并不重要。
解决方案
[更新]
如果您想获取连接到数据库中所有标签的事件,您可以像这样进行有效的“度数”检查(假设事件最多只连接一次到特定标签,并且
IS_TAGGED_BY
关系是仅用于将事件连接到标签):MATCH (t:EventTag) WITH COUNT(t) AS numTags MATCH (e:Event) WHERE SIZE((e)-[:IS_TAGGED_BY]->()) = numTags RETURN e;
相反,如果您想要获取由参数中的任何标记标记的事件
tagList
:MATCH (e:Event)-[:IS_TAGGED_BY]->(t:EventTag) WHERE t.value IN $tagList RETURN e;
相反,如果您想要获取由参数中的所有标签标记的事件
tagList
:MATCH (e:Event)-[:IS_TAGGED_BY]->(t:EventTag) WITH e, COLLECT(t.value) AS tagValues WHERE ALL(v IN tagValues WHERE v IN $tagList) RETURN e;
此外,如果一个事件很少有这么多标签,那么这个更长的查询实际上可能会更快(通过在实际查看标签之前进行度数检查):
MATCH (e:Event) WHERE SIZE((e)-[:IS_TAGGED_BY]->()) >= SIZE($tagList) MATCH (e)-[:IS_TAGGED_BY]->(t:EventTag) WITH e, COLLECT(t.value) AS tagValues WHERE ALL(v IN tagValues WHERE v IN $tagList) RETURN e;
推荐阅读
- r - 应用函数中二元运算符的非数字参数
- java - 获取 java.lang.NoClassDefFoundError: 无法初始化类 com.sun.org.apache.xml.internal.serializer.Encodings
- java - 在 Eclipse IDE 中执行 Flink 应用程序
- javascript - 使用另一个状态变量计算一个状态变量
- botframework - 自定义网络聊天背景图片
- html - 图像更改时如何在 HTML 上保持图像大小相同
- c# - 如何实现 AppCenter 推送 API?
- android - 如何在屏幕上移动 FloatingActionMenu?
- kubernetes - 未从服务端点删除 pod ip 的活动探测失败
- excel - 如何根据引用另一张工作表的真/假公式对范围求和