web-dev-qa-db-ja.com

探索的SPARQLクエリ?

sQLの使用を開始するときはいつでも、何が利用可能で何がデータの形式を理解するために、データベースにいくつかの探索的ステートメントを投げる傾向があります。

例えば。

show tables

describe table

select * from table

sPARQLエンドポイントを使用してrdfデータストアの同様の探索を完了する方法を理解するのを手伝ってくれる人はいますか?

ありがとう:)

47
significance

まあ、明らかな最初のスタートは、データに存在するクラスとプロパティを見ることです。

使用されているクラスを確認する方法は次のとおりです。

SELECT DISTINCT ?class
WHERE {
  ?s a ?class .
}
LIMIT 25
OFFSET 0

LIMITOFFSETはページング用です。インターネット経由でクエリを送信する場合は特にこれらに慣れる価値があります。他の例では省略します。)

aは、rdf:type述語を表す特別なSPARQL(および Notation / Turtle )構文です。これは、個々のインスタンスをowl:Class/rdfs:Class型にリンクします(ほぼSQL RDBMSesのテーブル)。

次に、プロパティを確認します。これを行うには、検索したクラスを使用するか、プロパティを検索します。ストアからすべてのプロパティを取得しましょう:

SELECT DISTINCT ?property
WHERE {
  ?s ?property ?o .
}

これは、おそらく興味のないすべてのプロパティを取得します。これは、SQLのすべての行列のリストと同等ですが、テーブルによるグループ化はありません。

特定のクラスを宣言するインスタンスで使用されているプロパティを確認すると、さらに便利です。

SELECT DISTINCT ?property
WHERE {
  ?s a <http://xmlns.com/foaf/0.1/Person>;
     ?property ?o .
}

これにより、最初のトリプルを満たすインスタンス、つまりrdf:typehttp://xmlns.com/foaf/0.1/Personであるインスタンスで使用されるプロパティが返されます。

Rdf:Resourceは複数のrdf:typeプロパティ(可能であればクラス)を持つことができ、RDFのデータモデルは付加的であるため、ひし形の問題は発生しないことに注意してください。タイプは単なる別のプロパティです。人や犬、遺伝子、サッカーチームなど、いくつかのことを社会的に合意しただけです。これは、データストアに通常そのタイプに関連付けられているプロパティが含まれることを意味するものではありません。タイプは、リソースが持つ可能性のあるプロパティに関して何も保証しません。

データモデルと、SPARQLのUNIONおよびOPTIONAL構文の使用について理解する必要があります。 rdf:typeからSQLテーブルへの大まかなマッピングは、まさにそれです-大まかな。

プロパティが指しているエンティティの種類を知りたい場合があります。まず、おそらくデータ型のプロパティについて知りたいでしょう-リテラルやプリミティブと同等です。文字列、整数などです。RDFは、これらのリテラルをすべて文字列から継承するものとして定義します。SPARQLフィルターメソッドisLiteralを使用して、リテラルであるプロパティのみをフィルターで除外できます。

SELECT DISTINCT ?property
WHERE {
  ?s a <http://xmlns.com/foaf/0.1/Person>;
     ?property ?o .
  FILTER isLiteral(?o)
}

ここでは、オブジェクトとしてリテラル(文字列、日時、ブール値、またはその他のXSDデータ型の1つ)を持つプロパティのみを取得します。

しかし、非リテラルオブジェクトはどうですか?類推として、この非常に単純な疑似Javaクラス定義を考えてみます。

public class Person {
    int age;
    Person marriedTo;
}

上記のクエリを使用すると、年齢プロパティがバインドされている場合に年齢を表すリテラルが返されます。しかし、mariedToはプリミティブではありません(つまり、RDF terms)のリテラル)-別のオブジェクトへの参照です-RDF/OWL用語では、それはオブジェクトプロパティです。しかし、オブジェクトの種類はこれらのプロパティ(述語)によって参照されます。このクエリは、付随する型(?oの値がメンバーであるクラス)を持つプロパティを返します。

SELECT DISTINCT ?property, ?class
WHERE {
  ?s a <http://xmlns.com/foaf/0.1/Person>;
     ?property ?o .
  ?o a ?class .
  FILTER(!isLiteral(?o))
}

これで、特定のデータセットに慣れることができます。もちろん、いくつかの個別のリソースを引き出して検査することもお勧めします。 DESCRIBEクエリを使用してそれを行うことができます:

DESCRIBE <http://example.org/resource>

いくつかのSPARQLツール- [〜#〜] snorql [〜#〜] など-があり、ブラウザーでこれを実行できます。リンクしたSNORQLインスタンスには、可能な名前付きグラフを探索するためのサンプルクエリがありますが、ここでは取り上げていません。

SPARQLに慣れていない場合、正直なところ、行き詰まった場合の最良のリソースは仕様です。これはW3C仕様ですが、かなり良い仕様です(適切なテストスイートを作成したので、実装が適切に行ったかどうかを実際に確認できます)。複雑な言語を乗り越えることができれば、非常に役立ちます。

79
Tom Morris

次の一連の探索クエリが役立ちます。

クラスを見る:

select distinct ?type ?label 
where { 
    ?s a ?type . 
    OPTIONAL { ?type rdfs:label ?label } 
}

プロパティを見る:

select distinct ?objprop ?label 
where { 
    ?objprop a owl:ObjectProperty . 
    OPTIONAL { ?objprop rdfs:label ?label } 
}

データプロパティの表示:

select distinct ?dataprop ?label 
where { 
    ?dataprop a owl:DatatypeProperty . 
    OPTIONAL { ?dataprop rdfs:label ?label } 
}

実際に使用されているプロパティの確認:

select distinct ?p ?label 
where { 
    ?s ?p ?o . 
    OPTIONAL { ?p rdfs:label ?label } 
}

アサートされるエンティティを確認する:

select distinct ?entity ?elabel ?type ?tlabel 
where { 
    ?entity a ?type . 
    OPTIONAL { ?entity rdfs:label ?elabel } . 
    OPTIONAL { ?type rdfs:label ?tlabel } 
}

使用中の個別のグラフを見る:

select distinct ?g where { 
    graph ?g { 
        ?s ?p ?o 
    } 
}
7
lps
SELECT DISTINCT * WHERE {
  ?s ?p ?o
}
LIMIT 10
2
significance

私はよくこれを参照します voiDプロジェクトからのクエリのリスト 。それらは主に統計的な性質のものですが、それだけではありません。一部のステートメントからCOUNTを削除して実際の値を取得することは難しくありません。

1
Thomas Kappler