带有推理的SPARQL查询的OWL中的类和子类

时间:2017-06-22 12:16:15

标签: sparql owl semantic-web ontology linked-data

我对OWL和SPARQL有一个我无法解决的问题。我已定义了几个课程,但对于有问题的问题,只有3个是重要课程:人,男女;其定义如下:

<#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
}

如果我现在想要得到男性和女性的总数推断两者都是人,我原以为我们都是人的子类,我可以进行以下查询:

SELECT ?X ?degree ?branch ?people
WHERE {
  ?X ex:Degree ?degree .
  ?X ex:BranchKnowledge ?branch .
  ?X ex:People ?people
}

然而我没有得到任何结果

我是否错误地构建了类和子类之间的关系,因为我想要做什么或者会出现什么问题? (我正在使用Virtuoso服务器)。

1 个答案:

答案 0 :(得分:2)

你应该知道你正在使用双关语,即MenWomen的相同URI作为OWL类和OWL数据属性。我不明白你为什么要这样做。为什么不介绍numberOfMennumberOfWomennumberOfPeople

等属性

接下来,您使用ex:People作为属性,因此,您必须定义ex:Menex:Womenex:People的子属性。

<#People> a owl:DatatypeProperty ;
    rdfs:label "People"@en .

<#Men> a owl:DatatypeProperty ;
    rdfs:subPropertyOf <#People> ;
    rdfs:label "Men"@en .

<#Women> a owl:DatatypeProperty ;
    rdfs:subPropertyOf <#People> ;
    rdfs:label "Women"@en .

然后,如果支持,则必须在三元组存储中启用推理或使用SPARQL 1.1属性路径。

但是,更重要的是,这只会导致两行,这意味着您必须使用sum函数在SPARQL查询中进行聚合,例如:

SELECT ?X ?degree ?branch (sum(?_people) as ?people)
WHERE {
  ?X ex:Degree ?degree .
  ?X ex:BranchKnowledge ?branch .
  ?p rdfs:subPropertyOf* ex:People .
  ?X  ?p ?_people
}
GROUP BY ?X ?degree ?branch

注意,此查询仅在只有一个度和分支时才有效,否则它将对重复值求和。