dogrunjp
2/5/2016 - 7:19 AM

VirtuosoにインポートしたRefex RDFから、gene reference idを引数にデータを取得するSPARQL及びラッパーアプリケーション。

VirtuosoにインポートしたRefex RDFから、gene reference idを引数にデータを取得するSPARQL及びラッパーアプリケーション。

from urllib.request import Request, urlopen
from urllib.parse import quote_plus
import sys
import json

argvs = sys.argv

q = argvs[1]

def getResult():
    ENDPOINT = "http://localhost:8890/sparql"
    sparql = " \
            PREFIX refex: <http://refex.dbcls.jp/entry/> \
            PREFIX refexo: <http://purl.jp/bio/01/refexo#> \
            PREFIX dcterms: <http://purl.org/dc/terms/>  \
            PREFIX rdfs:  <http://www.w3.org/2000/01/rdf-schema#> \
            SELECT ?refex ?sample_id ?organism ?expression_value \
            WHERE { \
            ?refex rdfs:seeAlso <http://www.ncbi.nlm.nih.gov/gene/%s> ; \
            refexo:refexSample ?sample ; \
            refexo:expValue ?expression_value . \
            ?sample dcterms:identifier ?sample_id ; \
            refexo:organism ?organism . \
            } LIMIT 500 \
    " % q

    # python3よりURLエンコードはurllib.quote.plus()
    sparql = quote_plus(sparql)
    req = Request(ENDPOINT + "?query=" + sparql)
    # レスポンスはデフォルトでXMLなので、
    # JSONでデータを取得したいときは以下のようにrequest headerにメディアタイプを指定
    req.add_header("Accept", "application/sparql-results+json")
    res = urlopen(req)
    result_str = res.read().decode('utf-8')
    result_dic = json.loads(result_str)

    print(result_dic["results"]["bindings"])

if __name__ == "__main__":
    getResult()

ローカルに起てたVirtuosoにReFexのttlをインポートして、以下のようにスクリプトを呼び、jsonデータを表示しています。少し追記してサービスをたててD3.jsからAPIを呼んでもいいし、ファイル保存してもいいと思う。

python3 rdfutils.py 11657

ただし、 たぶんsparqlが良く無いと思うのですが、JSONの中に同じ値のハッシュが4つづつ入ってます。。。こ の箇所は、正しいspqrqlを教えていただけたらと思います。。。