Получить пересекающиеся классы в запросе 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">
 </somevaluesfrom></onproperty></restriction>
 <restriction>
 <onproperty rdf:resource="&clink;hasMarker">
 <somevaluesfrom rdf:resource="&clink;B">
 </somevaluesfrom></onproperty></restriction>
 <restriction>
 <onproperty rdf:resource="&clink;hasPathologicalProcess">
 <somevaluesfrom rdf:resource="&clink;C">
 </somevaluesfrom></onproperty></restriction>
 </intersectionof>
 </class>
 </equivalentclass>
 </class>

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

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

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

SELECT ?subclass
WHERE {<xyz> <rdf:subclassof> <subclass>} 
</subclass></rdf:subclassof></xyz></ttp:>

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

A
B
C
1 ответ

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

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

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

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

EDIT2:

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

prefix rdfs: <http: 2000="" www.w3.org="" 01="" rdf-schema#="">
prefix owl: <http: 2002="" www.w3.org="" 07="" owl#="">
prefix rdf: <http: 1999="" www.w3.org="" 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
} 
</http:></http:></http:>

Конец EDIT2

Кроме того, вы можете изменить свою модель данных.

Итак, сначала ваш запрос должен вернуть анонимный класс (affects some A) and (hasMaker some B) and (hasPathologicalProcess some C) который является определяемым вами пересечением. Однако, поскольку это анонимный класс, для B_node будет возвращен пустой узел 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:somevaluesfrom></owl:onproperty></owl:restriction>
 <owl:restriction>
 <owl:onproperty rdf:resource="myPrefix#hasMaker">
 <owl:somevaluesfrom rdf:resource="myPrefix#B">
 </owl:somevaluesfrom></owl:onproperty></owl:restriction>
 <owl:restriction>
 <owl:onproperty rdf:resource="myPrefix#hasPathologicalProcess">
 <owl:somevaluesfrom rdf:resource="myPrefix#C">
 </owl:somevaluesfrom></owl:onproperty></owl:restriction>
 </owl:intersectionof>
 </owl:class>
 </owl:equivalentclass>
</owl:class>

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

Теперь, если вы хотите получить все (affects some A), (hasMaker some B) и (hasPathologicalProcess some C) в результатах, вы должны сначала убедиться, что аргумент работает, потому что это неявное знание, а второе для каждого анонимного класса пересечения, определите конкретный класс пересечений аналогично anyn_intersection выше 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:somevaluesfrom></owl:onproperty></owl:restriction>
 </owl:equivalentclass>
</owl:class>

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

EDIT1:

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

Конец EDIT1:

licensed under cc by-sa 3.0 with attribution.