Hatena::Grouplifesciencedb

ゲノム周辺 このページをアンテナに追加 RSSフィード

2009-10-21

第3章、第4章、第5章

|  第3章、第4章、第5章 - ゲノム周辺 を含むブックマーク はてなブックマーク -  第3章、第4章、第5章 - ゲノム周辺  第3章、第4章、第5章 - ゲノム周辺 のブックマークコメント

http://lifesciencedb.g.hatena.ne.jp/nakao_mitsuteru/20091013/progsemweb の第二回目の資料です。

Part I. Chapter 3 セマンティックデータを使用する

簡単な問い合わせ言語
  • トリプルの spo がそれぞれ独立にあつかわれている
    • cities (s), inside (p), California (o)
    • city (s), mayor (p), Someonw (o)
  • それらを関連してあつかう

変数束縛

("San_Francisco_Californai", "inside", "California")
("San_Francisco_Californai", "mayor", "Gavin Newson")
    • 『ID』 はエンティティの『名前』ではない。
  • Chapter 2 でのクエリ形式
(None, "inside", "Carifolnia")
("?city", "inside", "Carifolnia")
    • 返り値:クエリの帰り値は "?city" をキーとしたディクショナリ
[{"?city": "San_Francisco_California"}, {"?city": "San_Jose_Carifornia"}]

("?city", "inside", "California")
("?city", "mayor", "Gavin Newson")
    • 返り値
[{"?city": "San_Jose_California"}]
("?city", "inside", "California")
("?city", "mayor", "?name_of_mayor")
    • 返り値:
[{"?city": "San_Francisco_California", "?name_of_mayor": "Gavin Nwesom"},
 {"?city": "San_Jose_California", "?name_of_mayor": "Norman Mineta"}]
  • これはSPARQLの変数束縛の形式とおなじ。

問い合わせ言語の実装

bg.query([('?company',      "headquarters", "New_York_NY"),
          ('?campany',      "industry",     "Investment Banking"),
          ('?campany',      "contributor",  '?contribution'),
          ('?contribution', "recipient",    "Orrin Hatch"),
          ('?contribution', "amount",       '?dollars')])
  1. campany はニューヨークに本部がある
  2. campany は投資銀行を業務にしている
  3. campany は contribution という名前の出資をしている
  4. contribution の受取人は "Orrin Hatch" である
  5. contribution の総計は dollars である
  • こんな返り値にしたい
[{'campany': 'BSC', 'contribution': u'contrib285', 'dollars': u'30700.0'}]
  • デモ
from simplegraph import SimpleGraph
bg = SimpleGraph()
bg.load('../chapter2/business_triples.csv')
bg.query([('?company',      "headquarters", "New_York_New_York"),
          ('?company',      "industry",     "Investment Banking"),
          ('?contribution',      "contributor",  '?company'),
          ('?contribution', "recipient",    "Orrin Hatch"),
          ('?contribution', "amount",       '?dollars')])
  • 映画のデータでのクエリ例:リドリースコットの監督映画とジュージルーカスの監督映画の両方に出演しているアクターはだれ?
graph.query(['?actor', "starring", ?movie
フィードフォワード推論
  • シンプル、決定論的
    • とある石の質量が1kg、ならば、おなじ石は2.2ポンドであると推論する。
    • (1kg と 2.2ポンドがおなじ質量である)
  • ルールベース
  • 分類
  • 判断
    • 6フィート以上の身長の人ならば、背の高い人と推論する。
    • (背の高い人の定義が外部にある)
  • オンラインサービス
    • レストランのアドレスを知っているならば、地図上の座標をジオコーダーで検索できる。
    • (住所と座標が交換できる)
  • ルールで
  • このセクションではルールベースの推論の例と既存のトリプルから新しいトリプルの推定の例を示す

あたらしいトリプルを推論する

  • 推論の簡単なパターンとして、クエリのマッチをあたらしいトリプルとしてトリプルストアに加える
    • トリプルストアに元のデータとクエリの結果が一体となっている
    • すると、クエリ結果への問い合わせもクエリになる
  • def applyinference(self, rule):
  • class InferenceRule:
    • def getqueries(self):
    • def maketriples(self, binding):
  • class WestCoastRule(InterenceRule):
    • def getqueries(self):
    • def _maketriples(self, campany):
  • 西海岸企業のトリプル(subject, "on_coast", "west_coast")をルール(subject, "headquartered", "San_Francisco_California")から推定し、トリプルストアに追加する
from inferencerule import *
wcr = WestCoastRule()
bg.applyinference(wcr)
list(bg.triples((None, "on_coast", None)))
#


ジオコーディング

from simplegraph import *
from inferencerule import *
geograph = SimpleGraph()
georule = GeocodeRule()
geograph.add(('White House', 'address', '1600 Pennsylvania Ave, Washington, DC'))
list(geograph.triples((None, None, None)))
#
geograph.applyinference(georule)
list(geograph.triples((None, None, None)))
#

ルールの連鎖

  • このような推論があたらしいトリプルをトリプルストアに加えるのはとても便利である
    • すべてのルールを明確に調整することなしにルールの結果にルールを適用できる。
  • 二つの住所の座標から距離を計算し、(1マイル以内の)近くにあるかという推定をするルール
    • ($place, 'close_to', object) トリプルをトリプルストアに加える
    • class CloseToRule(InferenceRule):
      • def __init__(self, place, graph):
      • def getqueries(self):
      • def _maketripels(self, place, lat, long):
    • デモ
from simplegraph import *
from inferencerule import *
pg = SimpleGraph()
pg.load('DC_addresses.csv')
georule = GeocodeRule()
pg.applyinference(georule)
#
whrule = CloseToRule('White House', pg)
pg.applyinference(whrule)
list(pg.triples((None, 'close_to', None)))
#
  • もう一つのルールを連鎖させる
  • 旅行者向けの施設(Turist Attraction)から一マイル以内にある安い(cheap)レストラン(restaurant)を推論するルール
    • class TouristyRule(InferenceRule):
      • def getqueries(self):
      • def _maketriples(self, ta, restaurant):
    • デモ
tr = TouristyRule()
pg.applyinference(tr)
list(pg.triples((None, 'is_a', 'touristy restaurant')))
#
  • これらのルールは一連の依存した関数にみえるのがフツーのデータ処理の考え方
  • 重要なのは、ルールはまったく独立していて、実現できること
  • 図3−2
    • ルールの連鎖ビュー
    • 'address' -> GecodeRule -> (s, 'longitude', o), (s, 'latitude', o)
    • 'longitude', 'latitude' -> CloseToRule -> (s, 'close_to', o)
    • 'close_to', 'is_a', 'cost' -> TuristyRule -> (s, 'is_a', 'turisty restaurant')
    1. 地理的な異常なものは緯度や経度をもつが住所を持たない。それらはトリプルストアに正しく格納でき、GeocodeRuleによって扱われなくてもCloseToRuleによって発見できる
    2. レストランの存在をはじめに知るだろうけどそのコストは知らない場合を考える。GeocodeRule はレストランをgeocodeできるし、CloseToRuleは近いレストランを推定できるけど、TouristyRule はレストランについてなにもできない。しかし、あとでコストがわかったときに、TouristyRule だけを実行すればよい。
  • 図3−3
    • マルチエージェント黒板
    • プログラミングについて効率を犠牲にしているが、分離性、分散の容易さ、誤りへの寛容性、柔軟性について利点がある

人工知能』という言葉

  • このような記号論理の連鎖から知能はでてこない。
  • 昔の人はまちがって、このような記号論理だけから知的な振る舞いを生成しようとしていた。

連結を探索する
  • グラフデータをあつかうときの一般的な質問:二つのエントリが接続しているか?
  • グラフアルゴリズム幅優先探索(breadth-first search)でshortest pathを探索をする

ケビンベーコンの六次

  • 幅優先探索で探索できる
    • Start (actor)
    • First movie step
    • First actor step
    • Second movie step
    • Second actor step
    • ...
共有キーと重複部分のあるグラフ
  • いままでデータ統合についてのセマンティックスの重要性について述べてきたが、グラフの生成と拡張のみを扱ってきた
  • グラフの結合
    • 結合には名前の問題がある。
    • 後の章で詳しくあつかう(多分オントロジーの章)

ビジネスグラフと場所グラフを結合する

  • コード
from simplegraph import SimpleGraph
bg = SimpleGraph()
bg.load("../chapter2/business_triples.csv")
pg = SimpleGraph()
pg.load("../chapter2/place_triples.txt")
#
for t in bg.triples((None, 'headquarters', 'San_Francisco_California')):    print t
#
for t in pg.triples(('San_Francisco_California', None, None)):    print t
#
    • 結合
hq = set([t[2] for t in bg.triples((None, 'headquarters', None))])
len(hq)
#
for pt in pg.triples((None, None, None)):
    if pt[0] in hq: bg.add(pt)
  • スキーマを気にする事無く二つのグラフを結合できた。
    • 確認
for t in bg.triples(('San_Francisco_California', None, None)): print t
for t in bg.triples((None, 'name', None)): print t

結合したグラフに問い合わせる

  • 'Computer software' 産業の会社(company)の所在都市(city)の地域(region)は?
results = bg.query([('?company', 'headquarters', '?city'), ('?city', 'inside', '?region'), ('?company', 'industry', 'Computer software')])
[r['region'] for r in results]
#
  • 'Investment Banking'産業の会社で所在都市の人口が1000000人より多いところは?
results = bg.query([('?company', 'headquarters', '?city'), ('?city', 'population', '?pop'), ('?company', 'industry', 'Investment Banking')])
[r for r in results if int(r['pop']) > 1000000]
#
  • グラフを結合(データ統合)してもこれまでと変わらなくクエリが通用する
基本的なグラフ可視化

Graphviz

graph "test" {
  A -- B;
  A -- C;
  C -- D;
}

トリプルの集合を表示する

  • トリプルストアから直接DOTファイルを保存する
from simplegraph import *
from graphtools import *
cg = SimpleGraph()
cg.load("../chapter2/celeb_triples.csv")
rel_triples = cg.triples((None, 'with', None))
tripletodot(rel_triples, 'dating_triples.dot')
neato -Teps Odating_triples.dot

 

問い合わせ結果を表示する

from simplegraph import *
from graphtools import *
cg = SimpleGraph()
cg.load("../chapter2/celeb_triples.csv")
querytodot(cg, [('?rel', 'with', '?p1'), ('?rel', 'with', '?p2')], 'p1', 'p2', 'relationships.dot')
exit()
neato -Teps -Orelationships relationships.dot

Cyatoscape でやってみる

http://img.skitch.com/20091019-1j2km3kuaysu3y2ywmmma1xjh8.jpg

A	--	B
A	--	C
C	--	D
  • def triplerosif(triples, filename):
def tripletosif(triples, filename):
    out = file(filename, 'w')
    for t in triples:
    	out.write('"%s"\t"%s"\t"%s" \n' % (t[0].encode('utf-8'), t[1].encode('utf-8'), t[2].encode('utf-8')))
  • def querytosif(graph, query, b1, b2, filename):
def querytosif(graph, query, b1, b2, filename):
    out = file(filename, 'w')
    results = graph.query(query)
    donelinks = set()
    for binding in results:
    	if binding[b1] != binding[b2]:
	   n1, n2 = binding[b1].encode('utf-8'), binding[b2].encode('utf-8')
	   if (n1, n2) not in donelinks and (n2, n1) not in donelinks:
	      out.write('"%s"\t--\t"%s"\n' % (n1, n2))
	      donelinks.add((n1, n2))

  • デモ
from simplegraph import *
from graphtools import *
cg = SimpleGraph()
cg.load("../chapter2/celeb_triples.csv")
rel_triples = cg.triples((None, 'with', None))
tripletosif(rel_triples, 'dating_triples.sif')
querytosif(cg, [('?rel', 'with', '?p1'), ('?rel', 'with', '?p2')], 'p1', 'p2', 'relationships.sif')
exit()
  • yFile で organic にするといい感じです。


セマンティックデータは柔軟
  • セマンティックデータは柔軟
  • この章によってできるようになったこと
    • データに何があって、どんな述語がつかわれているか理解するために可視化できる
    • 複数のノードにわたったパターンを検索するクエリを構築できる
    • グラフのアイテム間の結合を調べることができる
    • 場所のジオコードのように、新しい情報を推定するためのルールを構築できる
    • 新しいデータと既存のデータの重複をさがしたり、新しいスキーマ作ること無しにセットをマージできる

Part II. 標準とソース Chapter 4 実際に十分な RDF

  • データフォーマットと標準について
    • どの述語(p)を使うべきかを知るには?
    • データの値は、浮動小数点か数字の文字列表現のどちらに関係するかを知るには?
    • なぜ、"San_Francisco, CA"は San_Francisco_California なのか? 他で無く。
    • コンマ切りトリプルは、格納と共有に最良の方法なのか?
  • これらはデータの保持と共有化の問題
RDF は何?
RDF データモデル
  • RDFは、トリプルで表現された文をつかったデータモデルを表現するための言語。
  • 正確、堅牢、伝達時の曖昧性を排除

URIs は強いキー

リソース

ノード

  • すべてのRDF主語や目的語はリソース、ではない。
  • 匿名ノード、anounymous、blank node
  • 主語もしくは目的語でURIでアドレスできない場合がある
  • 図4−2
  • ノードの ID → _:id
    • id は任意の文字列
    • ローカルなグラフ内でのみのID
    • 強いキーではないのでグラフをまたいで使用できない
    • 関係代名詞のようなもの?
    • Segaran の知っている人の名前はJamie
(_:ax1, "surName", "Segaran")
(_:ax1, "knows", _:zb7)
(_:zb7, "surName", "Jamie")

リテラル

RDFシリアル化形式
  • 各種言語にライブラリがあるので詳しい仕様について熟知していなくても利用できる
  • 4つの形式を紹介する
    • N-triples (シンプルな表記法
    • N3 (N-triplesの圧縮版)
    • RDF/XML (良く利用される形式)
    • RDF in attributes (a.k.a. RDFa) (XHTMLに埋め込む用)
  • くわしくは http://www.w3.org/RDF

友人のグラフ

N-Triples

<http://kiwitobes.com/toby.rdf#ts> <http://xmlns.com/foaf/0.1/homepage> <http://kiwitobes.com/>.
<http://kiwitobes.com/toby.rdf#ts> <http://xmlns.com/foaf/0.1/nick> "kiwitobes".	
<http://kiwitobes.com/toby.rdf#ts> <http://xmlns.com/foaf/0.1/name> "Toby Segaran".
...

N3

  • N-Triples はシンプルで良いが冗長性が、データ量に比例して大きくなる。(URIがとくに冗長)
  • 少しの構造を加えて、N-Triples を圧縮したものが N3
  • URI prefix を定義して、参照したIDを短く表記する
    • 定義文 @prefix semprep: <http://semprog.com/people/>.
    • <http://semprog.com/people/colin> → semprep:colin
  • 同じ主語を省略できる
    • セミコロンで、主語を省略しつつ文結合。ドットが末尾。
    • semprep:colin foaf:knows <http://kiwitobes.com/toby.rdf#ts>; foaf:mbox "colin@semprog.com".
  • 共有した空ノードを名付けずに表記できる
    • [ <http://www.w3.org/2006/vcard/ns#street-adddress> "1005 Gravenstein Hwy North" ; <http://www.w3.org/2006/vcard/ns#locality> "Sebastopol, California" ].
  • a は <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> のショートカット
  • = は <http://www.w3.org/2002/07/owl#sameAs> のショートカット
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.

tobes:ts a foaf:Person;
   foaf:homepage <http://kiwitobes.com/>;
   foaf:nick "kiwitobes";
   foaf:name "Toby Segaran".

RDF/XML

  • RDF はデータモデルの一つ、XMLはその表現のひとつ
  • RDF/XMLRDF であると勘違いされがち、読むのが困難と批判されがち
  • タグのパスでグラフを表現
    • ノード(主語)、リンク(述語)、ノード(目的語)
      • 『ストライプ』構造
  • rdf:RDF がトップノード
    • <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" />
  • グラフノードrdf:Description
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
               xmlns:foaf="http://xmlns.com/foaf/0.1/">

  <rdf:Description rdf:about="http://kiwitobes.com/toby.rdf#ts>
    <foaf:knows>
      <rdf:Rescription rdf:about="http://semprog.com/people/colin">
   </foaf:knows>
  <rdf:Description>

</rdf:RDF>
  • リテラルオブジェクトはテキストエレメント、もしくはrdf:Descriptionのアトリビュート
    • <foaf:name>Colin Evans</foaf:name>
    • <rdf:Description foaf:mbox="jamie@semprog.com" />
  • rdf:type 情報のショートカットがある。
    • <rdf:Description rdf:about="http://kiwitobes.com/toby.rdf#ts"><rdf:type><foaf:Person> ...
    • <foaf:Person rdf:about="http://kiwitobes.com/toby.rdf#ts">

RDFa

<span xmlns:foaf="http://xmlns.com/foaf/0.1/"
      about="http://kiwitobes.com/toby.rdf#ts"
      property="foaf:nick"
      countent="kiwitobes" />
  • 例:目的語がURI(about、rel、href)
<span xmlns:foaf="http://xmlns.com/foaf/0.1/"
      about="http://kiwitobes.com/toby.rdf#ts"
      rel="http://xmlns.com/foaf/0.1/homepage"
      href="http://kiwitobes.com" />
  • 例:XHTMLに埋め込み
Toby's nickname is: <span xmlns="http://xmlns.com/foaf/0.1/"
  about="http://kiwitobes.com/toby.rdf#ts"
  property="foaf:nick">kiwitobes</span>


			
			

これら以外のシリアル化形式

RDFLib の紹介
import rdflib
from rdflib.Graph import ConjunctiveGraph
g = ConjunctiveGraph()

#  データを取り込み
g.parse("http://semprog.com/people/colin", format="nt")

# 一覧表示
for triple in g:
    print triple

# クエリ
list( g.triples((None, rdflib.URIRef('http://xmlns.com/foaf/0.1/konws'), None)) )

# ファイル書き出し
outfile = open("colin.xml", "w")
outfile.write(g.serialize(format="pretty-xml"))
  • 書き出したファイル:colin.xml
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
  xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
  xmlns:_3='http://xmlns.com/foaf/0.1/'
>
  <_3:Person rdf:about="http://semprog.com/people/colin">
    <_3:name>Colin Evans</_3:name>
    <_3:mbox rdf:resource="mailto:colin@metaweb.com"/>
    <_3:knows>
      <_3:Person>
        <_3:name>Jamie Taylor</_3:name>
        <_3:mbox rdf:resource="mailto:jamie@semprog.com"/>
      </_3:Person>
    </_3:knows>
    <_3:knows>
      <_3:Person rdf:about="http://kiwitobes.com/toby.rdf#ts">
        <_3:name>Toby Segaran</_3:name>
        <_3:mbox rdf:resource="mailto:toby@segaran.com"/>
      </_3:Person>
    </_3:knows>
  </_3:Person>
</rdf:RDF>

import rdflib
from rdflib.Graph import ConjunctiveGraph
newg = ConjunctiveGraph()
newg.parse("colin.xml")
print newg.serialize(format="n3")
  • N3出力
@prefix _3: <http://xmlns.com/foaf/0.1/>.
@prefix _4: <http://kiwitobes.com/toby.rdf#>.
@prefix _6: <http://semprog.com/people/>.
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.

 _6:colin a _3:Person;
     _3:knows [ a _3:Person;
             _3:mbox <mailto:jamie@semprog.com>;
             _3:name "Jamie Taylor"],
         _4:ts;
     _3:mbox <mailto:colin@metaweb.com>;
     _3:name "Colin Evans". 

 _4:ts a _3:Person;
     _3:mbox <mailto:toby@segaran.com>;
     _3:name "Toby Segaran". 
  • なぜか一致しない…
newg == g
#
newg -= g
len(newg)
#
  • こちらは一致
g.isomorphic(newg)
#
newg.parse("colin.xml")
g.isomorphic(newg)
#
  • トリプルの追加の例
# 
me = URIRef("http://my.uri.com/gose/here")
# 
RDF = rdflib.Namespace("http://www.w3.org/TR/rdf-schema/#")
ref-type-predicate = REF["type"]
#
[ x for x in g.namespaces() ]
# foaf がある。とおもったら、_3 になっていた。
foaf = rdflib.Namespace("http://xmlns.com/foaf/0.1/")
# 
g.add((me, ref-type-predicate, foaf["person"]))
#
g.add(( URIRef("http://semprog.com/people/colin"), foaf["knows"], me))

Persistence with RDFLib

  • MySQLやBerkeleyDB、SQLite でグラフを永続化(=ファイル化)できる
import rdflib
from rdflib import Literal
store = rdflib.plugin.get('SQLite', rdflib.store.Store)('rdf-test.ts')
store.open('.', create = True)
g = rdflib.ConjunctiveGraph(store)
semprog = rdflib.Namespace("http://semprog.org/people/")
foaf = rdflib.Namespace("http://xmlns.com/foaf/0.1/")
g.add((semprog["jamie"], foaf["name"], Literal("Jamie Taylor")))
g.add((semprog["jamie"], foaf["mbox"], Literal("jamie@semprog.com")))
g.serialize(format="nt")
g.commit()
  • 読み込むときは、create=False にする。
import rdflib
store = rdflib.plugin.get("SQLite", rdflib.store.Store)('rdf-test.ts')
store.open(".", create = False)
g = rdflib.ConjunctiveGraph(store)
g.serialize(format='nt')

SPARQL

SELECT クエリフォーム

  • クエリ例:自作映画に出演している監督はだれ? どの映画?
PREFIX fb:<http://rdf.freebase.com/ns/>

SELECT ?who ?film
WHERE {
  ?film fb:film.film.derected_by ?who .
  ?film fb:film.film.starrting ?who .
  • PREFIX で名前空間を定義
  • ? もしくは $ からはじまる文字列が変数束縛

  • クエリ例:ron_shelton の監督映画の最初のリリース日は?
PREFIX fb:<http://rdf.freebase.com/ns/>

SELECT ?film ?reldate
WHERE {
  ?film fb:film.film.directed_by fb:en.ron_shelton .
  OPTIONAL { ?film fb:film.film.initial_release_date ?reldate . }
}
  • ?reldate が無い場合(欠損値の場合)にもマッチするようにするには OPTIONAL をつかう

  • クエリ例:ron_shelton の監督映画の最初のリリース日の記載の無い映画は?
PREFIX fb:<http://rdf.freebase.com/ns/>

SELECT ?film ?reldate
WHERE {
  ?film fb:film.film.directed_by fb:en.ron_shelton .
  OPTIONAL { ?film fb:film.film.initial_release_date ?reldate . }
  FILTER (!bound(?reldate))
}
  • FILTER で?reldateに変数束縛できなかったトリプルだけをとりだす。
  • 絞り込みにつかえる
  • 正規表現がつかえる:ron_shelton監督映画の出演者の中で名前が russell にマッチする人は?
PREFIX fb:<http://rdf.freebase.com/ns/>

SELECT ?film ?reldate
WHERE {
  ?film fb:film.film.directed_by fb:en.ron_shelton .
  ?star fb:type.object.name ?who .
  FILTER regex(?who, "russell", "i")
}
  • 不等号フィルター:
PREFIX fb:<http://rdf.freebase.com/ns/>

SELECT ?film ?when
WHERE {
  ?film fb:film.film.initial_release_date ?when .
  FILTER (?when > "2002")
}

Multiple Graph Patterns

  • WHERE 節に複数の {} (グラフパターン)を書ける。AND がとられる。
  • UNION キーワードをつかうと OR になる。

CONSTRUCTクエリフォーム

  • クエリの返り値でトリプルを形成する

ASK と DESCRIBE クエリフォーム

  • ASK は SELECTとWHEREが一体になっているようなもの
PREFIX fb:<http://rdf.freebase.com/ns/>
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>

ASK {
  ?film fb:film.film.starring fb:en.bob_saget .
  ?film fb:film.film.starrgin fb:en.harrison_ford .
}
  • DESCRIBE はリソースのサービスについての情報を返す、らしい

SPARQLクエリとRDFLib

from rdflib.Graph import ConjunctiveGraph, Namespace

FBNAMESPACE = Namespace("http://rdf.freebase.com/ns/")
g = ConjunctiveGraph()
g.parse("moviedata-small.n3", format="n3")

results = g.query("SELECT ?film ?year WHERE { ?film fb:film.film.initial_release_date ?year . }", initNs = {'fb':FBNAMESPACE})

for triple in results:
    print triple
  • 返り値
(rdflib.URIRef('http://rdf.freebase.com/ns/en.hollywood_homicide'), rdflib.Literal(u'2003'))
(rdflib.URIRef('http://rdf.freebase.com/ns/en.becoming_dick'), rdflib.Literal(u'2000'))
(rdflib.URIRef('http://rdf.freebase.com/ns/en.k_19_the_widowmaker'), rdflib.Literal(u'2002'))
(rdflib.URIRef('http://rdf.freebase.com/ns/en.the_weight_of_water_2002'), rdflib.Literal(u'2002'))
(rdflib.URIRef('http://rdf.freebase.com/ns/en.body_of_lies'), rdflib.Literal(u'2008'))

便利なクエリ修飾子

  • LIMIT
    • 取り出す数
  • OFFSET
    • マッチの中の取り出す位置
  • ORDER BY
  • LIMIT と OFFSET でページネートを実現できる。
    • でできること:クエリにマッチした全件のうち、10件づつ表示する

  • SQLとは異なり、SPARQLは読み出ししかサポートしていない。(いまのところ)
  • よって、SPARQLでグラフを変更することはできない。
  • メリット:SPARQLエンドポイントを外部に公開してもリードオンリーなのでデータの改変の心配は無い。

Part II. 標準とソース Chapter 5 セマンティックデータのソース

FOAF (Friend of a Friend)

ソーシャルネットのグラフ解析

Linked Data

データのクラウド

FOAF

リンクトデータを消費する

Freebase

アイデンティティーデータベース

RDFインターフェイス

フリーベーススキーマ

MQLインターフェイス

metaweb.pyライブラリを使用する

人と相互作用する

トラックバック - http://lifesciencedb.g.hatena.ne.jp/nakao_mitsuteru/20091021