我的图表:
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:另一个)-[r:包含]-(s) 在a2.tags中的“ tag3”
动态生成
我对条款有疑问
与s一样,以COLLECT(DISTINCT a1,a2)as aa
我需要以某种方式使单个数组中的多个结果扁平化,并对其进行区分以使其唯一
答案 0 :(得分:1)
您可能不需要为用例生成任何Cypher代码。
以下查询采用$tags
parameter(应该是您感兴趣的标记值的列表),并使用aggregation返回每个唯一的{{1} }和不同的id
节点的对应列表。 a
函数用于测试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;
参数值即可。