加入几个可选的匹配查询

Posted

技术标签:

【中文标题】加入几个可选的匹配查询【英文标题】:Join several Optional match querion 【发布时间】:2019-05-02 18:21:30 【问题描述】:

我的图表:

CREATE (s1:SOME id:'s1' )  
CREATE (s2:SOME id:'s2' )
CREATE (a11:ANOTHER id:'a11', tags:["tag1", "tag2"]  )
CREATE (a12:ANOTHER id:'a12', tags:["tag2", "tag3"]  )

CREATE (a21:ANOTHER id:'a21', tags:["tag3", "tag4"]  )
CREATE (a22:ANOTHER id:'a22', tags:["tag4", "tag5"]  )

CREATE (s1)-[:CONTAINS ]->(a11),
(s1)-[:CONTAINS ]->(a12),
(s2)-[:CONTAINS ]->(a21),
(s2)-[:CONTAINS ]->(a22)

我有(生成的)查询

match (s:SOME)

with s 
OPTIONAL MATCH  (a1:ANOTHER)-[r:CONTAINS]-(s)
where 'tag2' in a1.tags

with s, a1
OPTIONAL MATCH  (a2:ANOTHER)-[r:CONTAINS]-(s)
where 'tag3' in a2.tags

WITH s, COLLECT(DISTINCT a1, a2) AS aa

return s.id, aa

所以有很多类似的部分

与 s, a1 可选匹配 (a2:ANOTHER)-[r:CONTAINS]-(s) a2.tags 中的“tag3”在哪里

动态生成

我的子句有问题

WITH s, COLLECT(DISTINCT a1, a2) AS aa

我需要以某种方式将这多个结果扁平化为单个数组并区分它以使其独一无二

【问题讨论】:

您想要一个不同的 a1-a2 对列表,还是所有不同 a1 和所有不同 a2 的列表? 【参考方案1】:

您可能不需要为您的用例生成任何 Cypher 代码。

以下查询采用$tags parameter -- 这应该是您感兴趣的标签值的列表 -- 并使用aggregation 返回每​​个唯一的id 和不同@ 的相应列表987654325@ 节点。 ANY函数用于测试$tags中是否有标签在a.tags中。

MATCH (s:SOME)
OPTIONAL MATCH (a:ANOTHER)-[:CONTAINS]-(s)
WHERE ANY(t IN $tags WHERE t in a.tags)
RETURN s.id AS id, COLLECT(DISTINCT a) AS as;

使用此查询,您只需要生成$tags 参数值。

【讨论】:

以上是关于加入几个可选的匹配查询的主要内容,如果未能解决你的问题,请参考以下文章

带有几个可选搜索词的参数化查询

正则表达式匹配逗号分隔的数字与可选的小数部分

parents([expr]) 取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素)。可以通过一个可选的表达式进行筛选。

如何使 URL 参数匹配可选[重复]

有没有办法将默认值设置为缺少/可选的 JSON 属性?

捕获单词 a 或 b 以及可选的额外参数的一部分