1

これは、この質問の進化形です。

基本的に、リモート エンドポイントから SPARQL クエリのすべてのソリューションを取得するのに問題があります。私とほぼ同じ状況を説明しているように見えるので、セクション 2.4 を読みました。

アイデアは、ローカル RDF グラフの情報に基づいて、DBPedia からの結果をフィルタリングしたいということです。クエリは次のとおりです。

PREFIX ns1:             
<http://www.semanticweb.org/caeleanb/ontologies/twittermap#>
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT *
WHERE {
  ?p ns1:displayName ?name .
  SERVICE <http://dbpedia.org/sparql> {
    ?s rdfs:label ?name .
    ?s rdf:type foaf:Person .
  }
}

そして、得られる唯一の結果は dbpedia:John_McCain (?s の場合) です。これは、最初の 'x' の結果でジョン マケインだけが一致したためだと思いますが、すべての一致を返すクエリを取得する方法がわかりません。たとえば、次のようなフィルターを追加するとします。

SERVICE <http://dbpedia.org/sparql> {
  ?s rdfs:label ?name .
  ?s rdf:type foaf:Person .
  FILTER(?name = "John McCain"@en || ?name = "Jamie Oliver"@en)
}

次に、dbpedia:Jamie_Oliver と dbpedia:John_McCain の両方を正しく返します。このようなフィルターに具体的に追加しない限り、Jamie Oliver のように一致しないものは他にもたくさんあります。

誰かが残りの一致を抽出する方法を説明できますか? ありがとう。

4

1 に答える 1

2

この問題の原因は、SERVICE ブロックがすべての foaf:Persons を DBPedia から取得し、ローカルの Stardog データベースに基づいてそれらをフィルタリングしようとしていることが原因のようです。DBPedia を照会する場合、10,000 件の結果制限があるため、その 10,000 件の任意の Person のセットで発生する一致のみが見つかります。これを修正するために、Stardog データベース内のすべての文字列名を含む FILTER ブロックをまとめるスクリプトを作成し、それを SERVICE ブロックにアタッチしてリモートでフィルタリングすることで、10,000 件の結果制限に達するのを回避しました。次のようになります。

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX ns1: <http://www.semanticweb.org/caeleanb/ontologies/twittermap#>

CONSTRUCT{
  ?s rdf:type ns1:Person ;
    ns1:Politician .
}
WHERE {
    ?s rdfs:label ?name .
    ?s rdf:type dbo:Politician .
    FILTER(?name IN ("John McCain"@en, ...)
}
于 2017-10-22T12:39:37.177 に答える