Присоединяйтесь к нескольким опциональным совпадениям - PullRequest
0 голосов
/ 30 ноября 2018

Мой график:

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) где 'tag3' в a2.tags

генерируется динамически

У меня проблема с предложением

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

Мне нужно как-то сгладить эти множественные результаты в одном массиве и выделить его, чтобы сделать его уникальным

1 Ответ

0 голосов
/ 30 ноября 2018

Вам, вероятно, не нужно генерировать какой-либо код Cypher для вашего варианта использования.

Следующий запрос принимает $tags параметр - который должен быть списком тегаинтересующие вас значения - и использует агрегация для возврата каждого уникального 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;

Используя этот запрос, вам просто нужно сгенерировать значение параметра $tags.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...