Использование SPARQL для ограниченного RDFS и OWL рассуждения
Что я в настоящее время использую rdflib для создания и управления графами RDF в Python. RDFlib не делает никаких рассуждений о RDFS или OWL. Это приводит к следующим результатам:
Если у меня есть
A rdf:type MyType . MyType rdfs:subClassOf SuperType .
и я спрашиваю
select ?x where {?x rdf:type SuperType}
тогда я ничего не получу, но я бы хотел получить
A
(по семантике RDFS).То же самое происходит с
owl:equivalentClass
, Если у меня естьA rdf:type MyType . MyType owl:equivalentClass SiblingType .
и я спрашиваю
select ?x where {?x rdf:type SiblingType}
Я хотел бы получить
A
, но я ничего не получаю.
Есть ли способ получить эти результаты?
2 ответа
Хотя это проблема запроса к библиотеке и, как таковая, не по теме для Stackru, я хотел бы отметить, что во многих случаях вы можете отвечать на оба этих запроса, используя более сложные SPARQL-запросы. В обоих случаях вы можете использовать следующий запрос для получения желаемых результатов, где <class-of-interest>
является :SuperClass
или же :SiblingClass
:
select ?x where {
?x rdf:type/(rdfs:subClassOf|owl:equivalentClass)* <class-of-interest> .
}
Это находит ?x
у которых есть путь к началу rdf:type
и затем ноль или более rdfs:subClassOf
или же owl:equivalentClass
и в конечном итоге добирается до :SuperType
,
Например, рассмотрим следующие данные в Turtle/N3. (Кроме того, если вы задаете вопросы о выполнении запросов к данным, предоставьте данные, с которыми мы можем работать. Вы предоставили что-то вроде данных RDF в своем вопросе, но ничего, что мы могли бы скопировать, вставить и написать запрос на.)
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix : <http://stackru.com/q/20474862/1281433/>
:i1 a :C .
:C rdfs:subClassOf :D .
:D rdfs:subClassOf :E .
:i2 a :F .
:F rdfs:subClassOf :G1 .
:G1 owl:equivalentClass :G2 .
:G2 rdfs:subClassOf :H .
Вы можете выполнить запрос, подобный приведенному выше, чтобы выбрать людей и их типы (обратите внимание, что a
это сокращение в SPARQL и Turtle / N3 для rdf:type
):
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix : <http://stackru.com/q/20474862/1281433/>
select ?i ?type where {
?i a/(rdfs:subClassOf|owl:equivalentClass)* ?type
}
--------------
| i | type |
==============
| :i2 | :F |
| :i2 | :G1 |
| :i2 | :G2 |
| :i2 | :H |
| :i1 | :C |
| :i1 | :D |
| :i1 | :E |
--------------
Изменить: этот ответ был опубликован в ответ на оригинальный, другой вопрос.
Я должен получить, но я ничего не получаю!
Нет, ты не должен RDF сам по себе не содержит ничего об онтологиях, это просто тупой граф, и именно это делает RDFLib.
Выход за пределы этого называется рассуждением о данных. Это дополнительный слой. Голый RDFLib не делает рассуждений, потому что это сложно и, как правило, очень дорого в вычислительном отношении. Существуют сторонние решения для рассуждений, но прежде чем использовать их, вы должны понять, что они делают и какое влияние они окажут на производительность.
Наивным подходом к рассуждению RDFS и OWL 2 по графу RDFLib является реализация OWL 2 RL Ивана Германа. Он очень прост в использовании, но вы почти наверняка не захотите его, если вы не создаете игрушечное приложение, потому что это глупый алгоритм, который занимает очень много времени на графике реалистичного размера.
FuXi - более мощная библиотека, реализующая более умный алгоритм Rete-UL. Но я не уверен, поддерживается ли он или его можно использовать с текущими версиями RDFLib.
Существует также множество решений, основанных не на Python, таких как Pellet, но их интеграция с RDFLib или любой другой библиотекой RDF может оказаться непростой задачей.
Вы также должны подумать, какой вывод на самом деле требует ваше приложение. Вам нужно сделать вывод, что членство в подклассе? Если вы делаете, может быть, это все, что вам нужно? - тогда, возможно, вы могли бы сделать это вручную, перебирая X rdfs:subClassOf Y
утроить с RDFLib и вставить новый A rdf:type Y
троек.
В любом случае помните, что рассуждения в семантической сети - сложная тема, которая сильно зависит от приложения.