Neo4j 如何编写密码查询来查找由特定标记标记的节点?

Neo4j 如何编写密码查询来查找由特定标记标记的节点?,neo4j,spring-data,cypher,spring-data-neo4j,Neo4j,Spring Data,Cypher,Spring Data Neo4j,数据库结构: (:Event)-[:IS_TAGGED_BY]->(:EventTag {value}) 对结构的评论: (:Event)-[:IS_TAGGED_BY]->(:EventTag {value}) 存在事件节点 存在EventTag节点 标记节点有一个名为value的字符串属性 事件可通过标记通过输出rel标记 我需要编写一个查询,它将只返回那些由一组特定标记标记的事件 此类查询可能有两种变体,返回: 事件,由至少一个指定的标记标记,我们称之为findTagged

数据库结构:

(:Event)-[:IS_TAGGED_BY]->(:EventTag {value})
对结构的评论:

(:Event)-[:IS_TAGGED_BY]->(:EventTag {value})
存在事件节点 存在EventTag节点 标记节点有一个名为value的字符串属性 事件可通过标记通过输出rel标记 我需要编写一个查询,它将只返回那些由一组特定标记标记的事件

此类查询可能有两种变体,返回:

事件,由至少一个指定的标记标记,我们称之为findTaggedByAny。 事件,由所有指定的标记标记,我们称之为findTaggedByAll。 我可以编写findTaggedByAny查询:

此处{0}-将替换包含一组标记值的查询参数

因此,在替换之后,查询将如下所示:

MATCH (et:EventTag)--(e:Event) WHERE et.value in ["tag1", "tag2"] RETURN e
但是我在尝试实现findTaggedByAll查询时遇到了困难,该查询也应该采用相同的参数并返回事件,由集合中的所有标记进行标记。而且,事件是否由任何其他标记标记并不重要。

[更新]

如果要获取连接到DB中所有标记的事件,可以执行有效的度检查,例如,假设事件最多只连接到特定标记一次,并且is_taged_BY关系仅用于将事件连接到标记:

MATCH (t:EventTag)
WITH COUNT(t) AS numTags
MATCH (e:Event)
WHERE SIZE((e)-[:IS_TAGGED_BY]->()) = numTags
RETURN e;
相反,如果要获取由标记列表参数中的任何标记标记的事件:

MATCH (e:Event)-[:IS_TAGGED_BY]->(t:EventTag)
WHERE t.value IN $tagList
RETURN e;
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)-[:IS_TAGGED_BY]->(t:EventTag)
WHERE t.value IN $tagList
RETURN e;
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;

因此,您希望返回:仅连接到指定的:EventTag节点的事件节点。。。或者:至少连接到指定的:EventTag节点的事件节点?也就是说,它们也可以连接到未指定的:EventTag节点。@rickhg12hs对不起,我的问题不清楚。它们可以连接到任何其他标签,这无关紧要。我修改了我的问题以澄清这个问题的其他方面。Does:Tag=:EventTag?@rickhg12hs是的!对不起,我的问题不清楚。我不想检查一个事件是否连接到所有标记,这些标记当前都在db中。我传递一个查询参数,其中包含一组我感兴趣的标记。我修改了我的问题来澄清这个问题的其他方面。非常感谢!您的代码几乎符合我的需要,我所做的唯一更改与以下行有关:WHERE ALLv IN tagValues WHERE v IN$tagList。我需要将其更改为WHERE alltagValue IN$tagList WHERE tagValue IN tagValues。否则,它的工作方式不是findTaggedByAll,而是findTaggedByAllAndOnly。