2017-06-22 4 views
0

解決できないOWLとSPARQLの質問があります。私はいくつかのクラスを定義しましたが、問題の質問のために重要なのは3つだけです:人、男性、女性;そして、その定義は、以下のようになります。その後、推論を使用したSPARQLクエリのOWLのクラスとサブクラス

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

私は、各データの男性と女性の数を取得したい場合は、私が手私は今、男性と女性の合計数を取得したい場合は、両方がPeoplであることを推測

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サーバーで作業しています)。

+0

OWLクラスとOWLデータプロパティとして 'Men'と' Women'に同じ名前のpunningを使用していることに注意してください。なぜあなたがこれをやっているのか分かりません。 – AKSW

+0

次に、 'ex:People'をプロパティとして使用しているので、' ex:Men'と 'ex:Women'を' ex:People'のサブプロパティとして定義する必要があります。そして、サポートされていれば、トリプルストアで推論を有効にする必要があります。 – AKSW

+0

しかし、もっと重要なのは、これは2行にしかなりません。つまり、 'sum'関数を使用してSPARQLクエリで集計を行う必要があります。 – AKSW

答えて

2

OWLクラスとOWLデータプロパティとしてMenWomenの同じURIを使用していることに注意してください。なぜあなたがこれをやっているのか分かりません。 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のプロパティパスを使用する必要があります。

しかし、もっと重要なのは、これが唯一のあなたは、例えば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 

注、このクエリは唯一の作品を単一の次数と枝がある場合は、重複した値を合計します。

+0

オントロジーはあまり複雑ではないので、すべてのクラスとデータ型を同じURIに入れ、単一のアドレスをベースとして#を使用して各要素を参照します。これは、オントロジーを完全に構築しなければならないのは初めてのことです。これは、いくつかの場所で行われたことを見たようなものです。それらをクラスとして定義するという考えは、DBpediaまたはSchema.orgの同等のクラスを参照できるようにすることです。おそらく間違ったアプローチをしていますか? – germaaan

+0

ところで、#People、#Men、#Womenを "owl:DatatypeProperty"に変更した後、あなたが置いたクエリでエラーが発生します( '?p'の前に '?X 'の構文エラーがあります) #Menと#Womenは別々に私に正しい結果を与えます。私が間違っていることがありますか? – germaaan

+0

不足していた '.'がありました。私は今それを修正しました – AKSW

関連する問題