PAGE TOP


DBpediaの利用 (SPARQL)

2017年3月21日PHP

Wikipediaをスクレイピングしようと思い、curlでいろいろ取得しようと思ったのですが、その前に、そういえば、DBpediaより、SPARQLクエリを使って、データを取得するやり方があったなと思い。使ってみることにしました。ネットで検索すると、クエリの書き方がいろいろでてきますが、まだまだ不明点が多く、自分が出力したいような書き方はわからず、このあたりも、書籍でも購入して、さらりと知識でも蓄えておこうかと思います。いろいろ出力できてしまうので、これまで、他のサイトで、疑問に感じていた箇所で、特にどこのAPIデータを持ってきているのだろうなどと考えていたことが、なるほど! これを利用していたのかと納得。とりあえず、今のところは、SEO対策の一つとして、Goolgeのローカル検索結果に対応するために、利用しようかと思います。

下記は、とりあえず、都道府県名から、情報を取得することと、隣接している都道府県を取得することにしました。
一つ目の関数の$query の部分にSPARQLクエリが代入されており、WHEREの部分を使いすることで、要素を取得することができます。今回は、abstractとleaderNameだけ取得してみました。また、2つ目の関数では、隣接している都道府県を取得しています。

<?php
$js_p = '福井県';

    function getinfo_p($arg){
        $format = 'json'; 
        $query = "
        
        PREFIX dbpedia: <http://ja.dbpedia.org/resource/>   
        PREFIX dbp-­owl: <http://dbpedia.org/ontology/>
        SELECT   *     
        WHERE    {
         dbpedia:$arg dbp-­owl:abstract ?abstract .
         dbpedia:$arg dbp-­owl:leaderName ?leaderName .
        }
        ";

        $searchUrl = 'http://ja.dbpedia.org/sparql?'
        .'query='.urlencode($query)
        .'&format='.$format;

        return $searchUrl;
    }



    function getinfo_next($arg){
        $format = 'json'; 
        $query = "

        SELECT DISTINCT ?rinsetsu_label 
        WHERE { 
          ?tokyo_uri prop-ja:隣接都道府県 ?rinsetsu_uri . 
          ?tokyo_uri rdfs:label ?tokyo_label. 
          FILTER regex(?tokyo_uri , '". $arg ."') 
          ?rinsetsu_uri rdfs:label ?rinsetsu_label. 
        }
        ";

        $searchUrl = 'http://ja.dbpedia.org/sparql?'
        .'query='.urlencode($query)
        .'&format='.$format;

        return $searchUrl;
    }


    function request($url){
        if (!function_exists('curl_init')){
            die('CURL is not installed!');
        }
        $ch= curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($ch);

        curl_close($ch);

        return $response;
    }




if(!empty($js_p)){
        $pre[0] = getinfo_p($js_p);
        $info[0] = json_decode(request($pre[0]), true);
        
        $next[1] = getinfo_next($js_p);
        $info[1] = json_decode(request($next[1]), true);

        
        echo "<pre>";
        print_r($info);
        echo "</pre>";
}




?>


・出力結果

Array
(
[0] => Array
(
[head] => Array
(
[link] => Array
(
)

[vars] => Array
(
[0] => abstract
[1] => leaderName
)

)

[results] => Array
(
[distinct] =>
[ordered] => 1
[bindings] => Array
(
[0] => Array
(
[abstract] => Array
(
[type] => literal
=> ja
[value] => 福井県(ふくいけん)は、日本海や若狭湾に面する、日本の県の一つである。県庁所在地は福井市。
)

[leaderName] => Array
(
[type] => uri
[value] => http://ja.dbpedia.org/resource/西川一誠
)

)

)

)

)

[1] => Array
(
[head] => Array
(
[link] => Array
(
)

[vars] => Array
(
[0] => rinsetsu_label
)

)

[results] => Array
(
[distinct] =>
[ordered] => 1
[bindings] => Array
(
[0] => Array
(
[rinsetsu_label] => Array
(
[type] => literal
=> ja
[value] => 岐阜県
)

)

[1] => Array
(
[rinsetsu_label] => Array
(
[type] => literal
=> ja
[value] => 滋賀県
)

)

[2] => Array
(
[rinsetsu_label] => Array
(
[type] => literal
=> ja
[value] => 石川県
)

)

[3] => Array
(
[rinsetsu_label] => Array
(
[type] => literal
=> ja
[value] => 京都府
)

)

)

)

)

)