Использование SPARQL для ограниченного RDFS и OWL рассуждения

Что я в настоящее время использую rdflib для создания и управления графами RDF в Python. RDFlib не делает никаких рассуждений о RDFS или OWL. Это приводит к следующим результатам:

  1. Если у меня есть

    A rdf:type MyType .
    MyType rdfs:subClassOf SuperType .
    

    и я спрашиваю

    select ?x where {?x rdf:type SuperType}
    

    тогда я ничего не получу, но я бы хотел получить A (по семантике RDFS).

  2. То же самое происходит с 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 троек.

В любом случае помните, что рассуждения в семантической сети - сложная тема, которая сильно зависит от приложения.

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