Соответствующие узлы, которые имеют отношения исключительно с конкретными узлами - PullRequest
0 голосов
/ 02 октября 2018

Я хочу вернуть список узлов, для которых требуются только те же инструменты, что и для других конкретных заданий.

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

Если я подхожу для конкретной работы, например, для строительства сарая и строительства сарая требуются молоток, отвертка и пила.Для выполнения других работ требуются только инструменты, необходимые для строительства навеса (включая работы, требующие любой комбинации этих инструментов или даже одного, если для этой работы не требуются другие инструменты). Например, для строительства забора требуется молоток и пила, и, следовательно, его необходимо вернуть, нодемонтаж сарая не должен быть возвращен, даже если для этого требуется молоток, потому что для этого также требуется лом.

Сейчас у меня есть

Match (j:Job{Title: 'Build Shed'}) - [:Requires] -> (t:tools)
Match (o:otherJob) - [:Requires] -> (t)
return j,o,t

Но это возвращает все задания, для которых требуется любой из этихинструменты, даже если для этих работ также требуются другие инструменты, которые не требуются для постройки сарая.

1 Ответ

0 голосов
/ 02 октября 2018

Возможно, вы захотите просмотреть запись в базе знаний 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...