Cypher-запрос для пересечения сложных списков - PullRequest
0 голосов
/ 22 апреля 2020

Мне нужна помощь с запросом, в котором я хочу отфильтровать элементы из объекта json, соответствующего двум полям объекта (id, type), что-то вроде этого,

match (o:Item) where o.id="18" and o.type="test" 
with [{id: '16', type: 'p1', value: 2}, {id: '3', type: 'p2', value: 1}, {id: '54', type: 'p1', value: 3}, {id: '16', type: 'p1', value: 5}, {id: '1143', type: 'p1', value: 4}, {id: '18', type: 'test', value: 4}] as p_list, o
unwind p_list as p_item
with distinct o, p_item
match (o) where not o.id = p_item.id and not o.type = p_item.type
return o
  • Ожидаемый результат: null , поскольку p_list содержит элемент с идентификатором 18 и типом test .
  • Фактический результат: 5 строк, из-за перекрестного умножения узла со списком отсюда вытекает, что он фильтрует p_list вместо фильтрации узла (o).

Я хочу пересечение узла (o ) со списком, дающим результат слева от строк узла (o).

Может ли кто-нибудь помочь мне здесь?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Я получил помощь от @maxdemarzi из сообщества neo4j. Его решение,

WITH [{id: '16', type: 'p1', value: 2}, {id: '3', type: 'p2', value: 1}, {id: 
'54', type: 'p1', value: 3}, {id: '16', type: 'p1', value: 5}, {id: '1143', 
type: 'p1', value: 4}, {id: '18', type: 'test', value: 4}] AS p_list
OPTIONAL MATCH (o:Item) 
WHERE o.id="18" AND o.type="test" 
WITH o, p_list
WHERE NOT o.id IN [x IN p_list WHERE x.type = o.type | x.id]
RETURN o

WHERE NOT o.id IN [x IN p_list WHERE x.type = o.type | x.id] - это ключ для фильтрации сложных объектов.

0 голосов
/ 22 апреля 2020

Вы даже не должны искать в БД, если нужная комбинация id и type находится в p_list.

Это должно работать (и эффективно избегать поиска, если не нужно):

WITH
  [{id: '16', type: 'p1', value: 2}, {id: '3', type: 'p2', value: 1}, {id: '54', type: 'p1', value: 3}, {id: '16', type: 'p1', value: 5}, {id: '1143', type: 'p1', value: 4}, {id: '18', type: 'test', value: 4}] as p_list,
  '18' AS id,
  'test' AS type
WHERE NONE(p IN p_list WHERE p.id = id AND p.type = type)
MATCH (o:Item) where o.id = id and o.type = type 
RETURN o

Если тест WHERE не пройден, то последующий MATCH даже не предпринимается.

Для простого повторного использования этого запроса вы можете опустить предложение WITH и передать p_list, id и type как параметры .

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