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

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

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

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

Александр

2 ответа

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам