加入几个可选比赛查询

时间:2018-11-30 15:15:03

标签: neo4j cypher

我的图表:

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

我需要以某种方式使单个数组中的多个结果扁平化,并对其进行区分以使其唯一

1 个答案:

答案 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; 参数值即可。