Arhn - архитектура программирования

Дизайн базы данных Neo4j. Края с отношениями? Отфильтрованный кратчайший путь?

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

Требования - украсить "Темы" и "Ребра" "Вложениями". Темы и края отображаются на графике D3. Вложения в подробном представлении Topic или Edge.

Это концептуальная модель (темы и ребра показаны на D3):

(attach1) -> (topic1) --edge12--> (topic2) <--edge23-- (topic3) <- (attach2)
                |         |           |          |
          (attach3)    (attach4)   (attach4)  (attach5)

Самое простое, что не работает:

Topics -> Nodes
Edges -> Relationships
Attachments -> Nodes

Neo4j не имеет «гиперребер», так что вместо этого:

Topics -> Nodes
Edges -> Nodes that relate only to Topics
Attachments -> Nodes that relate to Topics and Edges

Это шатко, но работоспособно. Альтернативой может быть создание свойства Edge с идентификаторами вложений, но это кажется беспорядочным.

Следующим требованием является выполнение «многотематического поиска», который представляет собой список кратчайших путей между 2+ темами, но только по темам и краям.

Я нашел эти < href="https://stackoverflow.com/questions/23239167/finding-shortest-path-that-excludes-particular-edges">вопросы, которые я не совсем понимаю, но, похоже, объясняют, как для фильтрации результатов. Они не кажутся очень эффективными для OLAP.

Есть ли лучший способ смоделировать этот ориентированный граф в Neo4j?

Есть ли лучший способ сделать отфильтрованный поиск по нескольким узлам?

Спасибо!

29.05.2015

Ответы:


1

[ОБНОВЛЕНО]

Оригинальный ответ

Для исторического интереса и для сравнения с окончательным решением ниже приведен мой первоначальный ответ.

Поскольку у вас не может быть связи, напрямую связанной с другой связью, вы можете материализовать Edge как узел. Например, вот возможная модель:

(:Attachment) -[:FOR]-> (:Topic)
(:Attachment) -[:FOR]-> (:Edge)
(:Topic) <-[:FROM]- (:Edge) -[:TO]-> (:Topic)

Вот запрос на поиск кратчайшего пути (или путей, если есть связь) между любыми двумя конкретными Topics:

MATCH (t1:Topic { id: 't1' }), (t2:Topic { id: 't2' })
RETURN ALLSHORTESTPATHS((t1)-[:FROM|TO*]-(t2))

И вот консоль, которая демонстрирует это.

Предостережение: приведенный выше запрос не обеспечивает разумной направленности. Так, например, предположим, что данные выглядят так (для простоты я заменяю узлы Edge стрелками): (t1)->(t2)<-(t3). Если бы нам нужен был кратчайший путь от t1 до t3, мой запрос вернул бы путь, состоящий из t1, t2 и t3, даже если вы не можете перейти от t2 к t3. Обеспечение чувствительности должно быть возможно, но сделало бы запрос немного более сложным...

Улучшенный ответ

Чтобы включить разумную направленность (см. выше), нам просто нужно внести небольшое изменение в мою исходную модель данных, установив отношения к/от каждой Edge точки в одном и том же направлении.

То есть вместо этого:

(:Topic) <-[:FROM]- (:Edge) -[:TO]-> (:Topic)

мы делаем это:

(:Topic) -[:TO_EDGE]-> (:Edge) -[:FROM_EDGE]-> (:Topic)

С этой улучшенной моделью данных следующий запрос обеспечит разумную направленность. Обратите внимание, что запрос теперь включает стрелку < или > для указания нужного направления:

MATCH (t1:Topic { id: 't1' }),(t2:Topic { id: 't2' })
RETURN ALLSHORTESTPATHS((t1)-[:FROM_EDGE|TO_EDGE*]->(t2))

Вот консоль, демонстрирующая улучшенную модель данных и запрос. Он возвращает путь с двумя ребрами (от t1 до t2) как кратчайший путь, поскольку путь с одним ребром имеет неправильную направленность.

29.05.2015
  • Хорошо спасибо! Приложение может указывать на две темы, что делает его частью кратчайшего пути. Есть ли простой способ исключить узлы и отношения по метке (или?) с помощью ALLSHORTESTPATHS? Это то, что делает [:FROM|TO*]? (Извините, нужно немного узнать о Сайфере) 29.05.2015
  • Вы поняли, вложения будут использовать тип отношения FOR, и мой запрос не указывает, что это тип для соответствия. Поэтому вложения никогда не будут включены в кратчайшие пути. 29.05.2015
  • Потрясающий! Я выигрываю StackOverflow. Спасибо :-) 29.05.2015
  • Чтобы быть полным, я добавил оговорку в конец своего ответа. 29.05.2015
  • @cybersam: это очень полезный ответ. В настоящее время я сталкиваюсь с той же проблемой. Не могли бы вы дать нам подсказку о том, как указать разумную направленность? Из того, что я понимаю о синтаксисе кратчайшего пути Neo4j в Cypher, мне кажется, что это вообще невозможно. Пожалуйста, просветите меня. 29.09.2015
  • Хорошо, смотрите мой улучшенный ответ. 29.09.2015
  • Это имеет смысл. :-) Небольшая поправка: в вашей новой модели данных вы, вероятно, захотите, чтобы обе стрелки указывали в другом направлении (или поменяйте местами TO_EDGE с FROM_EDGE). 29.09.2015
  • На самом деле я хотел использовать это имя, но, по общему признанию, оно менее читабельно, чем в исходном ответе. Конечно, вы можете использовать любые имена... 30.09.2015
  • О, моя ошибка. Теперь я вижу, как читают ваши имена. Немного проблемы с английской двусмысленностью. 30.09.2015

  • 2

    Как насчет такой структуры графа:

    (topic_attachment_1)--(topic1)--(edge_attachment_1_2)--(topic2)--(topic_attachment_2)
                              |                                |
                          (topic3)                          topic(4)
    

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

    29.05.2015
  • Привет @maxymoo, я обновил вопрос концептуальной схемой. Мне нужно связать вложения с краями... 29.05.2015
  • Эй, Майкл, я добавил еще немного пояснений, чтобы все стало яснее. 29.05.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..