第5回LinkedData勉強会@yayamamo

11,502 views
11,441 views

Published on

第5回Linked Data勉強会で説明しました少々発展的なSPARQLの使い方についてのスライドです。基礎的な使い方については加藤さんのスライド http://www.slideshare.net/fumihiro/sparql-8669490 をご覧ください。
また、本発表についての補足を以下のページに記述しています。
http://dbcls.rois.ac.jp/~yayamamo/fsyl/2012/07/sparqlを使い込む-補足/

Published in: Technology
0 Comments
12 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,502
On SlideShare
0
From Embeds
0
Number of Embeds
7,092
Actions
Shares
0
Downloads
59
Comments
0
Likes
12
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • 第5回LinkedData勉強会@yayamamo

    1. 1. SPARQLを使い込む 山本泰智ライフサイエンス統合データベースセンター
    2. 2. 今日のお題ほぼ1年前に開かれたLinked Data勉強会第二回でSPARQLの基礎を学びましたhttp://www.slideshare.net/fumihiro/sparql-8669490今回は、Federated Queries、CONSTRUCT、データ型、関数について紹介します 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    3. 3. でもその前にキーワードは、IRI rdf:typeの代わりに用いられるキーワード「a」を除き、大文字と小文字を区別しません関数名も同じく大文字と小文字を区別しませんデータサンプルは Turtle 形式で記述しますスペースの都合上、多くのprefixを記述していなかったり、元テキストからの変更を行ったりしています 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    4. 4. http://www.learningsparql.com/
    5. 5. http://jena.apache.org/
    6. 6. ng D raft ll Wo rki Last Cahttp://www.w3.org/TR/sparql11-query/
    7. 7. http://patterns.dataincubator.org/book/
    8. 8. Meronymy founder
    9. 9. Federated Queries一つのSPARQLクエリで複数のSPARQLエンドポイントにクエリを発行して結果をまとめて取得従来はプログラムを組んで行う必要があった分散データベース環境に適した仕組みといえる 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    10. 10. Linked Dataとの親和性 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    11. 11. サブクエリとSERVICEクエリの中にクエリ(サブクエリ)を書けるSERVICEキーワードで問合せ先エンドポイントを指定SELECT ?p ?oWHERE { SERVICE <http://ja.DBpedia.org/sparql> { SELECT ?p ?o WHERE { dbpedia:東京 ?p ?o .} }} 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    12. 12. BINDもキモBINDキーワードを用いて演算結果を別の変数に代入できるPREFIX : <http://example.com/ns/expenses#>SELECT ?mealCode ?amountWHERE { ?meal :description ?description ; :amount ?amount . BIND (UCASE(SUBSTR(?description,1,3)) as ?mealCode)} 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    13. 13. CONSTRUCTで新たなトリプルを生成SELECTの代わりにCONSTRUCTを用いて結果をトリプルにCONSTRUCT { dbpedia:Joseph_Hocking ?dbpProp ?dbpVal . gp:Hocking_Joseph ?gutenProp ?gutenVal .}WHERE { SERVICE <http://DBpedia.org/sparql> { SELECT ?dbpProp ?dbpVal WHERE { dbpedia:Joseph_Hocking ?dbpProp ?dpbVal . }} SERVICE <http://www4.wiwiss.fu-berlin.de/gutendata/sparql> { SELECT ?gutenProp ?gutenVal WHERE { gp:Hoking_Joseph ?gutenProp ?gutenVal .}}} 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    14. 14. 生成ルールとCONSTRUCTd:jane ab:hasParent d:gene . patd:gene ab:hasParent d:pat ; ab:gender d:female .d:joan ab:hasParent d:pat ; gene joan ab:gender d:female .d:pat ab:gender d:male . jane miked:mike ab:hasParent d:joan .CONSTRUCT { p の親の親 g がいて、その g を ?p ab:hasAunt ?aunt . }WHERE { 親に持つ女性 aunt がいる。 ?p ab:hasParent ?parent . かつ、aunt は p の親ではない。 ?parent ab:hasParent ?g . ?aunt ab:hasParent ?g ; ab:gender d:female . そのとき、p は aunt というおば FILTER (?parent != ?aunt)} を持つ。 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    15. 15. 結果d:mike ab:hasAunt d:gene .d:jane ab:hasAunt d:joan . pat gene joan jane mike 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    16. 16. CONSTRUCTでデータ変換PREFIX v: <http://www.w3.org/2006/vcard/ns#>PREFIX : <http://example.com/myaddressbook#>CONSTRUCT { ?s v:given-name ?firstName ; v:family-name ?lastName ; v:email ?email ; v:homeTel ?homeTel .}WHERE { ?s :firstName ?firstName ; :lastName ?lastName ; :email ?email . OPTIONAL { ?s :homeTel ?homeTel . }} 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    17. 17. CONSTRUCTで内容確認CONSTRUCT { ?item dm:problem dm:prob00 . dm:prob00 rdfs:label "Amount must be an integer." .}WHERE { ?item dm:amount ?amount . FILTER ((datatype(?amount)) != xsd:integer)} 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    18. 18. データの型RDFのノードはURI、空白ノード、リテラルのいずれかリテラルはプレーンか型付きのいずれか プレーンリテラルには言語タグが付けられる "New York"@en 型付きリテラルはデータ型URIが付く "2012-07-24T18:00:00"^^xsd:dateTime 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    19. 19. 基本データ型 XML Schema datatypesで規定されている型 xsd:integer xsd:decimal xsd:float xsd:double xsd:string xsd:boolean xsd:dateTime@prefix xsd: <http://www.w3.org/2001/XMLSchema#> 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    20. 20. カスタムデータ型自由に型を宣言できる "two"^^mt:potrzebies "10"^^u:squareMeters "14"^^u:liters "30"^^u:centimeters :asfaCode rdfs:subPropertyOf skos:notation :an_agrovoc_uri :asfaCode "asf4534"^^:asfaCode datatype関数で型を取得できる なお、sub-propertyとしてもモデル化できる 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    21. 21. 関数 1条件SELECT ?answerWHERE { BIND ( (IF (2 > 3, "Two is bigger","Three is bigger")) AS ?answer)}判定SELECT ?o ?blankTest ?literalTest ?numericTest ?IRITest ?URITestWHERE { ?s ?p ?o . BIND (isBlank(?o) as ?blankTest) BIND (isLiteral(?o) as ?literalTest) BIND (isNumeric(?o) as ?numericTest) BIND (isIRI(?o) as ?IRITest) BIND (isURI(?o) as ?URITest)} 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    22. 22. 関数 2変換SELECT ?o ?integerTest ?decimalTest ?floatTest ?doubleTest ?stringTest ?booleanTest ?dateTimeTestWHERE { ?s ?p ?o . BIND (xsd:integer(?o) as ?integerTest) BIND (xsd:decimal(?o) as ?decimalTest) BIND (xsd:float(?o) as ?floatTest) BIND (xsd:double(?o) as ?doubleTest) BIND (xsd:string(?o) as ?stringTest) BIND (xsd:boolean(?o) as ?booleanTest) BIND (xsd:dateTime(?o) as ?dateTimeTest)} 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    23. 23. 関数3型付きリテラルを生成するSTRDTSTRDT("123", xsd:integer)→ "123"^^<http://www.w3.org/2001/XMLSchema#integer>STRDT("iiii", <http://example.com/romanNumeral>)→ "iiii"^^<http://example.com/romanNumeral>URIを生成するURI (IRI)URIはIRIの同義関数URI("http://example.com/") → <http://example.com/>文字列表現を得るstrstr(<http://example.com/>) → "http://example.com/" 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    24. 24. 関数を使うことで得られるご利益既存データではIDがリテラルで表現されていることも多い そこで文字列操作をした後にURI関数でURI化することで、他のRDFデータとの関係を明確にしたデータベースをSPARQLで構築できる より構造化できる 再利用性が高まる 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    25. 25. 関数を用いてノードとトリプルを作る 1PREFIX dm: <http:/ /example.com/ns/demo#>CONSTRUCT { ?locationURI rdf:type dm:Place . }WHERE { ?item dm:location ?locationValue . BIND (IF(isURI(?locationValue), ?locationValue, URI(CONCAT("http:/ /example.com/ns/data#", ENCODE_FOR_URI(?locationValue))) ) AS ?locationURI ).} 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    26. 26. 処理例入力 @prefix d: <http://example.com/ns/data#> . @prefix dm: <http:/ /example.com/ns/demo#> .d:item432 dm:cost 8 ; dm:location <http://dbpedia.org/resource/Boston> .d:item857 dm:cost 12 ; dm:location <http://dbpedia.org/resource/Montreal> .d:item693 dm:cost 10 ; dm:location "Heidelberg" .d:item126 dm:cost 5 ; dm:location <http://dbpedia.org/resource/Lisbon> .出力<http://dbpedia.org/resource/Boston> rdf:type dm:Place .d:Heidelberg rdf:type dm:Place .<http://dbpedia.org/resource/Montreal> rdf:type dm:Place .<http://dbpedia.org/resource/Lisbon> rdf:type dm:Place . 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    27. 27. 関数を用いてノードとトリプルを作る 2PREFIX im: <http:/ /example.com/ns/importedData#>PREFIX u: <http:/ /example.com/ns/units#>CONSTRUCT { ?s u:amount ?newAmount . }WHERE { ?s im:product ?prodName ; im:amount ?amount ; im:units ?units . BIND(STRDT(?amount, URI(CONCAT("http:/ /example.com/ns/units#",?units))) AS ?newAmount)} 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    28. 28. 処理例 @prefix d: <http://example.com/ns/data#> . @prefix u: <http://example.com/ns/units#> .入力 @prefix im: <http://example.com/ns/importedData#> .d:item1 im:product "kerosene" ; im:amount "14" ; im:units "liters" .d:item2 im:product "double-knit polyester" ; im:amount "10" ; im:units "squareMeters" .d:item3 im:product "gold-plated chain" ; im:amount "30" ; im:units "centimeters" .出力d:item2 u:amount "10"^^u:squareMeters .d:item1 u:amount "14"^^u:liters .d:item3 u:amount "30"^^u:centimeters . 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    29. 29. 言語タグ関係関数lang と langMatches:x rdfs:label "french fries"@en-US .?s rdfs:label ?labellang(?label) = "en" は falselangMatches(lang(?label)),"en") は trueSTRLANG言語タグ付きリテラルを生成するSTRLANG("truck","en-US") 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    30. 30. 文字列処理関係関数判定?s rdfs:label ?label .BIND (STRSTARTS(?label,"12") AS ?startsTest)BIND (STRENDS(?label,"ing") AS ?endsTest)BIND (CONTAINS(?label," ") AS ?containsTest)BIND (regex(?label,"d{3}") AS ?regexTest)その他BIND (STRLEN(?label) AS ?strlenTest)BIND (SUBSTR(?label,4,2) AS ?substrTest)BIND (UCASE(?label) AS ?ucaseTest)BIND (LCASE(?label) AS ?lcaseTest)BIND (REPLACE(?label,"ab([a-z]+)","X$1") AS ?repTest) 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    31. 31. 数値処理関係関数四則演算や集合演算( AVG, MIN, MAX, SUM, COUNT )の他 ?s dm:amount ?amount . BIND (abs(?amount) AS ?absTest ) BIND (round(?amount) AS ?roundTest ) BIND (ceil(?amount) AS ?ceilTest ) BIND (floor(?amount) AS ?floorTest ) BIND (rand() AS ?randTest ) 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    32. 32. 日時や時間関係関数SELECT ?mtg ?yearTest ?monthTest ?dayTest ?hoursTest ?minutesTest ?secondsTest ?timezoneTest ?tzTest ?cTWHERE { ?mtg t:starts ?startTime . BIND (year(?startTime) AS ?yearTest) BIND (month(?startTime) AS ?monthTest) BIND (day(?startTime) AS ?dayTest) BIND (hours(?startTime) AS ?hoursTest) BIND (minutes(?startTime) AS ?minutesTest) BIND (seconds(?startTime) AS ?secondsTest) BIND (timezone(?startTime) AS ?timezoneTest) BIND (tz(?startTime) AS ?tzTest) BIND (now() AS ?cT)} 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    33. 33. ある条件を満たさないデータを検索するSELECT ?first ?last WHERE { ?s ab:firstName ?first ; ab:lastName ?last . OPTIONAL { ?s ab:workTel ?workNum . } FILTER (!bound(?workNum))}SELECT ?first ?last WHERE { ab:workTelが無い ?s ab:firstName ?first ; データを見つける ab:lastName ?last . NOT EXISTS { ?s ab:workTel ?workNum }}SELECT ?first ?last WHERE { ?s ab:firstName ?first ; ab:lastName ?last . MINUS { ?s ab:workTel ?workNum }} 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    34. 34. 実装状況に差SPARQL1.1は未確定なこともあり、実装毎に実行可能なキーワードや関数が異なるFederated Queriesは相互運用性に難あり 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
    35. 35. ja.dbpedia.org や lod.ac, data.nature.com,data.allie.dbcls.jp などのサイトで実際に試す

    ×