Запрос во вложенных объектах - PullRequest
0 голосов
/ 22 ноября 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  (a:ANOTHER)-[r:CONTAINS]-(s)
    WITH s, COLLECT(DISTINCT a) AS aa

return s.id, aa

Теперь я хочу добавить некоторые ограничения в поле ANOTHER.tags:

match (s:SOME)
    with s 
    OPTIONAL MATCH  (a:ANOTHER)-[r:CONTAINS]-(s)
    where 'tag2' in a.tags
    WITH s, COLLECT(DISTINCT a) AS aa

return s.id, aa

результат:

╒══════╤══════════════════════════════════════════════════════════════════════╕
│"s.id"│"aa"                                                                  │
╞══════╪══════════════════════════════════════════════════════════════════════╡
│"s2"  │[]                                                                    │
├──────┼──────────────────────────────────────────────────────────────────────┤
│"s1"  │[{"id":"a11","tags":["tag1","tag2"]},{"id":"a12","tags":["tag2","tag3"│
│      │]}]                                                                   │
└──────┴──────────────────────────────────────────────────────────────────────┘

Но я хочу вообще пропустить запись s2, так как она не содержит обязательный тег

Еще одна вещь - что если я хочу проверить несколько тегов?например, ["tag1", "tag2"] (в этом случае должны отвечать пустыми данными), могу ли я использовать что-то вроде пересечения?

1 Ответ

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

Вам просто нужно переключиться с OPTIONAL MATCH на MATCH только, и он должен пропускать нулевые значения.

Мы также можем сократить запрос, используя только один MATCH вместо двух:

match (s:SOME)<-[r:CONTAINS]-(s)
where 'tag2' in a.tags
WITH s, COLLECT(DISTINCT a) AS aa

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