SPARQL Endpointを目の前にしたときに、いったい何を問合せたらいいのだろう?という場合に使えるSPARQLをまとめてみました。
とりあえずトリプルが何件入ってるか知りたい
SELECT count(*) WHERE { ?s ?p ?o }
とりあえずどんなデータが入っているか見たい
SELECT * WHERE { GRAPH ?g { ?s ?p ?o }} LIMIT 500
グラフ毎の件数を集計して見たい
SELECT ?g count(?g) WHERE {GRAPH ?g {?s ?p ?o}} GROUP BY ?g
あるグラフ配下のデータだけを見たい(何のグラフがあるかは一つ上↑のSPAQLで)
SELECT * WHERE { GRAPH <あるグラフ> {?s ?p ?o }}
aomoriが含まれるデータを探したい(主語から探す)
SELECT * { GRAPH ?g { ?s ?p ?o . FILTER( contains(str(?s),'aomori') ) }}
titleが含まれるデータを探したい(述語から探す)
SELECT * { GRAPH ?g { ?s ?p ?o . FILTER( contains(str(?p),'title') ) }}
青森県が含まれるデータを探したい(目的語から探す)
SELECT * { GRAPH ?g { ?s ?p ?o . FILTER( contains(str(?o),'青森県') ) }}
グラフ完全一致でデータを探す
SELECT * { GRAPH <グラフ> {?s ?p ?o}}
主語完全一致でデータを探す
SELECT * { GRAPH ?g {<主語> ?p ?o}}
述語完全一致でデータを探す
SELECT * { GRAPH ?g {?s <述語> ?o}}
目的語完全一致でデータを探す
SELECT * { GRAPH ?g {?s ?p '目的語'}}
目的語完全一致でデータを探す(言語指定あり)
SELECT * { GRAPH ?g {?s ?p '目的語'@ja}}
以下のサイトでなどでお試しできます。(負荷にご注意)
DBpedia - SPARQL Endpoint
DBpedia japanese - SPARQL Endpoint
↓2014/8/6追加
述語の種類を列挙する。どんな述語(?p)があるのか。
SELECT DISTINCT ?p {?s ?p ?o} ORDER BY ?p
LEFT JOINみたいなことをする。 下記例ではtitleにtelとaddressを連結。
SELECT * {
GRAPH ?g {?s <title> ?title}
.OPTIONAL {?s <tel> ?tel}
.OPTIONAL {?s <address> ?address}
}
↓2014/10/22追加
GROUP CONCATする。1レコード中に複数出現する項目(tag)を1つにまとめて1レコードに。
SELECT ?title GROUP_CONCAT(?tag ; separator=' ') AS ?tags
{
?url <title> ?title
.?url <tag> ?tag
}
LIMIT 100
複数のGRAPHを指定してSELECTする。
SELECT *
FROM <GRAPH_SONO_1>
FROM <GRAPH_SONO_2>
FROM <GRAPH_SONO_3>
{ ?s ?p ?o }
LIMIT 100