我有OWL和SPARQL的问题,我无法解决。我已经定义了几个类,但是对于有问题的问题,只有3个是重要的类:人,男性和女性;其定义是以下几点:OWL中的类和子类用于推理的SPARQL查询
<#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
}
如果我现在想男人和女人的总数推断都是Peopl Ë,我想,既然都是人的子类,我可以做下面的查询:
SELECT ?X ?degree ?branch ?people
WHERE {
?X ex:Degree ?degree .
?X ex:BranchKnowledge ?branch .
?X ex:People ?people
}
然而我没有得到任何结果。
我误解了类和子类之间的关系,我想要做什么或者会出现什么问题? (我正在使用Virtuoso服务器)。
您应该意识到您正在使用punning这一事实,即对于'Men'和'Women'使用与OWL类和OWL数据属性相同的URI。我不明白你为什么这样做。 – AKSW
接下来,您使用'ex:People'作为属性,因此,您必须定义'ex:Men'和'ex:Women'是'ex:People'的子属性。然后,如果支持,则必须在三重商店中启用推理。 – AKSW
但是,更重要的是,这只会导致两行,这意味着您必须使用'sum'函数在SPARQL查询中进行聚合。 – AKSW