Как оптимизировать три запроса с похожими характеристиками? (Шифр) - PullRequest
0 голосов
/ 03 апреля 2020

У меня проблема с моим запросом Neo4j. Например, в моей базе данных я хочу выбрать людей, похожих на человека по его фамилии, имени и году рождения. Если я не найду никого с точным соответствием, я сделаю запрос, чтобы найти людей с такой же фамилией и годом рождения. Наконец, если я не найду соответствия для своего второго запроса, я сделаю третье соответствие, чтобы выяснить, есть ли люди с таким же годом рождения, как у этого человека. Как мне объединить эти три запроса в один. Я думаю, что для большой базы данных этот тип запроса очень обширен, поэтому мне нужен какой-то способ оптимизировать эту логику c.

MATCH (c:Company)-[r:CARRY]->(p:Person {LastName: "Foo", FirstName: "Bar", YOB: 1999 })
RETURN p

Если ответов не найдено, я сделаю

MATCH (c:Company)-[r:CARRY]->(p:Person {LastName: "Foo", YOB: 1999 })
RETURN p

Если я все еще не могу найти ответ, я попытаюсь

MATCH (c:Company)-[r:CARRY]->(p:Person {YOB: 1999 })
RETURN p

Я просто пытаюсь сделать более эффективный запрос для этой логики c. Спасибо за помощь.

1 Ответ

2 голосов
/ 03 апреля 2020

Ваш запрос может выполнить тесты в обратном порядке. То есть сначала выполните более общие тесты.

На шаге 1 (запроса) вы можете найти все Person узлы с желаемым YOB, который будет надмножеством * 1006. * из конечного результата. Давайте назовем этот набор узлов p1.

. На шаге 2 отфильтруйте набор узлов в p1 по требуемому LastName, и давайте назовем результирующее подмножество p2.

На шаге 3 отфильтруйте набор узлов в p2 по требуемому FirstName, и давайте назовем результирующее подмножество p3.

Наконец, вы можете вернуть p3, если это не так пусто, или p2, если оно не пустое, или p1.

Вот пример (который предполагает, что желаемые значения YOB, LastName и FirstName передаются как параметры ):

MATCH (:Company)-[:CARRY]->(p:Person)
WHERE p.YOB = $YOB
WITH COLLECT(p) AS p1
WITH p1, REDUCE(s = [], x IN p1 |
  CASE x.LastName WHEN $LastName THEN s + x ELSE s END) AS p2
WITH p1, p2, REDUCE(s = [], x IN p2 |
  CASE x.FirstName WHEN $FirstName THEN s + x ELSE s END) AS p3
RETURN CASE
  WHEN SIZE(p3) > 0 THEN p3
  WHEN SIZE(p2) > 0 THEN p2
  ELSE p1 END AS result

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

Если вы хотите ограничить максимальный размер списка result, просто измените последнюю строку запроса на:

  ELSE p1 END[..$limit] AS result

где limit предполагается параметром.

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