Сравните два списка в Neo4j - PullRequest
       8

Сравните два списка в Neo4j

0 голосов
/ 18 октября 2019

У меня есть набор данных (изображение), возвращенный из этого запроса:

MATCH(node:CXEligibilityRuleConstruct)-[:_properties]->(a)-->(spoke) with node
MATCH(node)<-[r:CXEHasChild]-(parent) where parent.nodeName='Network Segmentation' with node
Match(node)-[r:CXComponentHasCXRuleConstruct]-(cxc:CXComponentHierarchy{_type:'CXComponent'})
return node.elementLabel, collect( distinct  cxc.elementLabel)

DATA SET

Теперь, если пользователь вводит список, например:['Catalyst 9300','Cisco DNA Center','DNA Premier', 'ISE Appliance'], как мне вернуть node.elementLabel, связанный с этим совпадением?

1 Ответ

0 голосов
/ 19 октября 2019

Предполагая, что список пользователя передается как list параметр , и вы хотите точно сопоставить списки cxc.elementLabel (кроме порядка элементов), это должно работать:

MATCH (node:CXEligibilityRuleConstruct)-[:_properties]->()-->()
MATCH (node)<-[:CXEHasChild]-(parent)
WHERE parent.nodeName = 'Network Segmentation'
WITH node
MATCH (node)-[:CXComponentHasCXRuleConstruct]-(cxc:CXComponentHierarchy)
WHERE cxc._type = 'CXComponent' AND apoc.coll.disjunction(cxc.elementLabel, $list) = []
RETURN node.elementLabel

Функция APOC apoc.coll.disjunction(a, b) возвращает список с элементами, которых нет ни в a, ни в b.

[ОБНОВЛЕНИЕ]

Если вы не можете использовать APOCи $list никогда не имеет дубликатов элементов, тогда это должно работать:

MATCH (node:CXEligibilityRuleConstruct)-[:_properties]->()-->()
MATCH (node)<-[:CXEHasChild]-(parent)
WHERE parent.nodeName = 'Network Segmentation'
WITH node
MATCH (node)-[:CXComponentHasCXRuleConstruct]-(cxc:CXComponentHierarchy)
WHERE cxc._type = 'CXComponent' AND
  SIZE(cxc.elementLabel) = SIZE($list) AND
  ALL(x IN $list WHERE x IN cxc.elementLabel)
RETURN node.elementLabel
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...