- PVSM.RU - https://www.pvsm.ru -
Semantic Web и Linked Data подобны ближнему космосу: жизни там нет. Чтобы отправиться туда на более-менее длительный срок… ну, не знаю, что говорили вам в детстве в ответ на «хочу стать космонавтом». Но понаблюдать за происходящим можно и находясь на Земле; стать астрономом-любителем или даже профессионалом гораздо проще.
В статье речь пойдет о свежих, не старее нескольких месяцев, трендах из мира RDF-хранилищ. Метафора в первом абзаце была навеяна эпических размеров рекламной картинкой под катом.
Говорят [1], что GraphQL претендует стать универсальным языком доступа к базам данных. А как обстоят дела с возможностью доступа с использованием GraphQL к RDF?
«Из коробки» такую возможность предоставляют:
Если же хранилище такой возможности не предоставляет, её реализуют самостоятельно, написав соответствующий «распознаватель» (resolver). Так поступили, например, во французском проекте DataTourisme [6]. Или уже можно ничего не писать, а просто взять HyperGraphQL [7].
С точки зрения ортодоксального приверженца Semantic Web и Linked Data всё это, конечно, печально, поскольку кажется предназначенным для интеграций, выстраиваемых вокруг очередных data silo, а не подходящих для того платформ (разумеется, RDF-хранилищ).
Впечатления от сравнения GraphQL со SPARQL остаются двоякие.
Тренд, комплементарный предыдущему.
Если говорить шире, об адаптерах к JSON-источникам, позволяющих более-менее «на лету» представлять хранящийся в этих источниках JSON как RDF, то можно вспомнить и довольно давно существующий SPARQL Generate [10], который можно приладить, например [11], к Apache Jena.
Резюмируя первые два тренда, можно сказать, что RDF-хранилища демонстрируют полную готовность к интеграциям и функционированию в условиях «многовариантного хранения» (polyglot persistence). Известно, впрочем, что это последнее уже давно не в моде, и на смену ему грядет [12] мультимодельность. А как обстоят дела с мультимодельностью в мире RDF-хранилищ?
Если вкратце, то никак. Теме мультимодельных СУБД хочется посвятить отдельную статью, пока же можно заметить, что мультимодельных СУБД, «основанных» на графовой модели (разновидностью её можно считать RDF), сейчас нет. О некоей малой мультимодельности — поддержке RDF-хранилищами альтернативной графовой модели разделе V [13].
Впрочем, тот же Gartner пишет [14], что мультимодельность — условие sine qua non в первую очередь для операционных СУБД. Оно и понятно: в ситуации «многовариантного хранения» главные проблемы возникают с транзакционностью.
Вот только где на шкале OLTP—OLAP находятся RDF-хранилища? Я бы ответил так: ни там, ни тут. Для обозначения того, к чему они предназначены, нужна какая-то третья аббревиатура. Как вариант предложил бы OLIP — Online Intellectual Processing.
Однако все же:
А теперь разрешите представить нового игрока на рынке. от создателей IBM Netezza и Amazon Redshift — AnzoGraph [17]. Картинка из рекламы продукта на его основе была размещена в начале статьи. AnzoGraph позиционирует себя как GOLAP-решение. Как вам SPARQL c оконными функциями? —
SELECT ?month (COUNT(?event) OVER (PARTITION BY ?month) AS ?events) WHERE { … }
Выше уже была ссылка [16] на анонс Stardog 7 Beta, где говорилось, что Stardog собирается использовать в качестве нижележащей системы хранения RocksDB — хранилище «ключ-значение», фейсбуковский форк гугловской LevelDB. Почему уже стоит говорить о некоем тренде?
Во-первых, cудя по статье в Википедии [18], на RocksDB «пересаживаются» не только RDF-хранилища. Есть проекты по использованию RocksDB как движка хранения в ArangoDB, MongoDB, MySQL и MariaDB, Cassandra.
Во-вторых, на RocksDB делаются проекты (т. е. не продукты) соответствующей тематики.
Например, eBay использует RocksDB в платформе [19] для своего «графа знаний». Между прочим, забавно читать: the query language started as a home grown format, but more recently it has been transitioning to be much more like SPARQL. Как в анекдоте: сколько knowledge graph ни делаем, все равно получается RDF.
Другой пример — появившийся несколько месяцев назад Wikidata History Query Service [20]. До его появления за историческими сведениями Викиданных приходилось обращаться через MWAPI [21] к стандартному Mediawiki API. Теперь многое возможно на чистом SPARQL. «Под капотом» там тоже RocksDB. Кстати, сделал WDHQS, похоже, человек, занимавшийся импортом Freebase в Google Knowledge Graph.
Напомню основное отличие LPG-графов от RDF-графов.
В LPG на экземпляры ребер могут навешиваться скалярные свойства, в то время как в RDF они могут навешиваться лишь на «типы» ребер (зато не только скалярные свойства, но и обычные связи). Эта ограниченность RDF по сравнению с LPG преодолевается [22] теми или иными техниками моделирования. Ограниченность же LPG по сравнению с RDF преодолевается сложнее, но LPG-графы больше, чем RDF-графы, похожи на картинки из учебника Харари, поэтому люди их хотят.
Очевидно, задача «поддержки LPG» распадается на две части:
Здесь имеется несколько возможных подходов.
V.1.1. Singleton Property
Самый буквальный подход к гармонизации RDF и LPG — это, наверное, singleton property [23]:
:isMarriedTo
употребляются предикаты :isMarriedTo1
, :isMarriedTo2
и т. д.:isMarriedTo1 :since "2013-09-13"^^xsd:date
и пр.:isMarriedTo1 rdf:singletonPropertyOf :isMarriedTo
.rdf:singletonPropertyOf rdfs:subPropertyOf rdf:type
, но подумайте, почему не стоит писать просто :isMarriedTo1 rdf:type :isMarriedTo
.Задача «поддержки LPG» решается здесь на уровне RDFS. Такое решение требует внесения в соответствующий стандарт [24]. Какие-то изменения могут потребоваться от RDF-хранилищ, поддерживающих присоединение следствий, а пока Singleton Property можно воспринимать просто как еще одну техника моделирования.
V.1.2. Reification Done Right
Менее наивные подходы проистекают из осознания того, что экземпляры свойств вполне инстанциируются триплетами. Имея возможность говорить что-то о триплетах, мы получим возможность говорить и об экземплярах свойств.
Самый солидный из этих подходов — RDF* [25], он же RDR, родившийся [26] в недрах Blazegraph. Его с самого начала избрал [27] для себя и AnzoGraph. Солидность подхода определяется тем, что в его рамках предлагаются [28] соответствующие изменения в RDF Semantics [29]. Суть, однако, чрезвычайно проста. В Turtle-сериализации RDF можно теперь будет писать примерно так:
<<:bob :isMarriedTo :alice>> :since "2013-09-13"^^xsd:date .
V.1.3. Прочие подходы
Можно не заморачиваться формальной семантикой, а просто считать, что у триплетов есть некие идентификаторы, являющиеся, естественно, URI, и составлять новые триплеты с этими URI. Останется лишь дать доступ к этим URI в SPARQL. Так поступает [30] Stardog.
В Allegrograph пошли [31] промежуточным путем. Известно, что идентификаторы триплетов в Allegrograph есть [32], но при реализации triple attributes наружу они не торчат. Однако и до формальной семантики очень далеко. Примечательно, что атрибуты триплетов — не URI, и значения этих атрибутов тоже могут быть только литералами. Адепты LPG получают ровно то, что хотели. В специально изобретенном формате NQX пример, аналогичный приведенному выше для RDF*, выглядит так:
:bob :marriedTo :alice {"since" : "2013-09-13"}
Поддержав тем или иным способом LPG на уровне модели, нужно дать возможность делать запросы к данным в такой модели.
SELECT * { <<:bob :isMarriedTo ?wife>> :since ?since }
SELECT * {
BIND (stardog:identifier(:bob, :isMarriedTo, ?wife) AS ?id)
?id :since ?since
}
SELECT * { ("since" ?since) franz:attributesNameValue ( :bob :marriedTo ?wife ) }
Кстати, GraphDB одно время поддерживала Tinkerpop/Gremlin, не поддерживая при этом LPG, но в версии 8.0 или 8.1 это прекратилось.
Никаких прибавлений в пересечении множеств «triplestore of choice» и «open source triplestore» в последнее время не случалось. Новым RDF-хранилищам с открытым исходным кодом далеко до того, чтобы стать хорошим выбором для повседневного использования, а исходный код новых RDF-хранилищ, которые хотелось бы поиспользовать (того же AnzoGraph), закрыт. Скорее можно говорить даже об убавлениях…
Конечно, прежде открытый исходный код не закрывается, но некоторые хранилища c открытым исходным кодом постепенно перестают рассматриваться как достойные выбора. Virtuoso, имеющий opensource-редакцию, на мой взгляд, тонет в багах. Blazegraph куплен AWS и лег в основу Amazon Neptune; теперь непонятно, будет ли еще хоть один релиз. Остается лишь Jena…
Если же открытый исходный код не очень важен, а хочется просто попробовать, то всё тоже менее радужно, чем раньше. Например:
В общем, для рядового ИТ-обывателя космос становится все более и более недоступным, освоение его становится уделом корпораций.
Автор: nitrosbase
Источник [40]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/nosql/317233
Ссылки в тексте:
[1] Говорят: https://www.zdnet.com/article/graphql-for-databases-a-layer-for-universal-database-access/
[2] блог: https://www.stardog.com/blog/graphql-and-paths/
[3] документация: https://www.stardog.com/docs/#_executing_graphql_queries
[4] вебинар: https://www.topquadrant.com/2018/07/05/graphql-webinar/
[5] документация: https://www.topquadrant.com/technology/graphql/
[6] DataTourisme: https://framagit.org/datatourisme/api/tree/master/src/Resolver
[7] HyperGraphQL: https://www.hypergraphql.org/
[8] возможно: https://www.stardog.com/blog/native-mongodb-support-is-here/
[9] позволяет: http://graphdb.ontotext.com/documentation/8.8/standard/integrating-graphdb-with-mongodb.html
[10] SPARQL Generate: https://ci.mines-stetienne.fr/sparql-generate/
[11] например: https://github.com/sparql-generate/sparql-generate
[12] грядет: https://www.gartner.com/en/documents/3105622
[13] разделе V: #v-podderzhka-lpg
[14] пишет: https://www.gartner.com/en/documents/3467318
[15] предназначены: https://www.ontotext.com/company/news/ontotexts-graphdb-8-8-0-enriches-the-knowledge-graph-experience/
[16] переписывает: https://www.stardog.com/blog/announcing-stardog-7-beta/
[17] AnzoGraph: https://www.cambridgesemantics.com/product/anzograph/
[18] статье в Википедии: https://en.wikipedia.org/wiki/RocksDB#Alternative_backend
[19] платформе: https://github.com/eBay/beam
[20] Wikidata History Query Service: https://www.wikidata.org/wiki/Wikidata:History_Query_Service
[21] MWAPI: https://www.mediawiki.org/wiki/Wikidata_Query_Service/User_Manual/MWAPI
[22] преодолевается: https://www.w3.org/TR/swbp-n-aryRelations/
[23] singleton property: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4350149/
[24] стандарт: https://www.w3.org/TR/rdf-schema/
[25] RDF*: https://arxiv.org/abs/1409.3288
[26] родившийся: https://wiki.blazegraph.com/wiki/index.php/Reification_Done_Right
[27] избрал: https://docs.cambridgesemantics.com/anzograph/userdoc/lpgs.htm
[28] предлагаются: https://arxiv.org/abs/1406.3399
[29] RDF Semantics: https://www.w3.org/TR/rdf11-mt/
[30] поступает: https://www.stardog.com/docs/#_motivation_implementation
[31] пошли: https://franz.com/agraph/support/documentation/current/triple-attributes.html
[32] есть: https://franz.com/agraph/support/documentation/current/triple-index.html
[33] Gremlin: https://github.com/blazegraph/tinkerpop3/blob/master/README.md
[34] Cypher: https://www.cambridgesemantics.com/cambridge-semantics-adds-opencypher-anzograph-2/
[35] расширение: https://www.stardog.com/docs/#_integration_with_sparql_2
[36] опять-таки: https://www.stardog.com/docs/#_example_2
[37] расширение: https://franz.com/agraph/support/documentation/current/triple-attributes.html#Querying-Attributes-using-SPARQL
[38] прекращает: https://community.stardog.com/t/update-to-enterprise-and-community-trials/1533
[39] GraphDB Cloud: https://cloud.ontotext.com/
[40] Источник: https://habr.com/ru/post/451206/?utm_source=habrahabr&utm_medium=rss&utm_campaign=451206
Нажмите здесь для печати.