Использование 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, но ничего не получаю.

Есть ли способ получить эти результаты?


person Alex    schedule 09.12.2013    source источник
comment
Для rdflib это тема на сайте answer.semanticweb.com может оказаться полезной   -  person DNA    schedule 09.12.2013
comment
См. также этот Обзор инструментов Pythonic для RDF и связанных данных   -  person DNA    schedule 09.12.2013
comment
Обратите внимание, что вопросы, в которых нас просят порекомендовать или найти инструмент, библиотеку или любимый сторонний ресурс, не относятся к теме Stack Overflow, поскольку они, как правило, привлекают самоуверенные ответы и спам. Вместо этого опишите проблему и то, что уже было сделано для ее решения.   -  person Joshua Taylor    schedule 09.12.2013
comment
Ответ, предоставленный до сих пор, верен. Библиотека, которую вы используете для RDF, хороша; проблема в том, что вы ищете что-то, что может выполнять рассуждения RDFS или OWL.   -  person Joshua Taylor    schedule 09.12.2013
comment
Рискуя аннулировать другой ответ, я отредактировал этот вопрос, чтобы он соответствовал теме, изменив его на то, как мы можем получить ожидаемые результаты с помощью SPARQL? Этот вопрос по теме, тогда как оригинал (запрашивающий библиотеки Python) не был.   -  person Joshua Taylor    schedule 09.12.2013


Ответы (2)


Хотя это проблема запроса библиотеки и, как таковая, не по теме StackOverflow, я хотел бы отметить, что во многих случаях вы можете ответить на оба эти запроса, используя более сложные запросы 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://stackoverflow.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://stackoverflow.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   |
--------------
person Joshua Taylor    schedule 09.12.2013
comment
Спасибо @Joshua, вы получили этот результат, используя redlib? - person Alex; 10.12.2013
comment
@Alex На самом деле, я использовал инструменты командной строки Дженны. Однако это стандартный SPARQL 1.1, поэтому он должен работать где угодно. - person Joshua Taylor; 10.12.2013
comment
@JoshuaTaylor, спасибо, этот запрос действительно помог, пожалуйста, не знаете ли вы, где я могу найти написанный вами синтаксис? один содержит / и *, поэтому я могу посмотреть на другие возможные запросы/функции, которые есть в sparql 1.1. - person Ania David; 08.03.2016
comment
@ania, как я уже много раз говорил, все это есть в документации. Если вы ищете путь к свойству в спецификации SPARQL 1.1, он сразу же появится. (Конечно, вам нужно было бы заранее знать путь к свойству термина, чтобы знать, что искать, но я думаю, что упоминал об этом раньше. ..) - person Joshua Taylor; 08.03.2016
comment
В частности, @ania, см. раздел 9 Пути свойств. - person Joshua Taylor; 08.03.2016
comment
@JoshuaTaylor спасибо, дело в том, что мне нужно кое-что закончить и в то же время изучить это. параллельно занимаясь другими делами, всегда спасибо - person Ania David; 08.03.2016
comment
@Ania, при всем уважении, я думаю, что обычно быстрее найти что-то в документации, чем писать вопрос о переполнении стека и ждать, пока кто-то другой (у которого тоже есть другие дела) найдет время, чтобы ответить на него... - person Joshua Taylor; 08.03.2016
comment
@JoshuaTaylor Я тоже читаю :), сейчас я погружаюсь во временную онтологию, так что будьте готовы к море вопросов :) шучу - person Ania David; 08.03.2016

Изменить: этот ответ был опубликован в ответ на исходный другой вопрос.

Я должен получить A, но я ничего не получаю!

Нет, вы не должны. сам по себе 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.

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

person Vasiliy Faronov    schedule 09.12.2013
comment
Спасибо @Василий. На данный момент я вывожу эти экземпляры вручную. Я думал, что лучше получать их автоматически, но я не знал, что это так сложно - person Alex; 10.12.2013