类 和 OWL 中的子类用于带有推理的 SPARQL 查询
Classes and subclasses in OWL for SPARQL queries with inference
我有一个关于 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
}
如果我现在想获得 推断两者都是人的男性和女性总数,我曾想过既然都是人的子类,我可以进行以下查询:
SELECT ?X ?degree ?branch ?people
WHERE {
?X ex:Degree ?degree .
?X ex:BranchKnowledge ?branch .
?X ex:People ?people
}
但是我没有得到任何结果。
我是否错误地构建了 类 和 sub类 之间的关系来实现我想做的事情或者会出现什么问题? (我在 Virtuoso 服务器上工作)。
您应该知道您正在使用双关语,即 Men
和 Women
的 URI 与 OWL 类 和 OWL 数据属性。我不明白你为什么要这样做。为什么不引入 numberOfMen
、numberOfWomen
和 numberOfPeople
等属性?
接下来,您将 ex:People
用作 属性,因此,您必须定义 ex:Men
和 ex:Women
是 [= 的子属性17=].
<#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
请注意,此查询仅在只有一个学位和分支的情况下才有效,否则它会对重复值求和。
我有一个关于 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
}
如果我现在想获得 推断两者都是人的男性和女性总数,我曾想过既然都是人的子类,我可以进行以下查询:
SELECT ?X ?degree ?branch ?people
WHERE {
?X ex:Degree ?degree .
?X ex:BranchKnowledge ?branch .
?X ex:People ?people
}
但是我没有得到任何结果。
我是否错误地构建了 类 和 sub类 之间的关系来实现我想做的事情或者会出现什么问题? (我在 Virtuoso 服务器上工作)。
您应该知道您正在使用双关语,即 Men
和 Women
的 URI 与 OWL 类 和 OWL 数据属性。我不明白你为什么要这样做。为什么不引入 numberOfMen
、numberOfWomen
和 numberOfPeople
等属性?
接下来,您将 ex:People
用作 属性,因此,您必须定义 ex:Men
和 ex:Women
是 [= 的子属性17=].
<#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
请注意,此查询仅在只有一个学位和分支的情况下才有效,否则它会对重复值求和。