3

私はよく知られているオントロジーをマンチェスター OWL 構文コンバーターを介してpizza.owlRDF ファイルに変換しました。pizza.rdf私はこのコードを書きましたが、結果は得られませんが、エラーもありません。predicate でトリプルを取得するにはどうすればよいMushroomToppingですか?

 TripleStore store = new TripleStore();
 store.LoadFromFile(@"C:\pizza.rdf");
 Object results = store.ExecuteQuery("PREFIX pizza:<http://example.org/> SELECT *  WHERE { ?X ?Y pizza:MushroomTopping  . }
 if (results is SparqlResultSet)
 {
   //Print out the Results
   //Console.WriteLine("working up to this ");
   SparqlResultSet rset = (SparqlResultSet)results;
   foreach (SparqlResult result in rset.Results)
   {
     Console.WriteLine(result.ToString());
   }
 }
4

2 に答える 2

3

SPARQL によるクエリのドキュメント、特に次のような一般的なエラーに関するセクションを参照してください。

クエリを作成する際の一般的なエラーは、通常、既定ではクエリがストア内の名前のない既定のグラフに対してのみ動作することです (クエリ プロセッサによって異なります)。したがって、クエリを実行しても、データが含まれるグラフや、データセットを正しく構成したかどうかによっては、結果が得られない場合があります。さまざまな種類のデータセットの構成に関する議論については、SPARQL データセット ページを参照してください。インメモリ SPARQL エンジンを使用しているときにクエリで何が起こっているかをデバッグする方法については、SPARQL クエリのデバッグを参照することもできます。

これの典型的な原因は、LoadFromFile() または LoadFromUri() を呼び出すと、ライブラリがデータ ソースに基づいてグラフに自動的に名前を割り当てるため、それをストア インスタンスに追加すると、デフォルト グラフではなく名前付きグラフになることです。これを解決する最も簡単な方法は、グラフ インスタンスを読み込んだ後、クエリを実行する前に、グラフ インスタンスの BaseUri プロパティを null に設定することです。

これはあなたのケースで何が起こっているかを正確に説明しているため、強調を追加しました。ロードされたグラフには、元のファイルに基づいて名前が付けられ、名前付きグラフにも名前が付けられ、ストアのデフォルト グラフは空のままになります。

ExecuteQuery()また、使用しているメソッドはこの問題のために非推奨であり、廃止されたメソッドの使用に関するコンパイラの警告が表示されることにも注意してください。このメソッドは将来のリリースで削除される可能性があるため、避ける必要があります。

これを修正するには 2 つの方法があります。まず、上記の引用されたドキュメントに記載されているように、グラフから名前を削除して、デフォルトのグラフとして扱うことができます。

Graph g = new Graph();
g.LoadFromFile(@"C:\pizza.rdf");
g.BaseUri = null;
store.Add(g);

あるいは、デフォルトとして使用されるグラフを直接制御できるクエリ プロセッサとデータセットを作成することで、非推奨の方法を完全に使用しないようにすることもできます。

Graph g = new Graph();
g.LoadFromFile(@"C:\pizza.rdf");
ISparqlDataset ds = new InMemoryDataset(g);
LeviathanQueryProcessor processor = new LeviathanQueryProcessor(ds);
Object results = processor.ProcessQuery("# Your query");
于 2015-05-28T08:27:58.047 に答える
0

RobV の回答は重要であり、最終的にそれに遭遇する可能性がありますが、最も可能性の高い問題は、クエリのプレフィックスが間違っていることだと思います。これはあなたのクエリです:

PREFIX pizza:<http://example.org/>
SELECT *  WHERE {
  ?X ?Y pizza:MushroomTopping .
}

ただし、データ内のいくつかのトリプルを見ると、たとえば次のことがわかります。

<http://www.co-ode.org/ontologies/pizza/pizza.owl#RocketTopping> <http://www.w3.org/2002/07/owl#disjointWith> <http://www.co-ode.org/ontologies/pizza/pizza.owl#MushroomTopping> .

ピザ:プレフィックスは、おそらく http://www.co-ode.org/ontologies/pizza/pizza.owl# にする必要があります。その変更を行うと、次のようなより意味のある結果が得られる可能性があります (ただし、これを Jena で実行したため、結果はおそらく少し異なるように見えます)。

prefix pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
select ?s ?p {
  ?s ?p pizza:MushroomTopping
}
-------------------------------------------------------------------------------
| s                      | p                                                  |
===============================================================================
| _:b0                   | <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> |
| pizza:CaperTopping     | <http://www.w3.org/2002/07/owl#disjointWith>       |
| pizza:PepperTopping    | <http://www.w3.org/2002/07/owl#disjointWith>       |
| _:b1                   | <http://www.w3.org/2002/07/owl#someValuesFrom>     |
| pizza:RocketTopping    | <http://www.w3.org/2002/07/owl#disjointWith>       |
| _:b2                   | <http://www.w3.org/2002/07/owl#someValuesFrom>     |
| _:b3                   | <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> |
| pizza:OnionTopping     | <http://www.w3.org/2002/07/owl#disjointWith>       |
| _:b4                   | <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> |
| _:b5                   | <http://www.w3.org/2002/07/owl#someValuesFrom>     |
| pizza:TomatoTopping    | <http://www.w3.org/2002/07/owl#disjointWith>       |
| pizza:GarlicTopping    | <http://www.w3.org/2002/07/owl#disjointWith>       |
| _:b6                   | <http://www.w3.org/2002/07/owl#someValuesFrom>     |
| _:b7                   | <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> |
| pizza:OliveTopping     | <http://www.w3.org/2002/07/owl#disjointWith>       |
| pizza:ArtichokeTopping | <http://www.w3.org/2002/07/owl#disjointWith>       |
-------------------------------------------------------------------------------

述語 MushroomTopping でトリプルを取得するにはどうすればよいですか?

RDF トリプルの形式は (主語、述語、目的語) であることに注意してください。SPARQL クエリを作成するときは、次のように記述します。

select ?subject ?predicate ?object where {
  ?subject ?predicate ?object
}

あなたが書いたクエリには、オブジェクトの位置にPizza:MushroomToppingがあります。幸いなことに、 pizza:MushroomToppingはプロパティではなく OWLクラスであるため、この場合はおそらくより理にかなっています。そのため、述語の位置に表示される可能性はほとんどありません。

于 2015-05-28T12:10:15.570 に答える