Поиск ключевых слов в базе данных neo4j по запросу cypher

введите описание изображения здесьЯ работаю над веб-сайтом и реализую функциональность поискового фильтра. Я получаю результаты поиска из базы данных, которая является neo4j. Я сталкиваюсь с проблемой в применении фильтров. Проблема в том, что когда добавить для поиска, скажем, Бангалор, я получаю 10 результатов, затем я добавляю другое ключевое слово, чтобы разработчик мог получить результат из всей базы данных, но то, что я хочу, должно быть получено только из предыдущего выбранный результат или ключевое слово Бангалор

Мой запрос:

        $data = array (
"query" => "MATCH (x :Job)-[r :POSTED_JOB]-(m) where ( x.city IN {data1} or x.categories or x.sectors IN {data4} or x.role IN {data5} or x.requirement IN {data6}
or x.title IN {data7} or x.description IN {data8})
RETURN m.companyName,x.city",
"params" => array(
"data1" => $city,
"data4" => $sector,
"data5" => $skills,
"data6" => $search,
"data7" => $search,
"data8" => $search

)
);

Как я могу написать этот запрос, чтобы уточнить результат.

0

Решение

Ваш запрос полон ORс, что означает, что Job будет соответствовать, когда любое из (этот массив содержит два свойства data5). Если вы хотите соответствовать все из предоставленных критериев затем поменять местами ORс для ANDs. В зависимости от данных, которые вы предоставляете, вам может понадобиться быть осторожным со значениями NULL и пустыми списками.

РЕДАКТИРОВАТЬ — пример кода

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

WHERE x.city IN {data1} OR x.role IN {data5}

Там написано, сопоставьте мне любой узел (x) ГДЕ x находится в Бангалоре ИЛИ ЖЕ ГДЕ Х для роли разработчика. Если вы хотите, чтобы ваш запрос совпадал только с записями, которые есть как в Бангалоре, так и для разработчика, то этот раздел запроса должен быть:

WHERE x.city IN {data1} AND x.role IN {data5}

x.categories тоже кажется немного странным (вы не запрашиваете ничего, кроме его существования).

РЕДАКТИРОВАТЬ — Post Chat

Требование состоит в том, чтобы выполнять последовательные запросы, где каждый запрос действует как фильтр для предыдущего результата. Все поля сопоставляются с каждым вызовом. Для этого вам нужно иметь идентификатор внешнего узла, который можно использовать для цепочки запросов, а затем передавать набор идентификаторов в каждый последующий запрос. Сокращенный пример в Cypher:

Начальный запрос:

MATCH (j:Job)<-[:POSTED_JOB]-(m)
WHERE j.title=~{searchString} OR j.description=~{searchString}
RETURN j.jobId, j.title, j.description, j.city, m.companyName

Последующие запросы:

MATCH (j:Job)<-[:POSTED_JOB]-(m)
WHERE j.jobId IN {collectionOfJobIds}
AND (j.title=~{searchString} OR j.description=~{searchString})
RETURN j.jobId, j.title, j.description, j.city, m.companyName

РЕДАКТИРОВАТЬ — Потому что это меня беспокоит

Возможно, вы захотите сопоставить данные по каждому запросу, поэтому вы можете использовать фильтр:

MATCH (j:Job)<-[:POSTED_JOB]-(m)
WHERE j.title=~({searchStrings}[0]) OR j.description=~({searchStrings}[0])
WITH m, COLLECT(j) as jobs
WITH m, FILTER (j IN jobs WHERE j.title=~({searchStrings}[1]) OR j.description=~({searchStrings}[1]) as filteredJobs
RETURN m, jobs

Это требует передачи searchStrings в виде массива, и вы можете добавить столько WITH, сколько захотите (просто не забудьте увеличить индекс массива). Важно понимать, что со всеми этими запросами, если у вас очень много заданий, они будут медленными, поскольку вы начинаете с сопоставления всех заданий в вашей системе. Если вы можете наложить некоторые ограничения на исходный матч, ваша жизнь станет лучше!

ВНЕ: Ваша модель на самом деле не является графиком, хотя вы могли бы моделировать Город, Сектор, Навыки и т. Д. Как Узлы, а не свойства.

1

Другие решения

Других решений пока нет …