3

おそらく、オントロジーの背後にある基本的な考え方を理解できないだけかもしれませんが、ここに私の質問があります。述語を指定して空の結果を取得する SPARQL クエリを使用して、RDF ストレージ (4store を使用しますが、XML ArmyKnife も試しました) からトリプルを抽出しようとしています。

RDF 構文を台無しにしないようにするために、LUBM で生成されたデータを使用します (サンプルに適したサイズに縮小されています)。

<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF
  xml:base = "http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl"
  xmlns:rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
  xmlns:owl="http://www.w3.org/2002/07/owl#"
  xmlns:ub="univ-bench.owl#"
>

<owl:DatatypeProperty rdf:ID="name">
  <rdfs:label>name</rdfs:label>
</owl:DatatypeProperty>

<owl:Class rdf:ID="Organization">
  <rdfs:label>organization</rdfs:label>
</owl:Class>

<owl:Class rdf:ID="University">
  <rdfs:label>university</rdfs:label>
  <rdfs:subClassOf rdf:resource="#Organization" />
</owl:Class>

<ub:University rdf:about="http://www.University0.edu">
   <ub:name>University0</ub:name>
</ub:University>

</rdf:RDF>

次に、クエリを実行して、インポート後にデータベースに実際に含まれるトリプルを確認します。

SELECT * WHERE {?s ?p ?o} ORDERBY ?s

結果は次のとおりです。

<http://www.University0.edu>    <univ-bench.owl#name>   "University0"
<http://www.University0.edu>    <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>       <univ-bench.owl#University>
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#Organization>         <http://www.w3.org/2000/01/rdf-schema#label>    "organization"
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#Organization>     <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>       <http://www.w3.org/2002/07/owl#Class>
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#University>       <http://www.w3.org/2000/01/rdf-schema#subClassOf>       <http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#Organization>
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#University>       <http://www.w3.org/2000/01/rdf-schema#label>    "university"
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#University>       <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>       <http://www.w3.org/2002/07/owl#Class>
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#name>     <http://www.w3.org/2000/01/rdf-schema#label>    "name"
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#name>     <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>       <http://www.w3.org/2002/07/owl#DatatypeProperty>

<univ-bench.owl#name>最初のトリプルの一部として述語があることがはっきりとわかります。

それにもかかわらず、次のクエリは結果を返しません。

SELECT * WHERE {?s <univ-bench.owl#name> ?o}

名前空間の有無にかかわらず、何十もの組み合わせを試しましたが、うまくいきません。明らかに存在する述語をRDFエンジンが見つけられない理由を誰か説明できますか?

ところで、OBJECT="University0" で同じトリプルを抽出しても問題ありません。

4

2 に答える 2

6

これは無効です:

xmlns:ub="univ-bench.owl#"

名前空間 URIは、RDF/XML では絶対でなければなりません。(Turtle などの他の構文では相対関係になる可能性がありますが、RDF/XML では関係ありません。)例が実際に LUBM によって直接生成された場合、LUBM は壊れています。これはうまくいくはずです:

xmlns:ub="http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#"

もちろん、@RobVが言ったように、SPARQLクエリでそのURIを一致させる必要があります。

于 2011-08-22T13:25:13.980 に答える
5

あなたの問題は、クエリで正しい URI に一致させようとしていないことだと思います。

SELECT * WHERE {?s <univ-bench.owl#name> ?o}

山括弧で囲まれたものはすべてURIとして扱われ、相対URIを使用したため、SPARQLプロセッサはおそらく任意のベースに対してそれを解決し、データ内のものとは異なる絶対URIになるため、クエリは何にも一致しません.

あなたがする必要があるのは、次のように完全な URI を指定することです。

SELECT * WHERE {?s <http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#name> ?o}

または、次のようなプレフィックスを使用します。

PREFIX ub: <univ-bench.owl#>
SELECT * WHERE { ?s ub:name ?o }

これらのいずれも機能しない場合は、相対 URI に問題があると思われます。私のアドバイスは、相対 URI は決して使用せず、可能な限り常に絶対 URI を使用することです。相対 URI を使用する必要がある場合は、常にベース URI を明示的に指定します。つまり、データが絶対 URI を使用していることを確認し、それをストアにリロードして再試行してください。

これはxml:base="http://example.org"、RDF/XML またはBASE <http://example.org/>SPARQL で行うことができます。4store を使用している場合、インポーターのコマンド ラインには、何も指定されていない場合のデフォルトのベース URI を設定するために使用できる引数があると思います。

他にやりたいことは、データを別のトリプル ストアに入れてみて、同じ動作が発生するかどうかを確認することです。もしそうなら、これは、私が提案したように、相対 URI と絶対 URI に問題があることを意味します。他のストアがクエリにうまく答えた場合、4store のバグの可能性が示唆されます。その場合は、メーリング リストでそれらに連絡する必要があります - http://groups.google.com/group/4store-support

于 2011-08-22T10:15:44.010 に答える