6

オントロジーのすべてのクラスを取得したい。これは、Protege によって作成された RDF/XML 形式のオントロジー ファイルの一部です。

<!-- http://www.w3.org/2002/07/owl#aqua -->

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

<!-- http://www.w3.org/2002/07/owl#varioPerfect -->

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

Protege で適切に動作するこのクエリを作成しましたが、dotNetRDF で使用すると、名前だけでなく、クラスの完全な URI が返されます。

 public string[] ontologysearch()
{
    List<string> list = new List<string>();
    TripleStore store = new TripleStore();
    Graph mygraph = new Graph();
    mygraph.LoadFromFile("D:/msc/search-engine/project/catalogXML.owl");


      store.Add(mygraph);


      string sparqlQuery1 = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"
          + "PREFIX owl: <http://www.w3.org/2002/07/owl#>"
          + "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>"
          + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"
          + "SELECT distinct ?cls1"
          + " WHERE{"
          + "  ?cls1 a owl:Class .}";

      SparqlQueryParser sparqlParser = new SparqlQueryParser();
      SparqlQuery query = sparqlParser.ParseFromString(sparqlQuery1);
      InMemoryDataset ds = new InMemoryDataset(mygraph);

      //Get the Query processor
      ISparqlQueryProcessor processor = new LeviathanQueryProcessor(ds);
      Object results = processor.ProcessQuery(query);
      if (results is SparqlResultSet)
      {
          SparqlResultSet r = results as SparqlResultSet;

          foreach (SparqlResult res in r)
          {

              list.Add(res["cls1"].ToString());
          }
      }

      return list.ToArray();

}

期待した結果は「aqua」でしたが、実際には「http://www.w3.org/2002/07/owl#aqua」です。なぜこれが起こるのですか?代わりに名前を取得するにはどうすればよいですか?

4

1 に答える 1

9

RDF および OWL の非匿名リソースは、IRI によって識別されます。あなたのオントロジーは、 http://www.w3.org/2002/07/owl#aqua がクラスであることを明確に示しています。あなたがクラスを求めるなら、それはあなたが得るべきものです. Protegeが結果を表示するときに http://www.w3.org/2002/07/owl# の部分を取り除いている可能性がありますが、結果は実際には IRI のままです。

注: IRI が標準の OWL 名前空間で始まる新しいクラスを定義するべきではありません。通常、オントロジー IRI に関連する独自のプレフィックスを定義する必要があります。

結果として文字列「aqua」を取得したいだけの場合は、2 つのオプションがあります。最初の (そして推奨される) 方法は、クラスのrdfs:labelがある場合はそれを取得することです。これは、クラスの文字列名である必要があります。何らかの理由でそれが機能しない場合は、URI の文字列値を取得して、プレフィックスの文字列値を取り除くことができます。DBpedia SPARQL エンドポイントでの両方のアプローチの例を次に示します。

select ?class ?label where {
  ?class a owl:Class ; rdfs:label ?label
  filter langMatches(lang(?label),'en')
}
limit 10

SPARQL の結果 (rdfs:label 付き)

select ?class ?name where {
  ?class a owl:Class
  bind(strafter(str(?class),str(dbpedia-owl:)) as ?name)
}
limit 10

SPARQL の結果 (プレフィックスを削除)

表示目的で URI のプレフィックスを削除することは、URI が人間が読める形式であると想定しているため、一般に推奨される方法ではありません。DBPedia の場合、たまたま機能しますが、多くのデータセットには、人間が読める名前ではなく、内部コードを持つ URI があります。したがって、rdfs:label(人が読めるリソースの表現として明示的に定義されている) が利用可能な場合は、常にそれを使用するようにしてください。

于 2015-02-12T15:43:57.477 に答える