получить пересекающиеся классы в запросе SPARQL с помощью RDFLib

У меня есть класс ABC, который является subClassOf классом XYZ и определен как пересечение классов A, B, C как:

<Class rdf:about="&clink;ABC">
    <equivalentClass>
        <Class>
            <intersectionOf rdf:parseType="Collection">
                <Restriction>
                    <onProperty rdf:resource="&clink;affects"/>
                    <someValuesFrom rdf:resource="&clink;A"/>
                </Restriction>
                <Restriction>
                    <onProperty rdf:resource="&clink;hasMarker"/>
                    <someValuesFrom rdf:resource="&clink;B"/>
                </Restriction>
                <Restriction>
                    <onProperty rdf:resource="&clink;hasPathologicalProcess"/>
                    <someValuesFrom rdf:resource="&clink;C"/>
                </Restriction>
            </intersectionOf>
        </Class>
    </equivalentClass>
    <rdfs:subClassOf rdf:resource="&clink;XYZ"/>
</Class>

Как я могу получить доступ к классам A, B и C через класс XYZ с помощью запроса SPARQL в RDFLib?

Следующий запрос возвращает пустой узел rdflib.term.BNode('_L'), и я не знаю, как обрабатывать BNodes.

PREFIX rdf: h<ttp://www.w3.org/2000/01/rdf-schema#>

SELECT ?subclass
WHERE {<XYZ> <rdf:subClassOf> <subclass>} 

Мне нужен запрос, который получает XYZ и возвращает это:

A
B
C

person Salman    schedule 18.12.2017    source источник


Ответы (1)


Прежде всего, XYZ не является ни subClassOf A, B, C, ни subClassOf их пересечением A and B and C (я использую манчестерский синтаксис (см. здесь)).

В своем фрагменте вы определяете XYZ как equivalentTo (что также подразумевает subClassOf) пересечения трех любые (см. здесь) классы; которые (affects some A) and (hasMaker some B) and (hasPathologicalProcess some C). Это пересечение не эквивалентно A and B and C (some в синтаксисе Манчестера означает someValuesFrom).

Чтобы понять, что означает someValuesFrom ограничение, см. Документацию (см. Здесь) из OWL:

Ограничение значения owl:someValuesFrom - это встроенное свойство OWL, которое связывает класс ограничения с описанием класса или диапазоном данных. Ограничение, содержащее ограничение owl:someValuesFrom, описывает класс всех лиц, для которых хотя бы одно значение соответствующего свойства является экземпляром описания класса или значением данных в диапазоне данных. Другими словами, он определяет класс индивидов x, для которого существует по крайней мере один y (либо экземпляр описания класса, либо значение диапазона данных), так что пара (x,y) является экземпляром P. Это не исключает наличия других экземпляров (x,y') из P, для которых y' не принадлежит описанию класса или диапазону данных.

РЕДАКТИРОВАТЬ2:

Теперь, когда вы должны понять, что означает owl:someValuesFrom, и, как предлагает @AKSW, вот простой запрос SPARQL. Однако вы не можете получить A, B и C, просто используя rdfs:subClassOf! Сначала вы должны получить ограничение, а затем получить доступ к свойству и классу, для которого оно определено, следующим образом:

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 ?eqclass ?restriction ?onProp  ?someValuesFrom where {

  {?eqclass owl:equivalentClass/owl:intersectionOf _:b. _:b rdf:first ?restriction}
  # First anonymous class (restriction) in the collection
  UNION { ?eqclass owl:equivalentClass/owl:intersectionOf/(rdf:rest+/rdf:first+)*  ?restriction.} 
  # getting other anonymous classes (restriction) using property paths and rdf:first and rdf:rest used in RDF collections.       
  ?restriction  rdf:type owl:Restriction. 
  # individuals of type owl:Restriction
  ?restriction  owl:onProperty ?onProp. 
  # the property the restriciton is defined on which
  ?restriction  owl:someValuesFrom ?someValuesFrom.
  # the class of the owl:someValuesFrom property
} 

Конец EDIT2

Другой способ решения проблемы - изменить модель данных.

Итак, сначала ваш запрос должен возвращать анонимный класс (affects some A) and (hasMaker some B) and (hasPathologicalProcess some C), который является определяемым вами пересечением. Однако, поскольку это анонимный класс, для него будет возвращен пустой узел B_node, а не конкретный класс. Чтобы вернуть конкретный класс, вы должны определить это анонимное пересечение как класс в вашей онтологии для этого пересечения; например, вы можете создать класс anyn_intersection следующим образом:

<owl:Class rdf:about="myPrefix#anyn_intersection">
    <owl:equivalentClass>
        <owl:Class>
            <owl:intersectionOf rdf:parseType="Collection">
                <owl:Restriction>
                    <owl:onProperty rdf:resource="myPrefix#affects"/>
                    <owl:someValuesFrom rdf:resource="myPrefix#A"/>
                </owl:Restriction>
                <owl:Restriction>
                    <owl:onProperty rdf:resource="myPrefix#hasMaker"/>
                    <owl:someValuesFrom rdf:resource="myPrefix#B"/>
                </owl:Restriction>
                <owl:Restriction>
                    <owl:onProperty rdf:resource="myPrefix#hasPathologicalProcess"/>
                    <owl:someValuesFrom rdf:resource="myPrefix#C"/>
                </owl:Restriction>
            </owl:intersectionOf>
        </owl:Class>
    </owl:equivalentClass>
</owl:Class>

Таким образом, ваш запрос получит этот класс anyn_intersection вместо пустого узла.

Теперь, если вы хотите получить все (affects some A), (hasMaker some B) и (hasPathologicalProcess some C) в результатах, вы должны сначала убедиться, что работает механизм рассуждений, потому что это неявное знание и < strong> second вам следует определить конкретный класс пересечения для каждого класса анонимного пересечения аналогично тому, как это было описано выше для anyn_intersection. Например, вы можете определить anyn_AffectsSomeA для анонимного класса ограничения: affects some A следующим образом:

<owl:Class rdf:about="myPrefix#anyn_AffectsSomeA">
    <owl:equivalentClass>
        <owl:Restriction>
            <owl:onProperty rdf:resource="myPrefix#affects"/>
            <owl:someValuesFrom rdf:resource="myPrefix#A"/>
        </owl:Restriction>
    </owl:equivalentClass>
</owl:Class>

Затем вам нужно определить два похожих класса anyn_hasMakerSomeB и anyn_hasPathologicalProcessSomeC. Наконец, вы определяете anyn_intersection как пересечение anyn_AffectsSomeA, anyn_hasMakerSomeB и anyn_hasPathologicalProcessSomeC.

РЕДАКТИРОВАТЬ1:

Я не знаю, есть ли в rdfLib какая-то особенность, которая позволяет вам получать определения анонимных классов. Это может решить вашу проблему без необходимости определять ее так, как я предлагаю. Кроме того, вы должны убедиться, что рассуждает.

Конец EDIT1:

person Median Hilal    schedule 18.12.2017
comment
Речь шла об использовании SPARQL для получения заполнителей ограничений свойств объекта. Я не понимаю, зачем кому-то вводить здесь какие-то искусственные классы. Ответ должен быть больше в направлении отображения отображения OWL на графы RDF, а затем написать соответствующий запрос SPARQL, который обычно более сложен из-за того, что конструкции OWL могут состоять более чем из одной тройки. - person UninformedUser; 19.12.2017
comment
См. Мой Edit2 ответа. - person Median Hilal; 19.12.2017
comment
TO, вероятно, не сочтет запрос простым, но это нормально: D - person UninformedUser; 19.12.2017
comment
Спасибо за полезный ответ. - person Salman; 24.12.2017