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