Быстрое прохождение графа по RDF-подобным данным: тройное хранилище или графовая база данных?

У меня есть структура данных графа, подобная RDF, т.е. состоящая из узлов (сущностей), которые соединены ребрами (свойствами, отношениями) разных типов. Пользователь выберет узел в этом графе (миллионы узлов, сотни миллионов ребер), и я ищу быстрый способ отобразить «близость» выбранного узла (то есть один или два уровня узлов, из которых - это путь через набор возможных заданных отношений к первоначально выбранному узлу).

Я провел небольшое исследование и наткнулся на RDF-специализированные хранилища троек и более общие базы данных графов, такие как neo4j и allegro. Кроме того, существуют промежуточные продукты, такие как jena и sesame.

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

Александр


person Alexander    schedule 31.05.2012    source источник


Ответы (2)


Я бы порекомендовал один из магазинов RDF (Jena, Sesame, 4store, Virtuoso, OWLim, Oracle и т. Д.). Затем вы можете просто изучить запрос SPARQL для своего решения и попробовать его в различных системах без необходимости кодировать для разных API.

Есть несколько подходов, которые вы можете использовать, самый простой - это запрос UNION с разными путями, вы можете использовать переменную для крайнего URI и добавить FILTER, чтобы ограничить его только теми, которые вам интересны.

person Steve Harris    schedule 31.05.2012

Чтобы уточнить, я бы не классифицировал Jena и / или Sesame как промежуточное ПО. У них обоих есть собственное хранилище и индексы.

В Йене есть TDB, который использует индексы B + Tree. В частности, для графика по умолчанию у вас есть три индекса: SPO, POS и OSP.

В вашем случае индекс SPO будет использоваться для получения всех троек по данному предмету. Если вам нужно два уровня глубины, вам нужно будет коснуться указателя несколько раз: один для исходного предмета и один для каждого объекта, скорректированного для вашего предмета.

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

То, что вы хотите сделать, очень похоже на то, что люди в сообществе RDF называли кратким ограниченным описанием (CBD), однако, если вам нужно два или более уровней, вам нужно будет реализовать это самостоятельно. Язык запросов SPARQL дает вам ОПИСАНИЕ, которое вы можете использовать (но на один уровень).

И последнее, но не менее важное: вы говорите, что у вас есть структура данных графа, подобная RDF, но это не RDF. По этой причине вам следует либо преобразовать данные в RDF, либо отказаться от идеи использования тройного хранилища, поскольку они предназначены для загрузки данных RDF и управления ими. Даже если вы действительно можете использовать только часть уровня хранения и индексации для создания и использования ваших собственных индексов.

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

person castagna    schedule 31.05.2012