A Baseball Ontology in Jena RDF/OWL Format
Abstract-野球の情報を効率よく記録したり、推論したりする野球オントロジーを提案する。オントロジーはOWLで書かれ、データはRDFで記録される。ルールと構造は野球のルールに基づいて作られる。オントロジーの推論をテストするいくつかの例を示す。
1. INTRODUCTION
ゲームでは図1のようなデータを記録する。そのデータの多くは互いに関係がある。例えば、ホームランの時はヒットで打点(RBI)が付く(表にはホームランがない)。我々は、このデータベースに「このゲームで誰がホームランを打ちましたか?」なんて聞くことができる。
2.ONTOLOGY STRCTURE
オントロジーは次の3つの要素から出来ている( (1)ゲーム構成、(2)プレーヤ、(3)ゲームイベント)図2。
A.ゲーム構成:ゲーム、イニング、半インニング、先攻(TopInning)、後攻(BottomInning)という3つのGameElementからできている。これらの要素間の関係は、Happensとその逆HappenInで表現される(Happenはconsist of、HappenInはconcist inという感じ)。
B.ゲームメンバー:TeamとPlayerがgamememberに関係するクラスで、あるゲームは2つのチームを”HasTeam”で持つ(一方がHasHomeTeamで、他方が”HasVisitingTeam”となる)。TeamとPlayerはHasMemberとBeMemberOfで繋がれる。Playerには背番号Numberだけが与えられ、ポジションは与えない。なぜならゲーム中に変わることがある。ポジションはPitchesなどのPlayer間の関係で表す。ただ、ピッチャーだけは例外である。
HasRBIやHasHitやVersusPitcherなど重要なデータは記録するが、記録しないものも多い。
C.ゲームイベント:Hit,Walk,Failなどのゲームイベントは全てBattingの下位クラスである。図2を見て推測せよ(論文を読む上で、細かな野球用語は知らなくて大丈夫)。
IV 推論
推論には次のようなデータを使う。
(1) BaseballInf.java:Jenaの関数を使ったメインプログラム
(2) data.rdf:ゲームデータ群(ゲームのイニング、各回の表裏、チーム、選手、最初からのバッティング結果)で、RDF形式で記録。
(3) schema.owl:図2のオントロジーをowlで書いたもの。
(4) myrule.rule:推論規則
結果の一部
Test 1: “John”に関する全てのデータを出せ、という質問に対する応えの一部
Batting
information:
( John, Bats, Batting0003
)
( John, Bats, Batting0008
)
( John, Bats, Batting0013
)
( John, HasHit,
Batting0003 )
( John, HasHit, Top1_Game001
)
( John, HasHit,
Inn1_Game001 )
( John, HasHit, Game001 )
( John, HasHomerun,
Batting0003 )
( John, HasHomerun,
Top1_Game001 )
( John, HasHomerun,
Inn1_Game001 )
( John, HasHomerun,
Game001 )
( John, HasRBI,
Batting0003 )
( John, HasRBI, Top1_Game001
)
( John, HasRBI,
Inn1_Game001 )
( John, HasRBI, Game001 )
( John, HomerunOn, Tom )
Pitching
Informaion:
( John, Pitches,
Bottom1_Game001 )
( John, Pitches,
Bottom2_Game001 )
( John, Pitches,
Bottom3_Game001 )
( John, Pitches,
Inn1_Game001 )
:
付録1:data.rdf
<!—ゲームを定義 -->
<rdf:Description rdf:about="&h;Game001">
<rdf:type rdf:resource="&h;BaseballGame"/>
<h:GameDate rdf:datatype="&xsd;date">2007-06-25</h:GameDate>
<h:GameNumber rdf:datatype="&xsd;positiveInteger">1</h:GameNumber>
</rdf:Description>
<!—第一イニングを定義 -->
<rdf:Description rdf:about="&h;Inn1_Game001">
<rdf:type rdf:resource="&h;Inning"/>
<h:HappenIn rdf:resource="&h;Game001"/>
</rdf:Description>
:
<!—1回表を定義 -->
<rdf:Description rdf:about="&h;Top1_Game001">
<rdf:type rdf:resource="&h;TopInning"/>
<h:HappenIn rdf:resource="&h;Inn1_Game001"/>
</rdf:Description>
:
<!—チームを定義 -->
<rdf:Description rdf:about="&h;Lions">
<rdf:type rdf:resource="&h;Team"/>
<h:BeVisitingTeamIn rdf:resource="&h;Game001"/>
</rdf:Description>
:
<!—選手を定義 -->
<rdf:Description rdf:about="&h;Smith">
<rdf:type rdf:resource="&h;Player"/>
<h:BeMemberOf rdf:resource="&h;Lions"/>
<h:Number rdf:datatype="&xsd;positiveInteger">45</h:Number>
</rdf:Description>
:
<!—バッティングを定義 -->
<rdf:Description rdf:about="&h;Batting0001">
<rdf:type rdf:resource="&h;Double"/>
<h:HappenIn rdf:resource="&h;Top1_Game001"/>
<h:BattedBy rdf:resource="&h;Smith"/>
<h:Outs rdf:datatype="&xsd;nonNegativeInteger">0</h:Outs>
<h:RBI rdf:datatype="&xsd;nonNegativeInteger">0</h:RBI>
<h:Runs rdf:datatype="&xsd;nonNegativeInteger">0</h:Runs>
</rdf:Description>
:
付録2:
<!-- game structureのクラス -->
<owl:Class rdf:about="&h;BaseballGame"/>
<owl:Class rdf:about="&h;Inning"/>
<owl:Class rdf:about="&h;HalfInning"/>
<owl:Class rdf:about="&h;TopInning">
<rdfs:subClassOf rdf:resource="&h;HalfInning" />
</owl:Class>
<owl:Class rdf:about="&h;BottomInning">
<rdfs:subClassOf rdf:resource="&h;HalfInning" />
</owl:Class>
:
<!-- game event (the batting result)のクラス -->
<owl:Class rdf:about="&h;Hit">
<rdfs:subClassOf rdf:resource="&h;Batting" />
</owl:Class>
<owl:Class rdf:about="&h;Fail">
<rdfs:subClassOf rdf:resource="&h;Batting" />
:
<!-- game structureのプロパティ -->
<owl:DatatypeProperty rdf:about="&h;GameDate">
<rdfs:domain rdf:resource="&h;BaseballGame" />
<rdfs:range rdf:resource="&xsd;date"/>
</owl:DatatypeProperty>
<owl:DatatypeProperty rdf:about="&h;GameNumber">
<rdfs:domain rdf:resource="&h;BaseballGame" />
<rdfs:range rdf:resource="&xsd;positiveInteger"/>
</owl:DatatypeProperty>
:
<!—クラス間のプロパティ -->
<owl:ObjectProperty rdf:about="&h;Happens" >
<rdf:type rdf:resource="&owl;TransitiveProperty" />
</owl:ObjectProperty>
<owl:ObjectProperty rdf:about="&h;HappenIn">
<owl:inverseOf rdf:resource="&h;Happens"/>
<rdf:type rdf:resource="&owl;TransitiveProperty" />
</owl:ObjectProperty>
:
付録3:myrule.rule:以下のようなものが並んでいる。?が付く単語は変数を表す(Prologの大文字に相当)。
[Pitches_Infer2: (?pitcher h:PitchesDuring ?event)
-> (?pitcher h:Pitches ?event)]
[PitchesDuring_Infer:
(?pitcher h:PitchesDuring ?game) (?game rdf:type h:BaseballGame)
(?pitcher h:BeMemberOf ?team) (?team h:BeHomeTeamIn ?game)
(?game h:Happens ?event) (?event rdf:type h:TopInning)
è (?pitcher h:PitchesDuring ?event)]
è :
è
例えば
誰がホームランを打ったかを推論するルール:
[HasHomerun_Infer: (?batter h:Bats ?batting) (?batting rdf:type h:Homerun)
è (?batter h:HasHomerun ?batting)]
例えば、Johnに関して聞けば、( John, HasHomerun, Batting0003 )と答える(表1参照)。
次は、誰がいつホームランを打ったかに答える推論ルール:
[HasHomerun_Infer2: (?batter h:HasHomerun ?event1) (?event1 h:HappenIn ?event2)
-> (?batter h:HasHomerun ?event2)]
答えは、Table1の
( John, HasHomerun,
Top1_Game001 )
( John, HasHomerun,
Inn1_Game001 )
( John, HasHomerun, Game001 )
である。