0

私はかなり単純な SPARQL SELECT および CONSTRUCT クエリを実行できます。また、Jena の SimpleSelector を使用して Jena モデルからステートメントを取得しました。しかし、結果に対して多くの後処理を行わずに Jena モデルにクエリを実行する最善の方法についてはよくわかりません。

リーグに参加しているチームの Dave という名前のプレーヤーのチーム カラーとプレーヤー スコアを見つけたいと考えています。

SPARQL SELECT クエリを使用すると、リーグのチームの色と Dave という選手のスコアを別々に見つけることができますが、同じクエリで両方を指定して明確な結果を返すにはどうすればよいでしょうか?

次のオントロジーを使用しています。

<?xml version="1.0"?>


<!DOCTYPE rdf:RDF [
    <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
    <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
    <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
    <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
    <!ENTITY stackont "http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#" >
]>


<rdf:RDF xmlns="http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#"
     xml:base="http://www.semanticweb.org/id117167/ontologies/2013/9/stackont"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
     xmlns:stackont="http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#"
     xmlns:owl="http://www.w3.org/2002/07/owl#"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <owl:Ontology rdf:about="http://www.semanticweb.org/id117167/ontologies/2013/9/stackont"/>



    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Object Properties
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->




    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#hasPlayer -->

    <owl:ObjectProperty rdf:about="&stackont;hasPlayer">
        <rdfs:range rdf:resource="&stackont;Player"/>
        <rdfs:domain rdf:resource="&stackont;Team"/>
    </owl:ObjectProperty>



    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Data properties
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->




    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#PlayerName -->

    <owl:DatatypeProperty rdf:about="&stackont;PlayerName">
        <rdfs:domain rdf:resource="&stackont;Player"/>
        <rdfs:range rdf:resource="&xsd;string"/>
        <rdfs:subPropertyOf rdf:resource="&owl;topDataProperty"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#PlayerScore -->

    <owl:DatatypeProperty rdf:about="&stackont;PlayerScore">
        <rdfs:domain rdf:resource="&stackont;Player"/>
        <rdfs:range rdf:resource="&xsd;double"/>
        <rdfs:subPropertyOf rdf:resource="&owl;topDataProperty"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#TeamCategory -->

    <owl:DatatypeProperty rdf:about="&stackont;TeamCategory">
        <rdfs:domain rdf:resource="&stackont;Team"/>
        <rdfs:range rdf:resource="&xsd;string"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#TeamColor -->

    <owl:DatatypeProperty rdf:about="&stackont;TeamColor">
        <rdfs:domain rdf:resource="&stackont;Team"/>
        <rdfs:range rdf:resource="&xsd;string"/>
    </owl:DatatypeProperty>



    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Classes
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->




    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#Player -->

    <owl:Class rdf:about="&stackont;Player">
        <owl:disjointWith rdf:resource="&stackont;Team"/>
    </owl:Class>



    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#Team -->

    <owl:Class rdf:about="&stackont;Team"/>



    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Individuals
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->




    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#Player1a -->

    <owl:NamedIndividual rdf:about="&stackont;Player1a">
        <PlayerScore>500</PlayerScore>
        <PlayerName>Bob</PlayerName>
    </owl:NamedIndividual>



    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#Player1b -->

    <owl:NamedIndividual rdf:about="&stackont;Player1b">
        <PlayerScore>100</PlayerScore>
        <PlayerName>Dave</PlayerName>
    </owl:NamedIndividual>



    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#Player2a -->

    <owl:NamedIndividual rdf:about="&stackont;Player2a">
        <PlayerScore>75</PlayerScore>
        <PlayerName>Steve</PlayerName>
    </owl:NamedIndividual>



    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#Player2b -->

    <owl:NamedIndividual rdf:about="&stackont;Player2b">
        <PlayerName>Jack</PlayerName>
        <PlayerScore>200</PlayerScore>
    </owl:NamedIndividual>



    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#Team1 -->

    <owl:NamedIndividual rdf:about="&stackont;Team1">
        <TeamColor>red</TeamColor>
        <TeamCategory>league</TeamCategory>
        <hasPlayer rdf:resource="&stackont;Player1a"/>
        <hasPlayer rdf:resource="&stackont;Player1b"/>
    </owl:NamedIndividual>



    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#Team2 -->

    <owl:NamedIndividual rdf:about="&stackont;Team2">
        <TeamCategory>division</TeamCategory>
        <TeamColor>blue</TeamColor>
        <hasPlayer rdf:resource="&stackont;Player2a"/>
        <hasPlayer rdf:resource="&stackont;Player2b"/>
    </owl:NamedIndividual>



    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#Team3 -->

    <owl:NamedIndividual rdf:about="&stackont;Team3">
        <TeamColor>green</TeamColor>
        <TeamCategory>league</TeamCategory>
        <hasPlayer rdf:resource="&stackont;Player3a"/>
    </owl:NamedIndividual>



    <!-- http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#Player3a -->

    <owl:NamedIndividual rdf:about="&stackont;Player3a">
        <PlayerName>Dave</PlayerName>
        <PlayerScore>125</PlayerScore>
    </owl:NamedIndividual>
</rdf:RDF>
4

1 に答える 1

0

SPARQL は RDF グラフ クエリ言語です。探しているデータの種類に一致するグラフ パターンを記述するだけです。データの暫定的な完成に基づいて (クエリを実行できるように)、次のようなクエリが機能するようです。

prefix :      <http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#> 

select * where { 
  ?player :PlayerName "Dave" ;
          :PlayerScore ?score .
  ?team :hasPlayer ?player ;
        :TeamCategory "league" ;
        :TeamColor ?color .
}

Jena のコマンド ライン ツールを使用してデータに対してこのクエリを実行すると、次のような結果が得られます。

$ sparql --data leagues.n3  --query query.rq
----------------------------------------
| player    | score | team   | color   |
========================================
| :Player3a | "125" | :Team3 | "green" |
| :Player1b | "100" | :Team1 | "red"   |
----------------------------------------

トリプル パターンをもう少し詳しく見てみる価値があるかもしれません。プレーヤーに関する部分:

  ?player :PlayerName "Dave" ;
          :PlayerScore ?score .

は、 プロパティ の値を持つ?player何らかのリソースにバインドする必要があり、 プロパティの値が にバインドされていることを示しています。チームの説明は似ていますが、のプロパティの値が である必要があるという点で、他のパターンに「接続」されています。"Dave"PlayerNamePlayerScore?score?teamhasPlayer?player

  ?team :hasPlayer ?player ;
        :TeamCategory "league" ;
        :TeamColor ?color .

付録 A: 暫定的に完成したデータ

あなたのデータは多かれ少なかれ次のとおりだと思います。ここでは Turtle で示しています。人間が読みやすいためです。

@prefix :      <http://www.semanticweb.org/id117167/ontologies/2013/9/stackont#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:Team2  a              owl:NamedIndividual ;
        :TeamCategory  "division" ;
        :TeamColor     "blue" ;
        :hasPlayer     :Player2a , :Player2b .

:Player1b  a          owl:NamedIndividual ;
        :PlayerName   "Dave" ;
        :PlayerScore  "100" .

:PlayerName  a              owl:DatatypeProperty ;
        rdfs:domain         :Player ;
        rdfs:range          xsd:string ;
        rdfs:subPropertyOf  owl:topDataProperty .

:hasPlayer  a        owl:ObjectProperty ;
        rdfs:domain  :Team ;
        rdfs:range   :Player .

:Player2a  a          owl:NamedIndividual ;
        :PlayerName   "Steve" ;
        :PlayerScore  "75" .

:PlayerScore  a             owl:DatatypeProperty ;
        rdfs:domain         :Player ;
        rdfs:range          xsd:double ;
        rdfs:subPropertyOf  owl:topDataProperty .

<http://example.org/icecream>
        a       owl:Ontology .

:Team3  a              owl:NamedIndividual ;
        :TeamCategory  "league" ;
        :TeamColor     "green" ;
        :hasPlayer     :Player3a .

:TeamCategory  a     owl:DatatypeProperty ;
        rdfs:domain  :Team ;
        rdfs:range   xsd:string .

:Team   a       owl:Class .

:Player2b  a          owl:NamedIndividual ;
        :PlayerName   "Jack" ;
        :PlayerScore  "200" .

:Team1  a              owl:NamedIndividual ;
        :TeamCategory  "league" ;
        :TeamColor     "red" ;
        :hasPlayer     :Player1a , :Player1b .

:Player1a  a          owl:NamedIndividual ;
        :PlayerName   "Bob" ;
        :PlayerScore  "500" .

:Player3a  a          owl:NamedIndividual ;
        :PlayerName   "Dave" ;
        :PlayerScore  "125" .

:TeamColor  a        owl:DatatypeProperty ;
        rdfs:domain  :Team ;
        rdfs:range   xsd:string .

:Player  a                owl:Class ;
        owl:disjointWith  :Team .
于 2013-10-01T15:53:56.497 に答える