Возможно, вы захотите просмотреть запись в базе знаний Cypher для , выполняющей пересечение совпадений .
Тем не менее, статья поможет вам найти работу, для которой требуются все инструменты, с которыми вы работали ранее, но вам нужно будет выполнить чуть больше работы, чтобы убедиться, что количество инструментов, требуемых длязадание - это количество инструментов, с которыми вы работаете.
Вот пример использования первого подхода для подсчета количества совпадений при расширении от инструментов до заданий, которым они требуются:
MATCH (j:Job{Title: 'Build Shed'}) - [:Requires] -> (t:tools)
WITH collect(t) as tools, count(t) as requiredToolCount
UNWIND tools as t // change back to rows
MATCH (o:otherJob) - [:Requires] -> (t)
WITH o, tools, requiredToolCount, count(t) as toolsRequired
WHERE toolsRequired = requiredToolCount AND toolsRequired = size((o)-[:REQUIRES]->())
RETURN o, tools
Идея заключается в том, что мы собираем необходимые инструменты и получаем их количество (так, например, для молотка, отвертки и пилы), то есть количество необходимых инструментов - 3.
Затем мы раскручиваем коллекцию обратно.в строки и расшириться от инструмента до заданий, для которых требуется этот инструмент. Затем мы агрегируем, поэтому для каждого из этих заданий мы получаем количество этих трех инструментов, соответствующих заданию. Мы хотим, чтобы задания оставались только там, гдеколичество подходящих инструментов = требуемое количество инструментов, поэтому в данном примере мы хотим сохранить только те работы, для которых было подсчитано 3совпадения (по 1 на каждый из этих инструментов).
Наконец, мы проверяем общее количество инструментов, необходимых для работы, и проверяем, чтобы оно равнялось количеству инструментов, в которых мы заинтересованы (поскольку, если оно больше, тоэта работа требует большего количества инструментов, чем те, которые мы рассматриваем.
РЕДАКТИРОВАТЬ
С дополнительным требованием мы также хотим найти рабочие места, которые могут использовать меньше, чем общее количество инструментов, которые мы соответствовалис начала работы, но только если не требуется никаких дополнительных инструментов.Вот как мы можем изменить запрос:
MATCH (j:Job{Title: 'Build Shed'}) - [:Requires] -> (t:tools)
WITH collect(t) as tools, count(t) as maxRequiredToolCount
UNWIND tools as t // change back to rows
MATCH (o:otherJob) - [:Requires] -> (t)
WITH o, tools, maxRequiredToolCount, count(t) as toolsRequired
WHERE toolsRequired <= maxRequiredToolCount AND toolsRequired = size((o)-[:REQUIRES]->())
RETURN o, tools