I-Scover

I-Scover（あいすかばー、IEICE Knowledge Discovery）は、2013年4月3日より公開された電子情報通信学会の文献検索システムである。I-Scoverは、電子情報通信学会が著作権を保有する論文誌や研究会などの文献のメタデータをはじめ、日本電信電話株式会社 (NTT)や日本電気株式会社 (NEC)、沖電気工業株式会社 (OKI)などの各社が発行する企業誌のメタデータが登録されている。I-Scoverは、メタデータをLinked Open Data (LOD)の形式で蓄積しており、一般的な検索システムの機能に加え、OpenSearch APIやSPARQL API (SPARQL Endpoint)の各機能を提供している。
概要.
I-Scoverは、キーワードや著者名、組織名などを検索フォームに入力して検索する一般的な検索システムの機能に加え、外部のアプリケーションからアクセス可能なOpenSearch APIとSPARQL API (SPARQL Endpoint)の2つのAPIを一般公開している。APIを利用することでI-Scoverの文献データベースに自由にアクセスでき、文献検索だけでなく研究動向や研究コミュニティなどの分析が可能となる。2017年9月1日現在、I-Scoverには24万件以上の文献をはじめ、27万人規模の著者、32万件規模の技術用語がLinked Open Data (LOD)の形式で登録されている。
I-Scoverの"I"はIEICEの"I"であるとともに、I（私）を意味しており、I-Scoverの発音がI discoverと聞こえることから名付けられたものである。
I-Scoverは、電子情報通信学会の登録商標である。
文献検索.
I-Scoverは、文献のタイトルやキーワード、概要、発行日などのメタデータをLinked Dataとして蓄積しており、1語のキーワードによる直観的な検索や、個々のメタデータを指定した詳細検索の機能を提供している。I-Scoverは、CiNii Articlesやなどの一般的な文献検索システムとは異なりメタデータが互いにリンクされているため、メタデータを辿ることで知識を横断するような文献検索が可能である。著者やキーワードなどのメタデータは、電子情報通信学会の事務局により名寄せが行われており、メタデータの質向上が図られている。
Linked Data.
Linked Dataは、Resource Description Framework (RDF)に基づき主語、述語、目的語の3つ組（Triple）で個々のリソース（メタデータ）を意味的にリンクし、メタデータを体系的に整理したデータである。オープンデータとして公開されたLinked DataをLinked Open Data (LOD)という。I-Scoverは、Linked Dataを一般公開していないが、OpenSearch APIやSPARQL APIを通じて得られるデータに関してはオープンデータとして取り扱うことができ、メタデータの二次利用によるアプリケーション開発、及び公開が可能である。
I-Scoverは、各種メタデータをArticle（文献）、Term（技術用語）、Person（著者）、Organization（組織）、Publication（出版物）、Event（イベント）の6つのクラスに分類して管理している。また、この他にデータ数は僅かであるが、Multimedia（マルチメディア）とOnlineService（オンラインサービス）の2つのクラスを定義してメタデータを管理している。
SPARQL.
SPARQLは、RDFクエリ言語の1つであり、Linked Dataのリソースを対象とした検索や分析が可能である。I-Scoverは、SPARQL APIを提供しており、文献メタデータを用いた高度な検索や分析を可能としている。
I-Scover SPARQL API: https://i-scover-api.ieice.org/iscover/api/sparql
例1. 文献数を取得.
select
 count(*)
where {
 ?articleIRI
 a iscover:Article.
例2. クラスとその使用回数を取得.
select
 ?object
 count(?object) as ?total
where {
 ?subject
 a ?object.
group by ?object
order by desc(?total)
例3. 述語の一覧を取得.
select
 ?predicate
where {
 ?subject
 ?predicate ?object.
group by ?predicate
order by asc(?predicate)
例4. 「センサネットワーク」と「消費電力」が概要文に含まれる最新の文献20件を取得.
select
 ?articleIRI
 ?title
where {
 ?articleIRI
 dcterms:title ?title;
 dcterms:abstract ?abstract;
 dcterms:issued ?date;
 a iscover:Article.
 filter(lang(?title) = "ja")
 filter(regex(?abstract, "センサネットワーク") = true
 && regex(?abstract, "消費電力") = true
order by desc(?date)
limit 20
例5. 文献の概要文から「センサネットワーク」の説明文を抽出.
select
 ?date
 ?description
where {
 values(?term) {
 ("センサネットワーク")
 ?articleIRI
 dcterms:abstract ?abstract;
 dcterms:issued ?date;
 a iscover:Article.
 filter(regex(?abstract, concat(?term, "は.+る．")) = true)
 bind(replace(?abstract, strBefore(?abstract, concat(?term, "は")), "") as ?tmp)
 bind(replace(?tmp, strAfter(?tmp, "．"), "") as ?description)
 bind("本(稿|論文|報告|研究|システム|アルゴリズム)|我々|機構|説明|提案|検討" as ?reject)
 filter(regex(?description, ?reject) = false)
order by desc(?date)
例6. 2012年から2016年において加熱した研究トピック（キーワード）を取得.
select
 ?keyword
 ?increasedRate
where {
 select
 ?p1TermIRI
 count(?p1TermIRI) as ?p1Total
 where {
 ?articleIRI
 dcterms:subject ?p1TermIRI;
 dcterms:issued ?date;
 a iscover:Article.
 bind(year(?date) as ?year)
 filter(?year = 2012)
 select
 ?p2TermIRI
 count(?p2TermIRI) as ?p2Total
 where {
 ?articleIRI
 dcterms:subject ?p2TermIRI;
 dcterms:issued ?date;
 a iscover:Article.
 bind(year(?date) as ?year)
 filter(?year = 2016)
 filter(?p1TermIRI = ?p2TermIRI)
 filter(?p1Total >= 3 && ?p2Total >= 3)
 bind((xsd:float(?p2Total) / ?p1Total) as ?increasedRate)
 ?p1TermIRI
 rdfs:label ?keyword;
 a iscover:Term.
 filter(lang(?keyword) = "ja")
 filter(?increasedRate >= 5.0)
order by desc(?increasedRate)
例7. 「IoT」と「ディープラーニング」の文献数推移を取得.
select
 ?keyword
 ?year
 count(?articleIRI) as ?total
where {
 select
 ?termIRI
 ?keyword
 where {
 values( ?keyword ) {
 ("IoT"@ja) ("ディープラーニング"@ja)
 ?termIRI
 rdfs:label ?keyword;
 a iscover:Term.
 ?articleIRI
 dcterms:subject ?termIRI;
 dcterms:issued ?date;
 a iscover:Article.
 bind(year(?date) as ?year)
order by asc(?keyword) asc(?year)
例8. 2014年における主要な研究トピック（キーワード）Top-100を取得.
select
 ?term
 ?total
where {
 select
 ?termIRI
 count(?termIRI) as ?total
 where {
 ?articleIRI
 dcterms:subject ?termIRI;
 dcterms:issued ?date;
 a iscover:Article.
 bind(year(?date) as ?year)
 filter(?year = 2014)
 group by ?termIRI
 order by desc(?total)
 limit 100
 
 optional {
 ?termIRI
 rdfs:label ?term;
 a iscover:Term.
 filter(lang(?term) = "ja")
 optional {
 ?termIRI
 rdfs:label ?term;
 a iscover:Term.
 filter(lang(?term) = "en")
order by desc(?total)
例9. 技術用語の共起頻度に基づいた日英・英日辞書.
select
 ?term
 if(?total > 5, ?transTerm, "(Insufficient data)") as ?transTerm
where {
 select
 ?term
 ?lang
 ?coTermIRI
 count(?coTermIRI) as ?total
 where {
 ?termIRI
 rdfs:label ?term;
 a iscover:Term.
 bind(lang(?term) as ?lang)
 ?articleIRI
 dcterms:subject ?termIRI;
 a iscover:Article.
 ?articleIRI
 dcterms:subject ?coTermIRI;
 a iscover:Article.
 order by desc(?total)
 limit 5
 
 ?coTermIRI
 rdfs:label ?transTerm;
 a iscover:Term.
 
 bind(if(?lang = "ja", "en", "ja") as ?target)
 filter(lang(?transTerm) = ?target)
order by desc(?total)
limit 1
例10. データマイニングの共起語を基準とした技術年表.
select
 ?coTerm
 min(?year) as ?startYear
 max(?year) as ?endYear
where {
 select
 ?coTermIRI
 count(?coTermIRI) as ?total
 where {
 
 ?termIRI
 rdfs:label ?term;
 a iscover:Term.
 
 ?articleIRI
 dcterms:subject ?termIRI;
 a iscover:Article.
 
 ?articleIRI
 dcterms:subject ?coTermIRI;
 dcterms:issued ?date;
 a iscover:Article.
 order by desc(?total)
 limit 20
 
 ?coTermIRI
 rdfs:label ?coTerm;
 a iscover:Term.
 filter(lang(?coTerm) = "ja")
 
 ?articleIRI
 dcterms:subject ?coTermIRI;
 dcterms:issued ?date;
 a iscover:Article.
 bind(year(?date) as ?year)
order by asc(?startYear)
例11. 任意のキーワードを起点とした共起語グラフ.
select
 ?source
 ?target
 ?weight
where {
 select
 ?source
 ?targetIRI
 count(?targetIRI) as ?weight
 where {
 values ?source {
 "ニューラルネットワーク"@ja
 "機械学習"@ja
 "画像処理"@ja
 
 ?termIRI
 rdfs:label ?source;
 a iscover:Term.
 
 ?articleIRI
 dcterms:subject ?termIRI;
 a iscover:Article.
 
 ?articleIRI
 dcterms:subject ?targetIRI;
 a iscover:Article.
 filter(?weight >= 5)
 
 ?targetIRI
 rdfs:label ?target;
 a iscover:Term.
 filter(lang(?target) = "ja")
 filter(?source != ?target)
order by asc(?source) desc(?weight)
例12. 任意の組織名を起点とした組織グラフ.
select
 ?source
 ?target
 ?weight
where {
 select
 ?source
 ?abbraviation
 ?targetIRI
 count(?organizationIRI) as ?weight
 where {
 values (?candidate ?abbraviation) {
 ("日本電信電話"@ja "NTT"@ja)
 ("日本電気"@ja "NEC"@ja)
 ("沖電気工業"@ja "OKI"@ja)
 
 ?organizationIRI
 rdfs:label ?source;
 a iscover:Organization.
 filter(lang(?source) = "ja")
 filter(regex(?source, ?candidate) = true
 || regex(?source, ?abbraviation) = true)
 
 ?articleIRI
 iscover:authorInfos/rdf:rest*/rdf:first/iscover:authorInfo [
 iscover:affiliation ?organizationIRI;
 dcterms:issued ?date;
 a iscover:Article.
 filter(2010 <= year(?date))
 
 ?articleIRI
 iscover:authorInfos/rdf:rest*/rdf:first/iscover:authorInfo [
 iscover:affiliation ?targetIRI;
 a iscover:Article.
 order by desc(?weight)
 
 filter(?weight >= 10)
 
 ?targetIRI
 rdfs:label ?target;
 a iscover:Organization.
 filter(lang(?target) = "ja")
 filter(?source != ?target && ?abbraviation != ?target)
order by asc(?source) desc(?weight)
例13. 任意の組織における研究開発の経歴.
select
 ?term
 ?startYear
 ?endYear
 ?duration
 ?total
where {
 select
 ?termIRI
 min(?year) as ?startYear
 max(?year) as ?endYear
 count(?termIRI) as ?total
 where {
 ?organizationIRI
 rdfs:label "沖電気工業　株式会社"@ja;
 a iscover:Organization.
 ?articleIRI
 iscover:authorInfos/rdf:rest*/rdf:first/iscover:authorInfo [
 iscover:affiliation ?organizationIRI;
 dcterms:subject ?termIRI;
 dcterms:issued ?date;
 a iscover:Article.
 bind(year(?date) as ?year)
 bind((?endYear - ?startYear + 1) as ?duration)
 ?termIRI
 rdfs:label ?term;
 a iscover:Term.
 filter(lang(?term) = "ja")
order by desc(?total) desc(?duration)