Прежде всего, 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