I-Scover SPARQL例

サンプルトリプルの取得

SELECT * {?s ?p ?o} LIMIT 20

SPARQL結果

サンプルの取得

SELECT * WHERE {<http://i-scover10.ieice.org/iscover/resource/ARTICLE_SOCIETY_JOURNAL_BPLUS_6_3_240> ?p ?o}

SPARQL結果

トリプル数、サブジェクト数、述語数、オブジェクト数

 	SELECT  
		(count(*) AS ?ntriples) 
		(count(distinct ?s) AS ?nsubjs)
		(count(distinct ?p) AS ?npreds)
		(count(distinct ?o) AS ?nobjs) 
	WHERE { ?s ?p ?o}

SPARQL結果

クラス一覧の取得(DISTINCTによる)

   SELECT DISTINCT ?class (COUNT(?class) AS ?count)  
	WHERE {?s a ?class} ORDER BY DESC(?count)

SPARQL結果

クラス一覧の取得(グループ化による)

   SELECT ?class (COUNT(?s) AS ?count)  
	WHERE {?s a ?class} GROUP BY ?class 
	ORDER BY DESC(?count)

SPARQL結果

クラスを指定したサンプル取得(単純版)

   SELECT * WHERE {?s a iscover:Article; ?p ?o } LIMIT 100

SPARQL結果

クラスを指定したサンプル取得(入れ子版)

 SELECT * WHERE {
    {SELECT ?s WHERE {?s a iscover:Article; ?p ?o } LIMIT 1}
   ?s ?p ?o }

SPARQL結果

FILTERで絞り込み

2005年4月1日〜2006年3月31日に絞り込む

 SELECT (count(*) AS ?count) WHERE {
   ?s a iscover:Article ; 
       dcterms:issued ?date .
   FILTER (?date > xsd:date("2005-04-01") 
         &&?date <= xsd:date("2006-03-31"))
}

SPARQL結果

特定の要件の設定

2005年4月1日〜2006年3月31日あるいは2006年4月1日〜20067年3月31日にマッチするもの

 SELECT  ?fyear (count(?s) as ?count) WHERE {
VALUES (?start ?end ?fyear) {
	("2005-04-01" "2006-03-31" "2005年度")
	("2006-04-01" "2007-03-31" "2006年度")
}
   ?s a iscover:Article ;
   dcterms:issued ?date.
   FILTER (?date > xsd:date(?start) && ?date<= xsd:date(?end))
}

SPARQL結果

GROUPINGによる集計

年ごとの集計

 SELECT ?year (count(?s) AS ?count) WHERE {
   ?s a iscover:Article ; 
       dcterms:issued ?date .
   BIND(year(?date) AS ?year)
} GROUP BY ?year ORDER BY ?year

SPARQL結果

IF文を使っての年度の設定

  • year関数とmonth関数によるyear, monthの取得
  • monthの値によりyearないしyear-1 をfyearに設定
  • fyear によるグルーピング
 SELECT ?fyear (count(?s) AS ?count) WHERE {
   ?s a iscover:Article ; 
       dcterms:issued ?date .
   BIND(year(?date) AS ?year)  
   BIND(month(?date) AS ?month)
   BIND(IF(?month > 3, ?year, ?year-1) AS ?fyear)
} GROUP BY ?fyear ORDER BY ?fyear

SPARQL結果

5年ごとの集計

  • 5年単位で一つの値になるようにする
 SELECT 
  CONCAT(?fyear5*5, "~", ?fyear5*5+4) 
  (count(?s) AS ?count) WHERE {
   ?s a iscover:Article ; 
       dcterms:issued ?date .
   BIND(year(?date) AS ?year)  
   BIND(month(?date) AS ?month)
   BIND(IF(?month > 3, ?year/5, (?year-1)/5) AS ?fyear5)
} GROUP BY ?fyear5 ORDER BY ?fyear5

SPARQL結果

文献の構造の確認

  • Articleの第一レベル
 SELECT * WHERE {
    {SELECT?article WHERE{?article a iscover:Article} LIMIT 1}
    ?article ?p ?o
             }

SPARQL結果

  • Articleのiscover:authorInfosの先
 SELECT  * WHERE {
    {select ?article {?article a iscover:Article} limit 1}
     ?article iscover:authorInfos [?p ?o] }

SPARQL結果

  • rdf:first, rdf:rest の先の構造を確認
 SELECT  ?fp ?fo WHERE {
    {select ?article {?article a iscover:Article} limit 1}
     ?article iscover:authorInfos/rdf:first [?fp ?fo]}

SPARQL結果

 

 SELECT  ?rp ?ro WHERE {
    {select ?article {?article a iscover:Article} limit 1}
     ?article iscover:authorInfos/rdf:rest [?rp ?ro]}

SPARQL結果


文献の著者

  • 筆頭著者
SELECT  * WHERE {
    {select ?article {?article a iscover:Article} limit 1}
     ?article iscover:authorInfos [rdf:first [iscover:authorInfo [iscover:author ?o]]]
}

SPARQL結果

  • 第2著者
SELECT  * WHERE {
    {select ?article {?article a iscover:Article} limit 1}
     ?article iscover:authorInfos [rdf:rest [rdf:first [iscover:authorInfo [iscover:author ?o]]]]
}

SPARQL結果

全著者

  • 全著者:0以上のrdf:restの後にrdf:firstがある
 SELECT  * WHERE {
    {select ?article {?article a iscover:Article} limit 1}
     ?article iscover:authorInfos/rdf:rest*/rdf:first/iscover:authorInfo/iscover:author ?o}

SPARQL結果

最終著者

  • 全著者:0以上のrdf:restの後にrdf:firstがある
 SELECT  * WHERE {
    {select ?article {?article a iscover:Article} limit 1}
     ?article iscover:authorInfos/rdf:rest*/rdf:first/iscover:authorInfo/iscover:author ?o}

SPARQL結果

共著者数

  • 全著者を取り出して文献単位でカウントすれば良い。なお、著者は人物自身のノードまで辿る必要はない。
 SELECT  ?article (count(?authornode) as ?count)
 WHERE {
    {select ?article {?article a iscover:Article} limit 10}
     ?article iscover:authorInfos/rdf:rest*/rdf:first 
               ?authornode
} GROUP BY ?article

SPARQL結果

著者ごとにスコアを割り振って集計

  • 著者数nの論文には1/nを与えて著者ごとの論文数スコアを求める
 SELECT ?author (SUM(?score) AS ?sum) where {
  {select ?article {?article a iscover:Article} limit 10}
  ?article iscover:authorInfos/rdf:rest*/rdf:first/iscover:authorInfo/iscover:author ?author
{SELECT  ?article (1.0/count(?author) AS ?score) WHERE {
  ?article iscover:authorInfos/rdf:rest*/rdf:first/iscover:authorInfo/iscover:author ?author
} GROUP BY ?article}
} GROUP BY ?author 
ORDER BY DESC(?sum)

SPARQL結果

名前での表示

  • 人物ではfoaf:nameの先に名称がある
  • 日本語名と英語名を持っているとそれぞれが出てくる
SELECT ?name ?sum WHERE {
{SELECT ?author (SUM(?score) AS ?sum) where {
  {select ?article {?article a iscover:Article} limit 10}
  ?article iscover:authorInfos/rdf:rest*/rdf:first/iscover:authorInfo/iscover:author ?author
{SELECT  ?article (1.0/count(?author) AS ?score) WHERE {
  ?article iscover:authorInfos/rdf:rest*/rdf:first/iscover:authorInfo/iscover:author ?author
} GROUP BY ?article}
} GROUP BY ?author 
ORDER BY DESC(?sum)}
?author foaf:name ?name }  ORDER BY DESC(?sum)

SPARQL結果

名前表示の優先順位

  • 日本語名と英語名を分けて取り出し、日本語名を優先して表示する
    • langMatches で言語ごとにフィルタリング
    • 存在しない場合に備えてOPTIONALにする
    • 優先順位を与えるにはCOALESCEを使う
SELECT (COALESCE(?jname, ?ename) AS ?name) ?sum WHERE {
{SELECT ?author (SUM(?score) AS ?sum) where {
  {select ?article {?article a iscover:Article} limit 10}
  ?article iscover:authorInfos/rdf:rest*/rdf:first/iscover:authorInfo/iscover:author ?author
{SELECT  ?article (1.0/count(?author) AS ?score) WHERE {
  ?article iscover:authorInfos/rdf:rest*/rdf:first/iscover:authorInfo/iscover:author ?author
} GROUP BY ?article}
} GROUP BY ?author 
ORDER BY DESC(?sum)}
OPTIONAL{?author foaf:name ?jname FILTER (LangMatches(lang(?jname), "ja"))}
    OPTIONAL{?author foaf:name ?ename FILTER (LangMatches(lang(?ename), "en"))} 
}  ORDER BY DESC(?sum)

SPARQL結果

文献キーワード

  • URIで求める
SELECT  ?kw (count(?kw) AS ?count) WHERE {
     [] a iscover:Article;
                dcterms:subject ?kw
} GROUP BY ?kw ORDER BY DESC(?count) LIMIT 300

SPARQL結果

  • ラベルのサンプルを与える
 SELECT  SAMPLE(?label) (count(?kw) AS ?count) WHERE {
     [] a iscover:Article; dcterms:subject ?kw .
     ?kw skos:prefLabel ?label .
} GROUP BY ?kw ORDER BY DESC(?count) LIMIT 300

SPARQL結果

被引用文献数

  • dcterms:reference/cito:citesが参考文献のI-Scover URIを与える
  • I-Scover内で参考文献リンクを持つものに限っての数である
SELECT ?article (count(?article) as ?nrefer) WHERE {
   ?article a iscover:Article .
   ?referrer dcterms:reference/cito:cites ?article
    } group by ?article order by desc(?nrefer) limit 100

SPARQL結果

文字列処理

  • 要約に文字列”Linked Data”を含む文献
SELECT * WHERE {
   ?article a iscover:Article;  dcterms:abstract ?abstract.
    FILTER(CONTAINS(?abstract, "Linked Data"))
    } limit 10

SPARQL結果

データ整備

  • 名前に#を含む
SELECT * WHERE {
   ?person a iscover:Person; foaf:name ?name.
    FILTER(CONTAINS(?name, "#"))
    }

SPARQL結果

否定

  • vcard:org を持たないPerson
 SELECT * WHERE {
?person a iscover:Person; foaf:name ?name 
MINUS {?person vcard:org ?org} 
} limit 100

SPARQL結果

同姓同名

  • vcard:orgを持たないPersonと同姓同名の所属先
 SELECT sample(?name) ?person sample(?org2)  ?person2 WHERE {
?person a iscover:Person; foaf:name ?name 
MINUS {?person vcard:org ?org} 
?person2 a iscover:Person; foaf:name ?name; vcard:org/foaf:name ?org2
} group by ?person ?person2 order by ?person limit 100

SPARQL結果

Named Graph

  • 3つ組の集合を区別したいという要求
    • 例) データソースの違いや権利関係の違いなど
  • Triple(3つ組)ではなくQuad(4つ組)で表現される
 SELECT DISTINCT ?g WHERE {
   GRAPH ?g {?s ?p ?o} }
  • 現在のI-Scoverは、内部データを除いて一つのNamed Graph

SPARQL結果


Federated クエリ

  • SERVICE句: 他のSPARQLエンドポイントを指定してクエリを実行。
  • 利用できるエンドポイントが限られる
  • 例)紫綬褒章を受賞している(同姓同名の)会員(未チェック[空白問題がある])
SELECT * WHERE {
    SERVICE <http://ja.dbpedia.org/sparql> {
[] dcterms:subject  <http://ja.dbpedia.org/resource/Category:紫綬褒章受章者>;  foaf:name ?name }
    ?s a iscover:Person; foaf:name ?name}
  • I-ScoverはFederatedクエリの実行を許可していない。