2017-06-22 105 views
0

我有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服务器)。

+0

您应该意识到您正在使用punning这一事实,即对于'Men'和'Women'使用与OWL类和OWL数据属性相同的URI。我不明白你为什么这样做。 – AKSW

+0

接下来,您使用'ex:People'作为属性,因此,您必须定义'ex:Men'和'ex:Women'是'ex:People'的子属性。然后,如果支持,则必须在三重商店中启用推理。 – AKSW

+0

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

回答

2

您应该意识到使用双击的事实,即与MenWomen相同的URI作为OWL类和OWL数据属性。我不明白你为什么这样做。你为什么不介绍numberOfMen,numberOfWomennumberOfPeople等房产?

接下来,你使用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属性路径,则必须在三重存储中启用推理。

但是,更重要的是,这只会导致两列,这意味着你必须做的聚集在你的SPARQL查询使用sum功能,如:

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 

注意,这个查询只能作品如果只有一个单一的度和分支,否则它会求和重复值。

+0

由于本体并不十分复杂,我曾想过将所有类和数据类型放入同一个URI中,以单个地址为基础,并用#引用每个元素;这是我第一次完全建立一个本体论,就像我看到它在几个地方完成了一样。将它们定义为一个类的想法是能够引用DBpedia或Schema.org的等效类。我是否可能会采用错误的方法? – germaaan

+0

顺便说一下,在将#People,#Men和#Women更改为“owl:DatatypeProperty”之后,我在查询中发现错误(''语法错误''''''''''之前) ,但#Men和#Women分别仍然给我正确的结果。有什么我可以做错了吗? – germaaan

+0

有一个缺少'.'。我现在修复了它 – AKSW