Hatena::Grouplifesciencedb

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

2009-10-28

第5章データソース、第6章オントロジー 、第7章公開

|  第5章データソース、第6章オントロジー 、第7章公開 - ゲノム周辺 を含むブックマーク はてなブックマーク -  第5章データソース、第6章オントロジー 、第7章公開 - ゲノム周辺  第5章データソース、第6章オントロジー 、第7章公開 - ゲノム周辺 のブックマークコメント

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

データのリソースオントロジー、データの公開について扱っています。


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

  • セマンティクデータのストア、クエリ、操作についてみてきた
  • 良くある批判は、だれもセマンティックデータを標準をつかって公開してない、であった。
  • ソーシャルネットや映画、音楽の標準語彙を紹介する
  • 大量の強いIDのついたエンティティや数百の語彙をつかっているソーシャルデータベース Freebase をみる
FOAF (Friend of a Friend)
PREFIX foaf:<http://xmlns.com/foaf/0.1/>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>

SELECT ?burl 
WHERE {
  ?a foaf:knows ?b . 
  ?b rdfs:seeAlso ?burl . 
}


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

easy_install networkx
import networkx as nx
g = nx.Graph()
g.add_edges_from([('a', 'b'), ('b', 'c'), ('b', 'd'), ('b', 'e'), ('e', 'f'), ('f', 'g')])
g.add_edge('c', 'd')
#
nx.degree(g, with_labels=True)
#
nx.betweenness_centrality(g)
#
nx.find_cliques(g)
#
nx.clustering(g,  with_labels=True)
#
nx.average_clusering(g)
#
  # Build a NetworkX graph of relationships
  nx_graph = nx.Graph()
  for a, b in rdf_graph.qeury('SELECT ?a ?b '+\
              'WHERE { ?a foaf:knows ?b . }',
              initNs={'foaf':FOAF, 'rdfs':RDFS})
    nx_graph.add_edge(str(a), str(b))
      • ノードのcentralityを計算
      • 最も中心的な人物のランキング
      • ノードのクラスター係数を計算
      • cliquishな人々をランキング
  • ルールの連鎖による推論ではなくてグラフ構造からの解析をおこなった

Linked Data

データのクラウド

  • FOAF は人物についてのセマンティックデータソースとして大量に流通している
  • しかし中心的なレポジトリは無い
  • 他のデータの発見性をよくする
  • データ消費者からの視点:
    • ウェブにデータがでたらめにまき散らされている
    • マスターデータキュレイターの不在
    • 網羅的なインデクスの不在
    • 中心的な調整者の不在
  • このデータクラウドから、一貫したデータベースを制作者が紡ぎ出すことが、セマンティックウェブのゴール

Are You Your FOAF file ?


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

  • LInked Data をつかった実習
  • 米国外のアーティストの音楽アルバムを検索し、アーティスト情報やアルバムのレビューをリストするアプリケーション
    • データソース
      • DBpedia
      • Freebase.com
      • BBC
  • BBC
  • MusicBrainz
    • 音楽アーティストのメタデータプロジェクト
    • Linked Data dereferencable URIs を提供していない。
    • Freebase が MusicBrainz ID を dereferencable URIs として扱っている。
  • Freebase
  • DBpedia
  • コード:http://semprog.com/psw/chapter5/lod (このファイルはみつからない)
    • 複数のウェブサービスをつかっているので、それぞれの稼働状況に依存
    • フロー:図5−4
    • 国名を入れると(1)DBpediaにSPARQLクエリでバンドのFreebase IDを取得し(2)Freebase から MusicBrainz ID を取得し(3)MusicBrainsID でBBCからレビューを取得する流れ
      • 三段階でRDFグラフにデータを追加。データは強いIDでリンクしている。
      • 実行部
...
if __name__ == "__main__"
   g = Graph()
   getBands4Location(g)
   getMBZIDs(g)
   getBBCArtistData(g)
   getBBCReviewData(g)
   final_query = """
SELECT ?name ?album ?reviewtext
WHERE {
      ?fbband fb:type.object.name ?name .
      ?fbband owl:sameAs ?bband .
      ?bband foaf:make ?bn0 .
      ?bn0 dc:title ?album .
      ?bn0 rev:hasReveiw ?rev .
      ?rev rev:text ?reviewtext .
      FILTER ( lang(?name) != "en")
}"""

finalresult = g.qeury(final_query, initNs=nsdict)
...


Freebase

screenshot

  • 書き込み可能なセマンティックデータベース
  • 遺伝子からジーンズまで幅広いトピックを扱っている
  • すべてのデータはCC-BYになっている。
  • データの利用に料金はかからない

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

  • 数百万のエントリ/トピック(ものの単位)の情報があり、コミュニティユーザによってキュレーションされ、それぞれユニークであることが確認されている
  • 強いIDが中心的な役割
  • U2 トピックの Freebase ID
    • /authority/musicbrainz/a3cb23fc-acd3-4ce0-8f36-1e5aa6a18432
      • /authority/musicbrainz (名前空間
      • a3cb23fc-acd3-4ce0-8f36-1e5aa6a18432 (MusicBrainz ID)
    • 外部のdereferencable URIを取り込むのに便利な構造になっている
  • Freebase のエントリは消せない

RDFインターフェイス


Freebase スキーマ

screenshot

wget -q -O - --header="ACCEPT:text/plain" http://rdf.freebase.com/ns/film.actor
  • このようなトリプルがえられ、
<http://rdf.freebase.com/ns/film/actor> <http://rdf.freebase.com/ns/type.type.property> <http://rdf.freebase.com/ns/film.actor.film>
  • /film/actor/film のURIが得られる
wget -q -O - --header="ACCEPT:text/plain" http://rdf.freebase.com/ns/film.actor.film
curl -L -HACCEPT:text/plain http://rdf.freebase.com/rdf/film/actor/film.actor
#
curl -L -HACCEPT:text/plain http://rdf.freebase.com/ns/film.actor.film
#

MQLインターフェイス

  • nickel と発音する。むりやり
  • SPARQLのようなグラフパターンマッチではなく、ツリー状で例示で問い合わせ構造。
  • クエリJSON で表現する
    • ハリソンフォードの誕生日の問い合わせ:
{
  "code": "/api/status/ok",
  "result": {
    "/people/person/date_of_birth": "1942-07-13",
    "id": "/en/harrison_ford"
  },
  "status": "200 OK",
  "transaction_id": "cache;cache04.p01.sjc1:8101;2009-10-26T10:42:34Z;0015"
}
      • SPARQL で表現すると:
PREFIX fb:<http://rdf.freebase.com/ns/>
SELECT ?dob WHERE {  fb:en.harrison_ford fb:people.person.date_of_birth ?dob . }
{
  "id":"/en/harrison_ford",
  "type":"/film/actor",
  "film":[{ "film":[] }]
}  
    • 返り値
{
  "code": "/api/status/ok",
  "result": {
    "film": [
      {
        "film": [
          "Air Force One"
        ]
      },
      {
        "film": [
          "Apocalypse Now"
        ]
      },
      {
        "film": [
          "Blade Runner"
        ]
      },
      {
        "film": [
          "Clear and Present Danger"
        ]
      },
      {
        "film": [
          "Firewall"
        ]
      },
      {
        "film": [
          "Frantic"
        ]
      },
      {
        "film": [
          "Hollywood Homicide"
        ]
      },
      {
        "film": [
          "Indiana Jones and the Kingdom of the Crystal Skull"
        ]
      },
      {
        "film": [
          "Indiana Jones and the Last Crusade"
        ]
      },
      {
        "film": [
          "Indiana Jones and the Temple of Doom"
        ]
      },
      {
        "film": [
          "K-19: The Widowmaker"
        ]
      },
      {
        "film": [
          "Patriot Games"
        ]
      },
      {
        "film": [
          "Presumed Innocent"
        ]
      },
      {
        "film": [
          "Raiders of the Lost Ark"
        ]
      },
      {
        "film": [
          "Random Hearts"
        ]
      },
      {
        "film": [
          "Regarding Henry"
        ]
      },
      {
        "film": [
          "Return of the Ewok"
        ]
      },
      {
        "film": [
          "Star Wars Episode IV: A New Hope"
        ]
      },
      {
        "film": [
          "The Devil's Own"
        ]
      },
      {
        "film": [
          "The Frisco Kid"
        ]
      },
      {
        "film": [
          "The Fugitive"
        ]
      },
      {
        "film": [
          "The Mosquito Coast"
        ]
      },
      {
        "film": [
          "The Star Wars Holiday Special"
        ]
      },
      {
        "film": [
          "What Lies Beneath"
        ]
      },
      {
        "film": [
          "Witness"
        ]
      },
      {
        "film": [
          "Working Girl"
        ]
      },
      {
        "film": [
          "Sabrina"
        ]
      },
      {
        "film": [
          "Star Wars Episode V: The Empire Strikes Back"
        ]
      },
      {
        "film": [
          "American Graffiti"
        ]
      },
      {
        "film": [
          "Star Wars Episode VI: Return of the Jedi"
        ]
      },
      {
        "film": [
          "Six Days Seven Nights"
        ]
      },
      {
        "film": [
          "Hearts of Darkness: A Filmmakers's Apocalypse"
        ]
      },
      {
        "film": [
          "Apocalypse Now Redux"
        ]
      },
      {
        "film": [
          "Hanover Street"
        ]
      },
      {
        "film": [
          "Force 10 from Navarone"
        ]
      },
      {
        "film": [
          "The Conversation"
        ]
      },
      {
        "film": [
          "Zabriskie Point"
        ]
      },
      {
        "film": [
          "Heroes"
        ]
      },
      {
        "film": [
          "Dead Heat on a Merry-Go-Round"
        ]
      },
      {
        "film": [
          "Scary Movie 3"
        ]
      },
      {
        "film": [
          "Getting Straight"
        ]
      },
      {
        "film": [
          "Water To Wine"
        ]
      },
      {
        "film": [
          "Crossing Over"
        ]
      },
      {
        "film": [
          "Morning Glory"
        ]
      }
    ],
    "id": "/en/harrison_ford",
    "type": "/film/actor"
  },
  "status": "200 OK",
  "transaction_id": "cache;cache01.p01.sjc1:8101;2009-10-26T10:44:05Z;0004"
}
{
  "id":"/en/harrison_ford",
  "type":"/film/actor",
  "film":[{ "film":[{"name":null, "directed_by":[] }] }]
}
    • ハリソンフォードの出演映画のうちで女性監督映画の映画名と監督名を問い合わせる
{
  "id":"/en/harrison_ford",
  "type":"/film/actor",
  "film":[{ "film":[{"name":null, 
    "directed_by":[{"name":null, "/people/person/gender":"Female"}] }] }]
}
      • 返り値
{
  "code": "/api/status/ok",
  "result": {
    "film": [
      {
        "film": [
          {
            "directed_by": [
              {
                "/people/person/gender": "Female",
                "name": "Kathryn Bigelow"
              }
            ],
            "name": "K-19: The Widowmaker"
          }
        ]
      }
    ],
    "id": "/en/harrison_ford",
    "type": "/film/actor"
  },
  "status": "200 OK",
  "transaction_id": "cache;cache01.p01.sjc1:8101;2009-10-26T13:26:31Z;0002"
}

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

import metaweb
null = None
freebase = metaweb.Session("api.freebase.com") 
q = {"id":"/en/harrison_ford", "type":"/film/actor", "film":[{ "film":null }]}
output = freebase.read(q)
print str(output)
#
for performance in output['film']: print performance['film']
#

人とのインタラクション

  • 曖昧な名前をつかいがち
  • "US" や "The United States of America" という入力に <http://rdf.freebase.com/ns/en.united_states> を割り当てたい
  • 方法1:受付可能な応答を列挙する。強いIDと同様にはたらく
    • ユーザーの入力の表現力を制限してしまう
  • Freebase のアプローチ:自動保管ウイジット

http://img.skitch.com/20091026-8rm1m21h1ey435cij84am4npp1.jpg



コラム:Semantic Search


コラム:Sumushing Identity

  • こべつのデータリソースからのグラフをマージしたとき、理想的には、owl:sameAs で URIRefs 同士が関連ついている。
  • 現実的にはそうではない。
  • FOAF をつかったソーシャルネットワークではアノニマスノードをつかっていても、foaf:mbox がユニークキー的に振る舞う
  • 二つのリソースが同じものか否かは良く知られた課題
    • identity problem
    • reconciliation
    • record matching
    • smushing (RDF的)

コラム:Real-World Data

  • 事例ではエラーや例外処理をほとんどしていないが、Linked Dataのプログラミングでは守りの姿勢が重要
  • RDFa を扱うときに重要なのは、不正な HTML を前処理すること
    • Tidy や Beautiful Soup をつかう
  • RDFテンプレートで生成されることがおおいので、系統エラーがはいりやすい
  • xsd:dateTime 型なのにちがったりすることもしばしば



第6章 オントロジー

  • これまで既存の述語やかんたんなものだけをつかってきた
  • トリプルが広く流通したときには、述語の意味の定義の重要性がましてくる
    • film に TV用につくられた映画はふくまれるのか?など

What Is It Good For ? それは何に良い?
  • 主語、述語、目的語で知識を表現
    • 述語はエンティティ同士の関係、これは哲学の領域 Ontology
  • セマンティックソフトウェアでは世界をモデル化する必要がある
  • システム設計者はオンとロジスト

意味づけのための契約

  • TV向けの映画は film か?
  • オントロジーは正確な語彙を提供する
  • 語彙は、データ生産者とデータ消費者の社会契約書のようなもの
    • 意味付けが十分理解できると、データの利用性や拡張性が増す
  • どのようにして作成したオントロジーが正しいかを確認するか?

モデルはデータ

  • RDFメタモデルならば、オントロジーRDFトリプルを表現できたりデータにそってグラフストアに保存できるのは驚きではない。
  • 第三章では、既存のデータからあたらしいデータを生成し、推論をおこなった。
    • 推論ルールはコードの中にある。
    • 理想的には推論ルールは推論課程にあってほしい
  • オントロジーは推論のための形式ルールを表現できる
    • システムがオントロジーを読み込んだら、手でできる推論はすべて実行できるはずである
  • オブジェクト指向のシステムでは、ルールはオブジェクトが知っている。
  • Semantics Programming

データモデル化の概論
  • movies
    • title
    • release date
    • actors
  • types, properties, clases

クラスとプロパティ

  • class はエンティティのグループ
  • property はエンティティの関係
  • domain は property の主語がどのようなタイプかを定義
  • range は property の述語がどのようなタイプかを定義
ex:hasEyeColor rdf:type rdf:Property .
ex:hasEyeColor rdf:domain ex:Animal .
ex:hasEyeColor rdf:domain ex:Human .
ex:hasEyeColor rdf:range ex:Color .
  • トリプル例
<http://semprog.com/people/jamie> ex:hasEyeColor <http://rdf.freebase.com/ns/en.blue> .
    • jamie は ex:Aminal もしくは ex:Human である
    • /en/blue は ex:Color である
    • セマンティッククラスは Property に対して定義されるので、ex:Animal と ex:Human の関係は定義していない

フィルムをモデル化する

  • 第二章の映画データをモデル化する
    • ブレードランナーはリドリースコット監督作品でハリソンフォードが出演している
    • 図6−2
sp:blade_runner sp:name "Blade Runner"
rdf:type sp:Film
sp:starring sp:harrison_ford
sp:directedBy sp:redley_scott
sp:harrison_fordsp:name "Harrison Ford"
rdf:type sp:Actor
sp:redley_scott sp:name "Ridely Scott"
tdf:type sp:Director
      • RDFとRDFSとOWLの語彙がでてくるけど、説明はのちほど
      • PREFIX sp:<http://semprog.com/film#> という名前空間
      • class sp:Film は property sp:starring と spdirectedBy と sp:name をもっている。
    • 図6−3filmオントロジーのクラス階層
sp:Actor rdfs:subClassOf sp:Person .
sp:Director rdfs:subClassOf sp:Person .
sp:Person rdfs:subClassOf sp:Object .
sp:film rdfs:subClassOf sp:Object .
    • 図6−4propertyの接続先(domainとrange)
sp:namerdf:typeowl:DetatypeProperty
rdfs:domainsp:Object
rdfs:rangexsd:string .
sp:directerByrdf:typeowl:ObjectProperty
rdfs:domainsp:Film
rdfs:rangesp:Director .
sp:starringrdf:type owl:ObjectProperty
rdfs:domainsp:Film
rdfs:rangesp:Actor .
sp:Actor rdf:type owl:Class .
sp:FIlmrdf:type owl:Class .
sp:Director rdf:type owl:Class .
sp:Object rdf:type owl:Class .
xsd:string rdf:type rdf:XMLLiteral .
    • property からそれをつかっている主語(domain側)と目的語(range側)のclassと型がわかる

関係を具体化する

  • データモデル化の一般的な問題は関係についての明言する必要があるときにおこる
  • roleを足す例:ハリソンフォードはブレードランナーでリックデッカードの役(role)をした
    • roleはactor や film のpropertyにはではない
    • role はハリソンフォードの performance の property である。
  • RDFではこのように、主語述語目的語ステートメントをひとつの主語にする処理をreification(具体化)という
    • 図6−5 sp:Performance クラス
sp:blade_rannerrdf:typesp:Film
sp:name"Blade Runner"
sp:starring_:pref1
_:pref1rdf:typesp:Performance
sp:hasActorsp:harrison_ford
sp:hasRolesp:rick_deckard
sp:harrison_fordrdf:typesp:Actor
sp:name"Harrison Ford"
sp:rick_deckardrdf:typesp:Role
sp:name"Rick Deckard"
    • sp:Performance はほかのクラスとことなりものの関係を記述している
      • sp:actorやsp:Filmやsp:Roleとむすびつかないとsp:Performanceは意味が無い
      • RDF では空ノード(_:perf1)
  • セマンティックデータモデル化では、このような具体化は一般的なパターン

実際に十分なOWL
list(graph.subjects(rdfType, owlClass))
      • 述語が rdf:type、目的語が owl:ObjectProperty の主語
list(graph.subjects(rdfType, owlObjectProperty))


プロテジェを利用する

新しいオントロジーを作る


オントロジーを編集する


実際にちょっともっとOWL
  • ものがほかのもとどのように関係するかの曖昧性を取り除く修飾子を加える

Functional and Inverse Functional Properties 機能的と逆機能的プロパティ

  • Functional properties
    • 目的語を一個だけもつプロパティ
    • has_actor と has_role は Functional Properties
    • Performance は single actor と single role
  • Inverse Functional properties
    • 主語語を一個だけもつプロパティ
    • starring は Inverse Functional Properties
  • owl:ObjectProperty のサブクラス
    • owl:FunctionalProperty
    • owl:InverseFunctionalProperty
    • rdf:type をつかって宣言

Inverse Properties 逆プロパティ

  • RDF ステートメントには方向性がある
    • (domain) -> (range)
      • film directedBy director
      • director directed film
    • このような directedBy と directed を関係づける
PREFIX sp:<http://www.semprog.com/film#>
sp:directed owl:inverseOf sp:directedBy .

Disjoint Classes 離れるクラス

  • あるクラスから離すクラスのメンバーは、あるクラスのメンバーでは無い保証される。
  • owl:disjoint
    • 明確に別物にするときにつかう?sameAsの影響をうけない?

現実にとどめる


いくつかの他のオントロジー

FOAFを記述する


ビールオントロジー


これは私の美しい関係スキーマではない!
  • データモデルを構築するとき、最初はに正しくすることはだれにもできない
  • 関係データベーススキーマ設計と異なる点
    • いつでも更新できる。データに影響しない
    • 古いクエリも動作する

よりくわしくは






第7章 セマンティックデータを公開する


Embedding Semantics 意味を埋め込む
  • RDF/XML は複雑すぎる
    • 同じ内容のページを別形式で提供するのは、すでにある資産を活かすことと今後のメンテナンスコストを増やしてしまう
  • すでに多数あるHTMLページに意味を埋め込む方法

Microformats マイクロフォーマット

screenshot

<div class="vcard">
  <div class="fn">Toby Segaran</div>
  <div class="org">The Semantic Programmers</div>
  <dic class="tel">919-555-1234</div>
  <a class="url" href="http://kiwitobes.com/">http://kiwitobes.com/</a>
</div>
  • hCalender event を文字に埋め込む例
<p class="vevent">
 The <span class="summary">English Wikipedia was launched</span> 
 on 15 January 2001 with a party from
 <abbrr class="dtstart" title="2001-01-15T14:00:00+06:00">2</abbr> - 
 <abbrr class="dtstart" title="2001-01-15T16:00:00+06:00">4</abbr> pm at 
 <span class="location">Jimmy Wales' house</span>
 (<a class="url" href="http://en.wikipedia.org/wiki/History_of_Wikipedia">more information</a>)
</p>

ブラウザではこのように表示される:

http://img.skitch.com/20091025-kn2sk9safmqhdxug1iwid3w1xd.jpg

http://img.skitch.com/20091025-mkyyr2jf9ieim427cssmjbnehp.jpg

  • 難点:簡単に導入できるか、複数の microformats を混ぜるのは難しい。

RDFa  

<body xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:foaf="http://xmlns.com/foaf/0.1/">
<h1>Toby's Home Page</h1>
<p>My name is
  <span property="foaf:firstname">Toby</span> and my 
  <span rel="foaf:interest" resource="urn:ISBN:0752820907">favorite book</span>
  is the inspiring 
  <span about="urn:ISBN:0752820907">
    <cite property="dc:title">Weaving the Web</cite> by 
    <span property="dc:creator">Tim Berners-Lee</span>
  </span>
</p>
</body>
  • 次のように表示される:

http://img.skitch.com/20091025-etjumi4sq35kexinbmhihsgnn2.jpg

<div xmlns:beer="http://www.purl.org/net/ontology/beer#">
  <div about="#Guines" typeof="beer:Stout">
    <span property="beer:hasAlocholicContent">7.5</span>% Alcohol
  </div>
</div>

Yahoo! SearchMonkey

screenshot


Google's Rich Snippets


Dealing with Legacy Data 遺産データを扱うこと
  • 一般的な三段階
    1. ソースデータの同定とパース
    2. データにふさわしいスキーマを見つける/作成する
    3. データを名前空間写像し、RDFを作成する
  • 具体的な三つの事例をみる

インターネットビデオアーカイブウェブサービス

from rdflib.Graph import ConjunctiveGraph
from rdflib import Namespace, BNode, Literal, RDF, URIRef
from urllib import urlopen
from xml.dom.minidom import parse

FB = Namespace("http://rdf.freebase.com/ns/")
IVA_MOVIE = Namespace("http://www.videodetective.com/titledetails.aspx?publishedid=")
IVA_PERSON = Namespace("http://www.videodetective.com/actordetails.aspx?performerid=")
RDFS = Namespace("http://www.w3.org/2000/01/rdf-schema#")
def getdata(node, tag):
    datanode = node.getElementByTagName(tag)[0]
    if not datanode.hasChildNodes(): return None
    return datanode.firstChilde.data
    • REST APIXMLを取得し、必要なデータをとりだす
def get_in_theaters():
...
    • 取り出したデータをトリプルにしてRDFグラフに追加
def make_rdf_graph(movies):
...
    • 実行部
if __name__ == '__main__':
   movies = get_in_theatres()
   movie_graph = make_rdf_graph(movies)
   print movie_graph.serialize(format='xml')
  • ソースから獲得したデータを拡張して、明確な意味をつけて再構築した
    • スキーマを公開すると、第三者がデータを利用しやすくなる


テーブルとスプレッドシート(テキストデータ)

...
for title, rating, review in reader(open('MovieReviews.csv', 'U')):
    match = movie.query('SELECT ?movie WHERE {?movie dc:title "%s" .}' % title, initNs={'dc':DC})
    for movie_node, in match:
    	review_node = BNode()
	movie_graph.add((movie_node, REV['hasReview'], review_node))
...
    • 問い合わせ例:評価4以上の映画名とその監督名
PREFIX rev:<http://www.purl.org/stuff/rev#>
PREFIX dc:<http://purl.org/dc/elements/1.1/>
PREFIX fb:<http://www.freebase.com/ns/>

SELECT ?title ?rating, ?dirname
WHERE {
 ?m rev:hasReview ?rev .
 ?m dc:title ?title .
 ?m fb:film.film.directed_by ?d .
 ?d dc:title ?dirname .
 ?rev rev:rating ?rating
 FILTER (?rating > 4)
}
  • さりげなく、REST APIからのデータとcsvからのデータをマージして問い合わせをしている。
    • これは、映画のタイトルがふたつのデータソースで同じ文字列だったから可能。

引き継がれた関係データ(RDB

+----------+
| messages |
+----------+
| id       |               +-------+
| title    |               | users |
| content  |               +-------+
| user_id  | ------------> | id    |
+----------+               | name  |
  ^                        | email |
  |                        +-------+
  |       
+-------------------+
| messages_subjects |      +-------------+
+-------------------+      | subjects    |
| message_id        |      +-------------+
| subject_id        | ---> | id          |
+-------------------+      | description |
                           +-------------+
cur.execute("SELECT id, title, content user FROM messages;")
for id, title, content, user in cur.fetchall():
    mnode = MB['message/%d' % id]
    sg.add((mnode, RDF.type, SIOC['Post']))
    sg.add((mnode, DC['title'], Literal(title)))
    sg.add((mnode, SIOC['content'], Literal(content)))
    sg.add((mnode, SIOC['has_creator'], MB['user/%s' % user]))
    • 各テーブルの行を素直にトリプルに写像している
  • トリプル例:(message:10 has_creator user:1)
    • MB['message/%d' % id] が message:10 になっている。
  • 暗黙のセマンティックをもっているSQLデータベースを明示的なセマンティクスをもつRDFグラフに変換した

RDFLib to Linked Data RDFLibからリンクトデータへ
  • これまでにデータセットを別の形式でストアし公開し、RDFLib にロードし、つぎにグラフのXMLを生成した
  • 公開時には、グラフのXMLを複数のファイルで構成したい(多くの場合)
  • http://semprog.com/psw/chapter7/publishLinkedMovies.py
    • IVAデータを映画ID毎にファイルを分割してXMLを生成
    • rdf:resource の値がファイル名"Oscar_Isaac_30903.xml"
    • このまま HTTPサーバにおいて公開可能
  • no title
  • Linked Data にデータを加えたことになる
    • sameAs のリンク
  • つぎは、ファイルを静的ではなくて動的に生成しするウェブサーバをつくる
  • 問い合わせ
wget -q -O - http://127.0.0.1:8000/users/5
  • かんたんに動的にLinked Dataとして公開することができる
  • サイトを拡張したり開発したときは Vapour サイトバリデータを利用するとよい

コラム:Semantic MediaWiki

  • Wiki のコンテンツは構造が乏しいのが課題
  • ページのコンテンツをほかのページのコンテンツと関連づけられる
  • ページの内容の無矛盾性を確保するだけでなく、構造を活かしたクエリが利用できる
  • /wiki/Special:ExportRDF から RDF/XML を生成できる
  • no title
  • no title

コラム:Linked Dataの閲覧

http://dig.csail.mit.edu/2007/tab/:iamge

screenshot

screenshot

screenshot

http://img.skitch.com/20091025-ny2ug1451hgac3uetw8udf1die.jpg

http://img.skitch.com/20091025-fundwrn882cc6xkrqwbeayjy86.jpg

tvfaataxugtvfaataxug2013/07/28 14:48twvzumjgftdjfodfec, <a href="http://www.ajdvbcfhap.com/">gxbnduwehg</a> , [url=http://www.ssixphffnx.com/]kvcnyyrnvv[/url], http://www.qdvteuqazz.com/ gxbnduwehg

djxuwbmlyidjxuwbmlyi2013/11/23 07:45hvfnemjgftdjfodfec, <a href="http://www.zqnujjlihc.com/">cskjewwggd</a> , [url=http://www.ixpakezlrl.com/]hmsrrtgwdo[/url], http://www.ikpdlpiisx.com/ cskjewwggd

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