知識を得るためのコマンドラインから



最も一般的な知識ベース標準の1つは、 RDFビューとSPARQLクエリ言語です。 データベースは通常、HTTPを介したSPARQLエンドポイントを介してアクセスされます( JenaSesameは、例えばbanana-rdfラッパーを介して埋め込みデータベースとして使用できます。また、 Virtuosoは、クエリ文字列にプレフィックス「SPARQL」を追加することでODBCを介してアクセスできます)。

ウィキペディアDBpediaによると、多くのオープンな「SPARQLアクセスポイント」があります。これは、 生物学的知識ベースの大きなセットであるジオデータです。

通常、エンドポイントにはWebインターフェースが付属していますが、ブラウザーは扱いにくいため、コマンドラインから直接アクセスしたいのです!



真剣な作業のために、データ指向言語( Rなど )を含む多くの言語に存在する既製のライブラリーを使用できます。 私たちは、情報を受信するリクエストをすばやく作成したり、リクエスト自体をデバッグしたりする機能に関心があります。



SPARQLクエリ言語は、構文的にSQLに似ており、意味的にPrologに似ています。 知識は、ノードとエッジ上の一種の「マークされた」グラフとして表されます。 「マーク」は通常URL(どこにもつながる必要はありません)であり、発信エッジのない頂点もデータ型です。 SELECTは、サブグラフテンプレートと、このテンプレートの興味のあるフィールドのリストを定義します。



Unixライクなオペレーティングシステム(Windows 10など)では、 bash、curl、および特別なjqパッケージを使用してjsonを操作できます。

curl -H "Accept: application/sparql-results+json" "http://data.semanticweb.org/sparql?query=PREFIX%20foaf%3A%20%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E%0ASELECT%20DISTINCT%20%3Fperson%20%3Fname%0AWHERE%20%7B%20%3Fperson%20a%20foaf%3APerson%3B%0Afoaf%3Aname%20%3Fname%20%7D%20LIMIT%2010" | jq .results.bindings
      
      





PowerShellを使用すると、これらすべてをより人間的に行うことができます。

SPARQLサーバーにデータを受信するリクエストを行う関数について説明します。

 function sparql_raw([String]$query, [String]$endpoint, [String]$graph="", [String]$prefix="", [String]$format="application/sparql-results+json") { $dg = if ($graph -eq "") { "" } else { "default-graph-uri=$([uri]::EscapeDataString($graph))&" } $req = "${endpoint}?${dg}query=$([uri]::EscapeDataString($prefix+$query))&format=$([uri]::EscapeDataString($format))" Invoke-RestMethod -Headers @{"Accept"=$format} -uri $req }
      
      





便宜上、デフォルト設定を設定できます。
 function prefixes([String]$key) { "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" } function defaultGraph([String]$key) { switch -Regex ($key) { "http://dbpedia.org/sparql" { "http://dbpedia.org" } default { "" } } } function sparql_raw([String]$query, [String]$endpoint="http://dbpedia.org/sparql", [String]$graph=(defaultGraph $endpoint), [String]$prefix=(prefixes $endpoint), [String]$format="application/sparql-results+json") { $dg = if ($graph -eq "") { "" } else { "default-graph-uri=$([uri]::EscapeDataString($graph))&" } $req = "${endpoint}?${dg}query=$([uri]::EscapeDataString($prefix+$query))&format=$([uri]::EscapeDataString($format))" Invoke-RestMethod -Headers @{"Accept"=$format} -uri $req }
      
      





クエリ文字列に加えて、サーバーURL、デフォルトグラフ(従来のDBMSのデータベース名に類似)、および予想される応答形式を受け取ります。 この標準では、htmlからcsvまでのさまざまな有効な形式について説明していますが、メタ情報を保持する最も単純な形式を選択しました。

答えは次のようになります。

 { "head": { "vars": [ "person", "name" ] }, "results": { "bindings": [ { "person": { "type": "uri", "value": "http:\/\/kantenwerk.org\/metadata\/foaf.rdf#me" }, "name": { "type": "literal", "value": "Knud Möller" } }, { "person": { "type": "uri", "value": "http:\/\/tomheath.com\/id\/me" }, "name": { "type": "literal", "value": "Tom Heath" } } ] } }
      
      





サーバーによっては、GETリクエストのパラメーターに応答形式が必要で、Acceptヘッダーにサーバーが必要です。 私たちの機能は、念のため、あちこちに転送します。



これで、読み取り可能な形式で答えを想像できます。

 function sparql_light([String]$query, [String]$endpoint="http://dbpedia.org/sparql", [String]$graph=(defaultGraph $endpoint)) { $res = (sparql_raw -format 'application/sparql-results+json' $query $endpoint $graph) $vars = $res.head.vars $r = $res.results.bindings foreach ($i in $r) { $h = @{} foreach ($n in $vars) { $h[$n] = $i.$n.value } new-object PSCustomObject -Property $h } }
      
      







これで、ターミナルから見上げることなく、多くの新しいことを学ぶことができます!



どの代謝経路でどの物質が関与しているかを調べます。

 sparql_light -endpoint "http://kegg.bio2rdf.org/sparql" ' select distinct ?subst ?path where { ?x <http://bio2rdf.org/kegg_vocabulary:interaction> ?y. ?x <http://bio2rdf.org/kegg_vocabulary:pathway>?p. ?p <http://purl.org/dc/terms/title> ?path. ?y <http://purl.org/dc/terms/title> ?subst. } LIMIT 100'
      
      







または、ウィキペディアのロンドンに関するデータは次のとおりです。

 sparql_light ' select distinct ?label ?type ?value where { ?x ?p <http://en.wikipedia.org/wiki/London>. ?x ?y ?value. BIND(DATATYPE(?value) as ?type). FILTER(bound(?type)). ?y <http://www.w3.org/2000/01/rdf-schema#label> ?label. FILTER (LANG(?label) = "en" ). FILTER (not exists {?x ?y ?a. ?x ?y ?b. FILTER(?a != ?b).}). }'
      
      







ハックスペースリストを取得します。

 sparql_light -endpoint "http://linkedgeodata.org/sparql" -graph "http://linkedgeodata.org" " select ?name ?addr ?home where { ?xa <http://linkedgeodata.org/ontology/Hackerspace>. ?x <http://linkedgeodata.org/ontology/addr%3Acity> ?addr. ?x <http://xmlns.com/foaf/0.1/homepage> ?home. ?x <http://www.w3.org/2000/01/rdf-schema#label> ?name. } limit 100"
      
      







IBM Researchと提携していない人を調べる:

 sparql_light -endpoint "http://data.semanticweb.org/sparql" ' PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX swrc: <http://swrc.ontoware.org/ontology#> SELECT DISTINCT ?person ?affiliation WHERE { ?personid a foaf:Person. ?personid swrc:affiliation $affiliationid. ?perfonid foaf:name ?person. ?affiliationid foaf:name ?affiliation. filter( ?affiliation != "IBM Research" && ?affiliation != "IBM Research Laboratory") } limit 100'
      
      







また、どのような興味深いクエリを思いつきましたか?

知識を得るのに幸運を!




All Articles