Sparql запрос подкласса или EquivalentTo

Я хочу запросить все подкласс никотина (продукт).
результат должен быть (никотиновая форма в носовой полости, ротоглоточный от ni ..(4 элемента).. см. на картинке),

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>           
PREFIX owl: <http://www.w3.org/2002/07/owl#>        
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>         
SELECT * WHERE 
{       
  ?s owl:equivalentClass+ ?o . # and try   ?s rdfs:subClassOf ?o    
  filter(?s=<http://snomed.info/id/323283001>)       
}

Это изображение от протеже Спасибо.

Первый запрос трудно объяснить и сделать, потому что такой большой файл, какой-то IRI, не подкласс и не эквивалентный класс, вместо этого я изменяю способ запроса.

<owl:Class rdf:about="http://snomed.info/id/323283001">
    <rdfs:label xml:lang="en">Nicotine (product)</rdfs:label>
    <rdfs:subClassOf>
        <owl:Class>
            <owl:intersectionOf rdf:parseType="Collection">
                <rdf:Description rdf:about="http://snomed.info/id/420383004"/>
                <rdf:Description rdf:about="http://snomed.info/id/425288007"/>
                <owl:Restriction>
                    <owl:onProperty rdf:resource="http://snomed.info/id/127489000"/>
                    <owl:someValuesFrom rdf:resource="http://snomed.info/id/68540007"/>
                </owl:Restriction>
            </owl:intersectionOf>
        </owl:Class>
    </rdfs:subClassOf>
</owl:Class>

Я хочу запросить все идентификаторы (id/420383004, id/425288007, id/127489000 и id/68540007)

от совы: класс rdf:about="http://snomed.info/id/323283001", пожалуйста, расскажите мне немного об идее. Поблагодарить

1 ответ

Решение

Во-первых, пара замечаний по поводу вашего запроса SPARQL. Первое касается разницы между * а также + в пути свойства, а второй касается использования filter и из values, Затем мы можем посмотреть, как запросить различные типы отношений подкласса / суперкласса из данных. Хитрость здесь в том, что некоторые из отношений, которые мы ищем, являются отношениями, для которых мы обычно использовали бы рассуждение OWL, но мы пытаемся сделать некоторые из этих рассуждений OWL, используя SPARQL

Несколько заметок об оригинальном запросе

Пути собственности, + а также *

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

:MyClass owl:equivalentClass :MyClass

вы не получите совпадений по запросу

?myClass owl:equivalentClass+ :MyClass

но вы получите результат (:MyClass) за

?myClass owl:equivalentClass* :MyClass

На самом деле, даже если owl:equivalentClass является симметричным свойством (т. е. из a owl:equivalentClass b мы можем сделать вывод b owl:equivalentClass a), тройка может присутствовать только в одном направлении в данных, поэтому нам на самом деле нужно

?myClass (owl:equivalentClass|^owl:equivalentClass)* :MyClass

С помощью values вместо filter

Кроме того, обратите внимание, что в этом запросе я использовал IRI в шаблоне напрямую; нет необходимости filter как в вашем исходном коде:

filter(?s=<http://snomed.info/id/323283001>)

Если вы хотите связать переменную с суперклассом, проще сделать это с values, как в

values ?superclass { <http://snomed.info/id/323283001> }
?subclass (rdfs:subClassOf|owl:equivalentClass)* ?superclass

OWL Рассуждение через SPARQL-запросы

В общем, отношения между классами (например, отношения подкласса и суперкласса) - это то, что вы должны использовать для определения OWL. Однако некоторые из них достаточно просты и присутствуют в кодировке RDF аксиом OWL, поэтому вы можете сделать те же выводы, используя запрос SPARQL. Например, если вы хотите найти отношения подкласса в иерархии, основанной на rdfs:subClassOf а также owl:equivalentClassВы можете использовать шаблон как этот:

?subclass (rdfs:subClassOf|owl:equivalentClass|^owl:equivalentClass)* ?superclass

Теперь, как отмечено ниже, вы можете столкнуться с некоторыми проблемами на вкладке SPARQL в Protégé, поэтому я предлагаю вам сохранить | использование в двоичном случае, так что вы бы действительно написать, в этом случае:

?subclass (rdfs:subClassOf|(owl:equivalentClass|^owl:equivalentClass))* ?superclass

Теперь данные, которые вы просматриваете, используют более сложные выражения классов. Когда у вас есть аксиома OWL вида

A subClassOf (B and C)

что вы на самом деле говорите, так это то, что существует класс A, и есть (обычно анонимный) класс, который является классом пересечений, и что это пересечение B и C. У вас нет аксиом

Подкласс B
Подкласс C

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

SubClassOf (B и C и (p некоторые D))

Важно отметить, что суперклассами A здесь являются B, C и (p some D). В частности, A не является подклассом p или D. Это может быть легче увидеть на конкретном примере:

TiredManWearingHat subClassOf (Человек и TiredPerson инекоторой шляпе)

Усталый человек в шляпе, несомненно, человек, явно усталый человек, явно носящий шляпу, но он, безусловно, не носит (что даже не имеет смысла), и он определенно не Шапка. Вот минимальная онтология, которая имеет именно ту структуру, с которой мы можем работать:

простая структура в Protégé

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns="https://stackru.com/q/21092246/1281433/data.owl#">
  <owl:Ontology rdf:about="https://stackru.com/q/21092246/1281433/data.owl"/>
  <owl:Class rdf:about="https://stackru.com/q/21092246/1281433/data.owl#C"/>
  <owl:Class rdf:about="https://stackru.com/q/21092246/1281433/data.owl#B"/>
  <owl:Class rdf:about="https://stackru.com/q/21092246/1281433/data.owl#A">
    <rdfs:subClassOf>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Class rdf:about="https://stackru.com/q/21092246/1281433/data.owl#B"/>
          <owl:Class rdf:about="https://stackru.com/q/21092246/1281433/data.owl#C"/>
          <owl:Restriction>
            <owl:onProperty>
              <owl:ObjectProperty rdf:about="https://stackru.com/q/21092246/1281433/data.owl#p"/>
            </owl:onProperty>
            <owl:someValuesFrom>
              <owl:Class rdf:about="https://stackru.com/q/21092246/1281433/data.owl#D"/>
            </owl:someValuesFrom>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </rdfs:subClassOf>
  </owl:Class>
</rdf:RDF>

Я уже написал ответ на Извлечение суперклассов, подразумеваемых классами пересечения OWL, в котором описано, как можно написать запрос о классах пересечений, поэтому я не буду объяснять все это здесь снова, но я включу запрос, который работает для этого дело. Результат, который я показываю - это то, что я получил, используя инструменты запросов SPARQL для командной строки Jena.

prefix :      <https://stackru.com/q/21092246/1281433/data.owl#> 
prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> 
prefix owl:   <http://www.w3.org/2002/07/owl#> 
prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

select ?superclass where {
  :A (rdfs:subClassOf|(owl:intersectionOf/rdf:rest*/rdf:first))* ?superclass .
}
--------------
| superclass |
==============
| :A         |
| _:b0       |
| :B         |
| :C         |
| _:b1       |
--------------

Теперь пустыми узлами являются класс анонимного пересечения и класс анонимного ограничения. Если вы не хотите включать их в результаты, вы можете легко отфильтровать их:

prefix :      <https://stackru.com/q/21092246/1281433/data.owl#> 
prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> 
prefix owl:   <http://www.w3.org/2002/07/owl#> 
prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

select ?superclass where {
  :A (rdfs:subClassOf|(owl:intersectionOf/rdf:rest*/rdf:first))* ?superclass .
  filter(!isBlank(?superclass))
}
--------------
| superclass |
==============
| :A         |
| :B         |
| :C         |
--------------

Можете добавить ^owl:equivalentClass|owl:equivalentClass в этот путь свойства, если вы также хотите следовать эквивалентным классам.

Делать это в Protégé

Как я уже сказал, в приведенных выше результатах использовались инструменты командной строки Jena. Вы сказали, что хотите сделать это в Protégé, и это немного усложняет ситуацию, потому что, кажется, создает некоторые проблемы. Последний запрос, который я показал, производит только A и B в Protégé; по какой-то причине он не включает C:

Тем не менее, обработка пустых узлов немного лучше (т.е. мы можем удалить filter и получить полезный вывод):

К сожалению, я не уверен, как получить тот же результат, что и Йена в Protégé, но я рассылаю по электронной почте их список рассылки об этом.

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