-1

2 つの問題があります。

問題1

この第 1 号には適切なドキュメントが Stack にありますが、他の誰も私と同じ結果を得ていないようです。次のクエリを実行すると:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>        
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/ontology/>

SELECT DISTINCT ?person ?commonName ?nationality WHERE {
    ?person a dbpedia-owl:Person ;  
              dbpedia-owl:commonName ?commonName . FILTER(lang(?commonName) = 'en')
    ?person a dbpedia-owl:Person;
              dbpedia-owl:birthDate ?birthDate 
}
LIMIT 30

この人のリストを取得します:

スパークルの結果

偉大な。今、私は重複を切り取ろうとしています (3 つの異なる言語で 3 回登場する Abba Suan のように、英語を維持したい) 私はこれを行います:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>        
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/ontology/>

SELECT DISTINCT ?person (SAMPLE(?commonName) as ?commonName) ?birthDate WHERE {
    ?person a dbpedia-owl:Person ;  
              dbpedia-owl:commonName ?commonName . FILTER(lang(?commonName) = 'en')
    ?person a dbpedia-owl:Person;
              dbpedia-owl:birthDate ?birthDate 
}
LIMIT 30

これらの結果: 新しい SPARQL の結果

だから、私には2つのまったく異なる人々のリストがあるように思えます. この方法で人を失っていないことをどうやって知ることができますか? 特定の属性を持つウィキペディアのすべての人をダウンロードしようとしていますが、これは 2 を発行するための素晴らしいセグウェイです。

問題2

上記のコードを記述すると、これら 2 つの属性に対して正常に機能します。ただし、nationality 属性と knownFor 属性を追加しようとすると (これらが何をしたか、どこから来たかがわかります)、コードがバグります。これらの属性はすべて、DBPedia 構造の Person の同じページにあります。

このコードでは、nationality フィールドと knownFor フィールドに何も表示されません。

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>        
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/ontology/>

SELECT DISTINCT ?person (SAMPLE(?commonName) as ?commonName) ?birthDate ?nationality ?      knownFor WHERE {
    ?person a dbpedia-owl:Person ;  
              dbpedia-owl:commonName ?commonName . FILTER(lang(?commonName) = 'en')
    ?person a dbpedia-owl:Person;
              dbpedia-owl:birthDate ?birthDate .
    OPTIONAL {?person a dbpedia-owl:Person;
              dbpedia-owl:nationality ?nationality .}
    OPTIONAL {?person a dbpedia-owl:Person;
              dbpedia-owl:knownFor ?knownFor .}
}
LIMIT 30

これらの結果:

SPARQL の結果 3

問題のいずれかに対するヘルプは非常に役立ちます! ありがとう

4

1 に答える 1

1

問題1

最初のクエリ?nationalityで、クエリにない変数が使用されています。これは有効な SPARQL ですが、Virtuoso コンパイラでエラーが発生します。2番目のクエリに関しては、実際には違法なSPARQL構文です.変数をそれ自体に割り当てることはできません. Virtuoso は、SPARQL 仕様のいくつかの部分の解釈が非標準であることで有名なので、無視します。

クエリ間の唯一の実際の違い (スプリアスを除くSAMPLE()) は、同じ変数セットを選択しないため、DISTINCTオペレーターが異なる行セットを破棄する可能性があることです。

つまり、SPARQLエンジンには一貫した順序で結果を返す必要はないため、使用する場合LIMIT、エンジンが毎回同じ結果を返すという要件/保証はまったくありません。SPARQLエンジンに結果を強制的にソートさせたい場合は、節を追加できます。これORDER BYにより、使用するたびに同じ結果が得られるようになりますLIMITが、これによりクエリが遅くなります。

問題2

追加は、実際にはパフォーマンスを向上させる可能性がありますが、?person a dbpedia-owl:Person技術的には機能しません。OPTIONAL返されるすべての人にそれが存在することを確信していますか?

そのため、LIMITVirtuoso がOPTIONAL節を評価する必要のないソリューションを優先し、それによって節が機能するようになる可能性は十分にあります。これらのパターンを必須にするために を削除するOPTIONALと、そうであるかどうか、またはエントリにこれらのプロパティがないだけかがわかります。

たとえば、結果からのこのには、後者が当てはまることを示唆するオプションのプロパティが存在しません。

于 2013-07-16T00:08:22.137 に答える