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やIEEE Xploreなどの一般的な文献検索システムとは異なりメタデータが互いにリンクされているため、メタデータを辿ることで知識を横断するような文献検索が可能である。著者やキーワードなどのメタデータは、電子情報通信学会の事務局により名寄せが行われており、メタデータの質向上が図られている。

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 {
            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 ?endYear
where {
    {
        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
    ?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)