Модель исходной информации для максимизации производительности запросов
Мне интересно, как лучше (с точки зрения производительности) моделировать источники данных в Neo4j.
Рассмотрим следующий сценарий: мы объединяем разные наборы данных о музыкальной области в один график. Данные могут варьироваться от разных художников и стилей до информации о продажах. Важно хранить источник этой информации. Например, у нас есть данные из общедоступного источника, такого как DBpedia или некоторых других частных источников. Чтобы иметь возможность выполнять запросы только для определенных наборов данных, мы должны включить источник для каждого узла (и оптимальным образом для каждого отношения). Конечно, один узел или отношение может иметь несколько источников.
Есть три простых решения:
Добавьте исходное свойство к каждому Узлу и Связи; индексировать это свойство и использовать его в запросе шифра. Например:
MATCH (n: Artist) ГДЕ n.source='DBpedia' вернуть n
Добавьте источник как метку для каждого узла и тип для каждого отношения (можем ли мы иметь несколько типов в одном отношении?). Например:
СОЗДАТЬ (n: Исполнитель:DBpediaSource:CustomerSource)
Создайте отдельный узел для каждого источника и свяжите все другие узлы с соответствующим узлом источника. Например:
MATCH (n: Artist) - [: HASSOURCE] - (: DBpediaSource) вернуть n
Конечно, для этих примеров решение не имеет значения с точки зрения производительности. Однако использование источника в более сложных запросах и на более крупном графике (скажем, с несколькими миллионами узлов и отношений), способ, которым мы моделируем эту задачу, окажет значительное влияние на производительность.
Еще один сложный пример, где также необходимы источники, - это генерация "подграфа". Мы хотим извлечь все узлы и отношения из одного или нескольких источников и, например, экспортировать это в новый экземпляр Neo4j, или ограничить некоторые графические алгоритмы, такие как PageRang, этим "подграфом", не создавая отдельный экземпляр Neo4j.
Кто-нибудь в сообществе имеет опыт работы с таким случаем? Каков наилучший способ смоделировать это с точки зрения производительности? Есть ли другие решения?
Спасибо за вашу помощь.