加入几个可选的匹配查询
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]) 取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素)。可以通过一个可选的表达式进行筛选。