【发布时间】:2017-06-22 12:16:15
【问题描述】:
我有一个无法解决的关于 OWL 和 SPARQL 的问题。我已经定义了几个类,但是对于所讨论的问题,只有 3 个是重要的:People, Men and Women;其定义如下:
<#People> a owl:Class ;
rdfs:label "People"@en .
<#Men> a owl:Class ;
rdfs:subClassOf <#People> ;
rdfs:label "Men"@en .
<#Women> a owl:Class ;
rdfs:subClassOf <#People> ;
rdfs:label "Women"@en .
然后是RDF中的一个数据,例如:
<rdf:Description rdf:about="Registration#1">
<rdfs:label>ARCHEOLOGY GRADUATE</rdfs:label>
<ex:BranchKnowledge>ARTS AND HUMANITIES</ex:BranchKnowledge>
<ex:Degree>ARCHEOLOGY GRADUATE</ex:Degree>
<ex:Men rdf:datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger">63</ex:Men>
<ex:Women rdf:datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger">99</ex:Women>
<dcterms:coverage>2015/2016</dcterms:coverage>
</rdf:Description>
如果我想获得每个数据的男性和女性人数,我可以通过以下查询得到它:
SELECT ?X ?degree ?branch ?men ?women
WHERE {
?X ex:Degree ?degree .
?X ex:BranchKnowledge ?branch .
?X ex:Men ?men .
?X ex:Women ?women
}
如果我现在想得到推断两者都是 People 的男性和女性的总数,我认为由于两者都是 People 的子类,我可以进行以下查询:
SELECT ?X ?degree ?branch ?people
WHERE {
?X ex:Degree ?degree .
?X ex:BranchKnowledge ?branch .
?X ex:People ?people
}
但是我没有得到任何结果。
我是否误解了类和子类之间的关系以实现我想要做的事情或会出现什么问题? (我正在使用 Virtuoso 服务器)。
【问题讨论】:
-
您应该知道您正在使用双关语这一事实,即
Men和Women的 URI 与 OWL 类和 OWL 数据属性相同。我不明白你为什么要这样做。 -
接下来,您使用
ex:People作为属性,因此,您必须定义ex:Men和ex:Women是ex:People的子属性。如果支持,您必须在三重存储中启用推理。 -
但是,更重要的是,这只会导致两行,这意味着您必须使用
sum函数在 SPARQL 查询中进行聚合。
标签: sparql owl semantic-web ontology linked-data