Neo4j dijkstra с предварительно рассчитанной стоимостью - PullRequest
0 голосов
/ 24 мая 2018

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

Пользователь имеет возможность выбрать начальную и конечную точку и оценить, каким образом он хочет, чтобы его путь был сгенерирован.Путь (самый короткий) будет создан на основе расстояния, загрязнения и шума.Пользователь сможет назначить проценты для трех вариантов.Приведу пример. Стоимость для расчета кратчайшего пути будет равна: стоимость = (расстояние * 0,25) + (уровень шума * 0,25) + (уровень загрязнения * 0,5) для каждого. Это означает, что свойство стоимости отношений всегда будет динамическим.

Я использую процедуру apoc.algo.dijkstra, чтобы помочь мне в этом.Но только Дейкстра позволяет мне дать имя собственности отношений.Есть ли способ сделать это?Пример взаимосвязи между двумя узлами:

{"intersectionNode": 25632284, "polution_level": 2, "intersection_distance": 0.0, "noise_level": 5, "cost": 0}

IЯ новичок в Neo4j, и любая помощь будет оценена.Извините за ошибку на английском языке.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вы можете взглянуть на Memgraph , высокопроизводительную базу данных транзакционных графов в памяти.Memgraph совместим с openCypher и Bolt .(ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я соучредитель и технический директор).Memgraph имеет встроенную функцию взвешенного кратчайшего пути, где общий вес рассчитывается с помощью определяемой пользователем лямбда-функции.Для вашего случая и на основе этого набора данных

CREATE (n1 {id: 1}) CREATE (n2 {id: 2}) CREATE (n3 {id: 3}) CREATE (n4 {id: 4})
CREATE (n1)-[:E {pollution_level: 1, distance: 1.0, noise_level: 5}]->(n2)
CREATE (n1)-[:E {pollution_level: 2, distance: 2.0, noise_level: 4}]->(n3)
CREATE (n2)-[:E {pollution_level: 3, distance: 2.0, noise_level: 3}]->(n4)
CREATE (n3)-[:E {pollution_level: 4, distance: 1.0, noise_level: 2}]->(n4);

соответствующий запрос Memgraph будет аналогичен этому

  MATCH (a {id: 1})-[
            edges *wShortest
                (e, n | (e.distance * 0.25) +
                (e.noise_level * 0.25) +
                (e.pollution_level * 0.5))
            total_weight
        ]-(b {id: 4})
  RETURN startNode(head(edges)).id +
         reduce(acc = "", edge IN edges | acc + " -> " + endNode(edge).id) AS hops,
         total_weight;

со следующими результатами.

| hops      | total_weight |
|-----------|--------------|
|1 -> 2 -> 4| 4.75         |
0 голосов
/ 24 мая 2018

Обходной путь может быть следующим:

(1) Создать новое свойство вычисляемого веса в каждом соответствующем отношении.

(2) Запустите запрос dijkstra, используя это свойство вычисленного веса.

(3) При желании можно удалить свойства рассчитанного веса.(Если они не удалены, их значения со временем могут стать недействительными, поэтому их не следует использовать повторно.)

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