Advertisement
Advertisement

More Related Content

Slideshows for you(20)

Advertisement

Recently uploaded(20)

Advertisement

第5回LinkedData勉強会@yayamamo

  1. SPARQLを使い込む 山本泰智 ライフサイエンス統合データベースセンター
  2. 今日のお題 ほぼ1年前に開かれたLinked Data勉強会第二回でSPARQLの 基礎を学びました http://www.slideshare.net/fumihiro/sparql-8669490 今回は、Federated Queries、CONSTRUCT、データ型、関 数について紹介します 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
  3. でもその前に キーワードは、IRI rdf:typeの代わりに用いられるキー ワード「a」を除き、大文字と小文字を区別しません 関数名も同じく大文字と小文字を区別しません データサンプルは Turtle 形式で記述します スペースの都合上、多くのprefixを記述していなかったり、 元テキストからの変更を行ったりしています 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
  4. http://www.learningsparql.com/
  5. http://jena.apache.org/
  6. ng D raft ll Wo rki Last Ca http://www.w3.org/TR/sparql11-query/
  7. http://patterns.dataincubator.org/book/
  8. Meronymy founder
  9. Federated Queries 一つのSPARQLクエリで複数のSPARQLエンドポイントにク エリを発行して結果をまとめて取得 従来はプログラムを組んで行う必要があった 分散データベース環境に適した仕組みといえる 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
  10. Linked Dataとの親和性 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
  11. サブクエリとSERVICE クエリの中にクエリ(サブクエリ)を書ける SERVICEキーワードで問合せ先エンドポイントを指定 SELECT ?p ?o WHERE { SERVICE <http://ja.DBpedia.org/sparql> { SELECT ?p ?o WHERE { dbpedia:東京 ?p ?o .} } } 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
  12. BINDもキモ BINDキーワードを用いて演算結果を別の変数に代入できる PREFIX : <http://example.com/ns/expenses#> SELECT ?mealCode ?amount WHERE { ?meal :description ?description ; :amount ?amount . BIND (UCASE(SUBSTR(?description,1,3)) as ?mealCode) } 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
  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. 生成ルールとCONSTRUCT d:jane ab:hasParent d:gene . pat d: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 mike d: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. 結果 d:mike ab:hasAunt d:gene . d:jane ab:hasAunt d:joan . pat gene joan jane mike 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
  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. 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. データの型 RDFのノードはURI、空白ノード、リテラルのいずれか リテラルはプレーンか型付きのいずれか プレーンリテラルには言語タグが付けられる "New York"@en 型付きリテラルはデータ型URIが付く "2012-07-24T18:00:00"^^xsd:dateTime 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
  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. カスタムデータ型 自由に型を宣言できる "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. 関数 1 条件 SELECT ?answer WHERE { BIND ( (IF (2 > 3, "Two is bigger","Three is bigger")) AS ?answer) } 判定 SELECT ?o ?blankTest ?literalTest ?numericTest ?IRITest ?URITest WHERE { ?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. 関数 2 変換 SELECT ?o ?integerTest ?decimalTest ?floatTest ?doubleTest ? stringTest ?booleanTest ?dateTimeTest WHERE { ?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. 関数3 型付きリテラルを生成するSTRDT STRDT("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/> 文字列表現を得るstr str(<http://example.com/>) → "http://example.com/" 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
  24. 関数を使うことで得られるご利益 既存データではIDがリテラルで表現されていることも多い そこで 文字列操作をした後にURI関数でURI化することで、他の RDFデータとの関係を明確にしたデータベースをSPARQL で構築できる より構造化できる 再利用性が高まる 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
  25. 関数を用いてノードとトリプルを作る 1 PREFIX 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. 処理例 入力 @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. 関数を用いてノードとトリプルを作る 2 PREFIX 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. 処理例 @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. 言語タグ関係関数 lang と langMatches :x rdfs:label "french fries"@en-US . ?s rdfs:label ?label lang(?label) = "en" は false langMatches(lang(?label)),"en") は true STRLANG 言語タグ付きリテラルを生成する STRLANG("truck","en-US") 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
  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. 数値処理関係関数 四則演算や集合演算( 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. 日時や時間関係関数 SELECT ?mtg ?yearTest ?monthTest ?dayTest ?hoursTest ? minutesTest ?secondsTest ?timezoneTest ?tzTest ?cT WHERE { ?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. ある条件を満たさないデータを検索する 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. 実装状況に差 SPARQL1.1は未確定なこともあり、実装毎に実行可能な キーワードや関数が異なる Federated Queriesは相互運用性に難あり 第5回LinkedData勉強会 7/24 @ DBCLS 山本泰智
  35. ja.dbpedia.org や lod.ac, data.nature.com, data.allie.dbcls.jp などのサイトで実際に試す

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
Advertisement