ナレッジグラフ推論チャレンジ2021における
チーム:カカオ65% のリポジトリです.
各小説それぞれの小説で描写されていたことを踏まえたルールです.
内容については,プログラム内コメントや発表資料を参照して下さい.
小説の内容に関わらず,成立すると考えられたルールです.
各小説ファイルに入っているex_...ファイルが常識オントロジーファイルです.
内容については,プログラム内コメントや発表資料を参照して下さい.
このGithub内,dataには本文のデータ(完全,不完全(10%),不完全(25%)),
SpeckledBandにSpackledBandの推論で使用するファイル,
DevilsFootにDevilsFootの推論で使用するファイルです.
推論の際には,推論対象の小説名に対応する各フォルダ内のファイルを全てloadして下さい.
OS : macOS Monterey ver12.0
CPU : Apple M1 Pro
Stardog server 7.8.2
Java 1.8.0
Windows環境はオススメしません.
- 以下のURL先からOS対応のStardogのインストールを行う.
Stardog Installation - 以下のURL先を参照して,ブラウザ上でStardogを起動する.
Stardog Access Studio - Javaのインストールを行う.(versionは1.8.0, インストールされていれば不要)
- 左メニューバーにおける"Databases"より,新規リポジトリを作成する
- 作成したリポジトリにおいて"Load Data"を押し,ttlファイルの読み込みを行う.
- PREFIXに関しては,ルールファイル内で定義しているので"NameSpace"で指定する必要はないです.
- 読み込むttlファイルは,本文のttlファイルおよび小説ルール・常識オントロジーのttlファイルです.
- 左メニューバーにおける"Workspace"において,作成したリポジトリを選択し,Reasoningにチェックを入れ,以下のSPARQL検索を行う.
各検索に際して,検索文の前に以下の接頭辞を指定した上で検索を行って下さい.
まだらのひもの場合
PREFIX kd: <http://kgc.knowledge-graph.jp/data/SpeckledBand/>
PREFIX kgc: <http://kgc.knowledge-graph.jp/ontology/kgc.owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
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 kd: <http://kgc.knowledge-graph.jp/data/DevilsFoot/>
PREFIX kgc: <http://kgc.knowledge-graph.jp/ontology/kgc.owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
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 kd: <http://kgc.knowledge-graph.jp/data/SpeckledBand/>
PREFIX kgc: <http://kgc.knowledge-graph.jp/ontology/kgc.owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
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#>
SELECT DISTINCT *
WHERE{
?s kgc:hasProperty kd:dangerous.
}
-
犯人探し
SELECT ?s (count(?s) as ?c) WHERE{ { ?s ?p ?o. filter(?p = kgc:canKill && ?o = kd:Julia) }union{ ?s ?p ?o. filter(?p = kgc:canMurder && ?o = kd:Julia) }union{ ?s ?p ?o. filter(?p = kgc:haveMotivation) }union{ ?s ?p ?o. filter(?p = kgc:hasProperty && ?o = kd:dangerous) }union{ ?s ?p ?o. filter(?p = kgc:hasPredicate && ?o = kd:wasAtTheScene) }union{ ?s ?p ?o. filter(?p = kgc:isRelatedTo && ?o = kd:dying_message) } }GROUP BY ?s
?sに犯人候補が列挙され, ?cに上記条件にどれだけ当てはまるかの回数を表示する.
-
動機探し
SELECT DISTICT * WHERE{ kd:Roylott kgc:haveMotivation ?o. }
?oにお金が出てきて,動機がお金であることが分かる.
-
危険人物である
SELECT DISTINCT * WHERE{ ?s kgc:hasProperty kd:dangerous. }
?sにロイロットが出てくる.
すなわち,ロイロットは危険人物であることが分かる. -
密室である
SELECT DISTINCT * WHERE{ ?s kgc:cannotEnter ?o. }
?sに人間クラスに属する要素全て, ?oにジュリアの部屋が出てくる.
すなわち,人間はジュリアの部屋に入ることが出来ない,ジュリアの部屋は密室であることが分かる. -
密室である理由
SELECT DISTINCT * WHERE{ ?s kgc:cannotEnter ?o; kgc:from ?x. }
?sに人間クラスに属する要素全て, ?oにジュリアの部屋, ?xに入れない場所(鎧戸・床・煙突・廊下・壁・ドア)が出てくる.
すなわち,ジュリアの部屋の各場所から入ることは出来ないことが分かる. -
動機があるか
SELECT DISTINCT * WHERE{ ?s kgc:haveMotivation ?o. }
?sにロイロットとロマ, ?oに動機(金・協力)が出てくる.
すなわち,ロイロットはお金,ロマはロイロットへの協力が動機であることが分かる. -
ダイイングメッセージに関係しているか
SELECT DISTINCT * WHERE{ ?s kgc:isRelatedTo kd:dying_message. }
?sにロイロットとロマが出てくる.
すなわち,ロイロットとロマはロダイイングメッセージと関係があることが分かる. -
殺害現場にいたか
SELECT DISTINCT * WHERE{ ?s kgc:hasPredicate kd:wasAtTheScene. }
?sにロイロットとロマが出てくる.
すなわち,ロイロットとロマは殺害現場にいたことが分かる. -
どうやって殺したのか(殺害手段)
SELECT DISTINCT * WHERE{ ?s kgc:canKill ?o. }
?sにヘビ,?oにジュリアが出てくる.
すなわち,ヘビがジュリアを殺したことが分かる. -
誰が殺したのか
SELECT DISTINCT * WHERE{ ?s kgc:canMurder ?o. }
?sにロイロット,?oにジュリアが出てくる.
すなわち,ロイロットがジュリアを殺したことが分かる.
-
犯人探し
SELECT ?s (count(?s) as ?c) WHERE{ { ?s ?p ?o. filter(?p = kgc:canKill) }union{ ?s ?p ?o. filter(?p = kgc:canMurder && ?o = kd:Brenda) }union{ ?s ?p ?o. filter(?p = kgc:haveMotivationForBrenda) }union{ ?s ?p ?o. filter(?p = kgc:hasProperty && ?o = kd:dangerous) }union{ ?s ?p ?o. filter(?p = kgc:hasProperty && ?o = kd:wasAtTheScene1) }union{ ?s ?p ?o. filter(?p = kgc:isRelatedTo && ?o = kd:field_message_1) } }GROUP BY ?s
?sに犯人候補が列挙され, ?cに上記条件にどれだけ当てはまるかの回数を表示する.
-
動機探し
SELECT DISTICT * WHERE{ kd:Mortimer kgc:haveMotivationForBrenda ?o. }
?oにお金が出てきて,お金が動機であることが分かる.
(kd:Mortimer以外でも検索自体は可能だが,結果が出てこない.
すなわち動機がないという結果になる.)
-
危険人物である
SELECT DISTINCT * WHERE{ ?s kgc:hasProperty kd:dangerous. }
モーティマーとスタンデールは危険人物であることが分かる.
-
現場の物証に関係しているか
SELECT DISTINCT * WHERE{ ?s kgc:isRelatedTo kd:field_message_1. }
ブレンダ殺害事件には,現場の物証と関係しているものは存在しない.
-
殺害現場にいたか
SELECT DISTINCT * WHERE{ ?s kgc:hasProperty kd:wasAtTheScene1. }
殺害現場であるトリジェニス家にいた人物が, モーティマー,ブレンダ,ジョージ,オーウェン,ポーターの5人であること分かる.
-
どうやって殺したのか(殺害手段)
SELECT ?o WHERE{ kd:Mortimer kgc:have ?o; kgc:canMurder kd:Brenda. ?o kgc:canKill ?o2. }
殺した手段が魔足根であることが分かる.
-
誰が殺したのか
SELECT DISTINCT * WHERE{ ?s kgc:canMurder kd:Brenda. }
モーティマーとスタンデールがブレンダを殺せることが分かる.
-
犯人探し
SELECT ?s (count(?s) as ?c) WHERE{ { ?s ?p ?o. filter(?p = kgc:canKill) }union{ ?s ?p ?o. filter(?p = kgc:canMurder && ?o = kd:Mortimer) }union{ ?s ?p ?o. filter(?p = kgc:haveMotivationForMortimer) }union{ ?s ?p ?o. filter(?p = kgc:hasProperty && ?o = kd:dangerous) }union{ ?s ?p ?o. filter(?p = kgc:hasProperty && ?o = kd:wasAtTheScene2) }union{ ?s ?p ?o. filter(?p = kgc:isRelatedTo && ?o = kd:field_message_2) } }GROUP BY ?s
?sに犯人候補が列挙され, ?cに上記条件にどれだけ当てはまるかの回数を表示する.
-
動機探し
SELECT DISTICT * WHERE{ [Murder Name] kgc:haveMotivationForMortimer ?o. }
[Murder Name]には,1にて出力された犯人候補の中から任意の名前を入力する.
kd:Mortimerである場合は,?oに後悔が出てきて,後悔からの自殺が動機であることが分かる.
kd:Standaleである場合には,?oに復讐が出てきて,恋人の殺害への復讐が動機であることが分かる.
-
危険人物である
SELECT DISTINCT * WHERE{ ?s kgc:hasProperty kd:dangerous. }
モーティマーとスタンデールは危険人物であることが分かる.
-
現場の物証に関係しているか
SELECT DISTINCT * WHERE{ ?s kgc:isRelatedTo kd:field_message_2. }
現場の物証と関係しているものは,小石とスタンデールである.
-
殺害現場にいたか
SELECT DISTINCT * WHERE{ ?s kgc:hasProperty kd:wasAtTheScene2. }
殺害現場である牧師館にいた人物が, モーティマーとスタンデールの2人であること分かる.
-
どうやって殺したのか(殺害手段)
SELECT ?o WHERE{ kd:Standale kgc:have ?o; kgc:canMurder kd:Mortimer. ?o kgc:canKill ?o2. }
SELECT ?o WHERE{ kd:Mortimer kgc:have ?o; kgc:canMurder kd:Mortimer. ?o kgc:canKill ?o2. }
殺した手段が魔足根であることが分かる.
-
誰が殺したのか
SELECT DISTINCT * WHERE{ ?s kgc:canMurder kd:Mortimer. }
モーティマーとスタンデールがモーティマーを殺せることが分かる.
以下に当チャレンジにて用いたツールおよび関連リンクを紹介します.