首页 > 解决方案 > 加入几个可选的匹配查询

问题描述

我的图表:

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

所以有很多部分,比如

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

动态生成

我的条款有问题

WITH s, COLLECT(DISTINCT a1, a2) 作为 aa

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

标签: neo4jcypher

解决方案


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

以下查询采用一个$tags 参数——它应该是您感兴趣的标签值的列表——并使用聚合来返回每个唯一节点id和相应的不同a节点列表。该ANY函数用于测试是否有任何标签$tagsin 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参数值。


推荐阅读