use*_*402 3 java rdf semantic-web owl sparql
OWL本体可以具有类A,B和C以及公理(在DL表示法中):
A⊑(B⊓C)
或者近似曼彻斯特OWL语法:
甲subClassOf(B 和 C)
从逻辑上讲,A是B的子类,A是C的子类,但是三元组
A rdfs:subClassOf B
A rdfs:subClassOf C
Run Code Online (Sandbox Code Playgroud)
不一定存在于OWL本体的RDF序列化中.例如,考虑Protégé中这个非常简单的本体及其在RDF/XML和Turtle中的RDF序列化:

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://stackoverflow.com/q/19924861/1281433/sample.owl#"
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#">
<owl:Ontology rdf:about="http://stackoverflow.com/q/19924861/1281433/sample.owl"/>
<owl:Class rdf:about="http://stackoverflow.com/q/19924861/1281433/sample.owl#C"/>
<owl:Class rdf:about="http://stackoverflow.com/q/19924861/1281433/sample.owl#B"/>
<owl:Class rdf:about="http://stackoverflow.com/q/19924861/1281433/sample.owl#A">
<rdfs:subClassOf>
<owl:Class>
<owl:intersectionOf rdf:parseType="Collection">
<owl:Class rdf:about="http://stackoverflow.com/q/19924861/1281433/sample.owl#B"/>
<owl:Class rdf:about="http://stackoverflow.com/q/19924861/1281433/sample.owl#C"/>
</owl:intersectionOf>
</owl:Class>
</rdfs:subClassOf>
</owl:Class>
</rdf:RDF>
Run Code Online (Sandbox Code Playgroud)
@prefix : <http://stackoverflow.com/q/19924861/1281433/sample.owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<http://stackoverflow.com/q/19924861/1281433/sample.owl>
a owl:Ontology .
:B a owl:Class .
:C a owl:Class .
:A a owl:Class ;
rdfs:subClassOf [ a owl:Class ;
owl:intersectionOf ( :B :C )
] .
Run Code Online (Sandbox Code Playgroud)
序列化有一个三元组rdfs:subClassOf,但对象不是:B或者:C,所以查询就像
:A rdfs:subClassOf ?superclass
Run Code Online (Sandbox Code Playgroud)
不会返回超类:A.如何编写将返回那些超类的SPARQL查询:A?
听起来你有一个类是某个交集类的子类.例如,你可能有
学生 ⊑ 人 ⊓ 在某些课程中注册
在ProtégéOWL本体编辑器中,这看起来像:

如果为子类编写SPARQL查询,例如,
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?subclass ?superclass where {
?subclass rdfs:subClassOf ?superclass
}
Run Code Online (Sandbox Code Playgroud)
并且您没有推理器推断其他数据,您不会在结果中看到Student作为子类,但您可能会看到一个空白(匿名)节点:
---------------------------------------------------------
| subclass | superclass |
=========================================================
| <http://www.examples.org/school#Student> | _:b0 |
---------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
要理解为什么会出现这种情况,您需要查看本体的RDF序列化.在这种情况下,它是(在RDF/XML中):
<rdf:RDF
xmlns="http://www.examples.org/school#"
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#">
<owl:Ontology rdf:about="http://www.examples.org/school"/>
<owl:Class rdf:about="http://www.examples.org/school#Course"/>
<owl:Class rdf:about="http://www.examples.org/school#Person"/>
<owl:Class rdf:about="http://www.examples.org/school#Student">
<rdfs:subClassOf>
<owl:Class>
<owl:intersectionOf rdf:parseType="Collection">
<owl:Class rdf:about="http://www.examples.org/school#Person"/>
<owl:Restriction>
<owl:onProperty>
<owl:ObjectProperty rdf:about="http://www.examples.org/school#enrolledIn"/>
</owl:onProperty>
<owl:someValuesFrom rdf:resource="http://www.examples.org/school#Course"/>
</owl:Restriction>
</owl:intersectionOf>
</owl:Class>
</rdfs:subClassOf>
</owl:Class>
</rdf:RDF>
Run Code Online (Sandbox Code Playgroud)
或者在更易读的Turtle中(也更像是SPARQL查询语法):
@prefix : <http://www.examples.org/school#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
:Student a owl:Class ;
rdfs:subClassOf [ a owl:Class ;
owl:intersectionOf ( :Person [ a owl:Restriction ;
owl:onProperty :enrolledIn ;
owl:someValuesFrom :Course
] )
] .
:Person a owl:Class .
:enrolledIn a owl:ObjectProperty .
:Course a owl:Class .
<http://www.examples.org/school>
a owl:Ontology .
Run Code Online (Sandbox Code Playgroud)
事实上,Student rdfs:subClassOf [ ... ]数据中有三个,但它[ ... ]是一个空白节点; 它是一个匿名的owl:Class,是其他一些类的交集.推理机将能够告诉你,如果X ⊑(Ÿ和Z ^),那么X ⊑ Ÿ 和X ⊑ ž,但本身就是一个SPARQL查询不会那样做.你可以制作一个更复杂的SPARQL查询,但是:
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 ?subclass ?superclass where {
{ ?subclass rdfs:subClassOf ?superclass }
union
{ ?subclass rdfs:subClassOf [ owl:intersectionOf [ rdf:rest* [ rdf:first ?superclass ] ] ] }
}
Run Code Online (Sandbox Code Playgroud)
--------------------------------------------------------------------------------------
| subclass | superclass |
======================================================================================
| <http://www.examples.org/school#Student> | _:b0 |
| <http://www.examples.org/school#Student> | <http://www.examples.org/school#Person> |
| <http://www.examples.org/school#Student> | _:b1 |
--------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
两个空白节点是匿名交集类,以及匿名限制类(在某些课程中注册).如果您只想要IRI结果,可以使用filter:
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 ?subclass ?superclass where {
{ ?subclass rdfs:subClassOf ?superclass }
union
{ ?subclass rdfs:subClassOf [ owl:intersectionOf [ rdf:rest* [ rdf:first ?superclass ] ] ] }
filter( isIRI( ?superclass ) )
}
Run Code Online (Sandbox Code Playgroud)
--------------------------------------------------------------------------------------
| subclass | superclass |
======================================================================================
| <http://www.examples.org/school#Student> | <http://www.examples.org/school#Person> |
--------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
现在,作为最后的润色,如果你想使你的查询有点小,因为在这两个唯一的区别union版图案是连接路径?subclass和?superclass,你其实可以只用一个属性路径写这篇文章.(尽管如Sparql查询Subclass或EquivalentTo中所述,如果你这样做,你可能会遇到Protégé的一些问题.)这个想法是你可以重写这个:
{ ?subclass rdfs:subClassOf ?superclass }
union
{ ?subclass rdfs:subClassOf [ owl:intersectionOf [ rdf:rest* [ rdf:first ?superclass ] ] ] }
Run Code Online (Sandbox Code Playgroud)
因此,通过使用属性路径,这也消除了对空白节点的需求:
?subclass ( rdfs:subClassOf |
( rdfs:subClassOf / owl:intersectionOf / rdf:rest* / rdf:first ) ) ?superclass
Run Code Online (Sandbox Code Playgroud)
你可以简化一下
?subclass rdfs:subClassOf/((owl:intersectionOf/rdf:rest*/rdf:first)+) ?superclass
Run Code Online (Sandbox Code Playgroud)
你甚至可以从中删除一个级别的括号来制作它
?subclass rdfs:subClassOf/(owl:intersectionOf/rdf:rest*/rdf:first)+ ?superclass
Run Code Online (Sandbox Code Playgroud)
但是你必须开始记住优先规则,这并不是很有趣.该查询有效:
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 ?subclass ?superclass where {
?subclass rdfs:subClassOf/(owl:intersectionOf/rdf:rest*/rdf:first)+ ?superclass
filter( isIRI( ?superclass ) )
}
Run Code Online (Sandbox Code Playgroud)
--------------------------------------------------------------------------------------
| subclass | superclass |
======================================================================================
| <http://www.examples.org/school#Student> | <http://www.examples.org/school#Person> |
--------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1666 次 |
| 最近记录: |