I-Scover
概要
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やIEEE Xploreなどの一般的な文献検索システムとは異なりメタデータが互いにリンクされているため、メタデータを辿ることで知識を横断するような文献検索が可能である。著者やキーワードなどのメタデータは、電子情報通信学会の事務局により名寄せが行われており、メタデータの質向上が図られている。
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 ?totalwhere {
    ?subject
    a ?object.}group by ?objectorder by desc(?total)
例3. 述語の一覧を取得
select
    ?predicatewhere {
    ?subject
    ?predicate ?object.}group by ?predicateorder by asc(?predicate)
例4. 「センサネットワーク」と「消費電力」が概要文に含まれる最新の文献20件を取得
select
    ?articleIRI
    ?titlewhere {
    ?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
    ?descriptionwhere {
    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
    ?increasedRatewhere {
    {
        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 ?totalwhere {
    {
        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
    ?totalwhere {
    {
        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 ?transTermwhere {
    {
        select
            ?term
            ?lang
            ?coTermIRI
            count(?coTermIRI) as ?total
        where {
            values(?term) { ("自然言語処理"@ja) }
            
            ?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 ?endYearwhere {
    {
        select
            ?coTermIRI
            count(?coTermIRI) as ?total
        where {
            values(?term) { ("データマイニング"@ja) }
            
            
            ?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
    ?weightwhere {
    {
        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
    ?weightwhere {
    {
        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)