2017-09-08 5 views
0

DBpediaに照会して、特定のアーティストの影響を受け、影響を受けるすべてを取得します。しかし、この質問はほとんどのアーティストにとって空白の結果を与えていますが、いくつかのアーティストには表示されています。たとえば、Andy Warhol(http://dbpedia.org/page/Andy_Warhol)の場合は空白ですが、Truman Capote(http://dbpedia.org/page/Truman_Capote)の場合は値がいくつかあります。私は下の質問を添付しました。特定のアーティストの影響を受けるためにdbpediaを照会します。

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX daa: <http://data.americanartcollaborative.org#> 
PREFIX cs: <http://purl.org/vocab/changeset/schema#> 
PREFIX crm: <http://www.cidoc-crm.org/cidoc-crm/> 
PREFIX crmeh: <http://purl.org/crmeh#> 
PREFIX ecrm: <http://erlangen-crm.org/current/> 
PREFIX ecrm: <http://erlangen-crm.org/current/> 
PREFIX la_vocabs: <http://linkedarc.net/vocabs/> 
PREFIX re: <http://www.w3.org/2000/10/swap/reason#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX fo: <http://www.w3.org/1999/XSL/Format#> 
PREFIX dct: <http://purl.org/dc/terms/> 
PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dul: <http://www.ontologydesignpatterns.org/ont/dul/DUL.owl#> 
PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 
PREFIX dbp: <http://dbpedia.org/property/> 
PREFIX dbc: <http://dbpedia.org/resource/Category:> 
PREFIX db: <http://dbpedia.org/> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT DISTINCT ?sub ?PersonName ?obj ?influencedPerson ? 
influencedByPerson WHERE { 
?sub rdf:type owl:Thing. 
?sub foaf:name ?PersonName. 
?sub dbo:influenced ?obj. 
?sub dbo:influencedBy ?obj. 
?obj foaf:name ?influencedPerson. 
?obj foaf:name ?influencedByPerson. 
Filter regex(?PersonName, "Andy Warhol", "i") 
} 

私の質問が間違っていることを教えてください。

答えて

2

問題はデータと両方のプロパティにありますdbo:influenceddbo:influencedByです。事実、人は、トリプルの主題または目的の位置の両方に出現することができる。 Andy Warholの場合、彼はそれらの関係を持つトリプルのオブジェクトの位置でのみ発生するケースです。 DBpediaページでは、これは "PROPERTY"のパターンで可視化されます。つまり、 "dbo:影響を受けた"と "dbo:influencedBy"です。より一般的な解決策は、特に、代替(|)と逆の組み合わせをSPARQL 1.1 property pathsを使用することです

SELECT DISTINCT ?sub ?PersonName ?obj ?influencedPerson ?influencedByPerson WHERE { 
?sub rdf:type owl:Thing. 
?sub foaf:name ?PersonName. 
?obj dbo:influenced ?sub. 
?obj dbo:influencedBy ?sub. 
?obj foaf:name ?influencedPerson. 
?obj foaf:name ?influencedByPerson. 
Filter regex(?PersonName, "Andy Warhol", "i") 
} 

:あなたがあなたのクエリを変更する必要がアンディ・ウォーホルのためのソリューションとして

^)演算子:

SELECT DISTINCT ?sub ?PersonName ?obj ?influencedPerson ?influencedByPerson WHERE { 
    ?sub rdf:type owl:Thing. 
    ?sub foaf:name ?PersonName. 
    ?sub dbo:influenced|^dbo:influenced ?obj. 
    ?sub dbo:influencedBy|^dbo:influencedBy ?obj. 
    ?obj foaf:name ?influencedPerson. 
    ?obj foaf:name ?influencedByPerson. 
    Filter regex(?PersonName, "Andy Warhol", "i") 
    } 

いくつかのコメント:

  • あなたは結果が理由だ道で同じ変数obj を(使用しているためアンディ・ウォーホルとその逆に影響を与えた人物が存在する場合、クエリは結果のみを返すように多くの余分な接頭辞の宣言に
  • を持っています前のポイントに加えて
  • )空のまま、次の2つの異なる変数
  • に同じリソースのfoaf:nameを代入しているトリプルパターン?sub rdf:type owl:Thing
意味的に「無用」であります

は、私はあなたのクエリがより多くのことのように見える必要がありますね:

SELECT DISTINCT ?sub ?PersonName ?influencedPerson ?influencedPersonName ?influencedByPerson ?influencedByPersonName WHERE { 
    ?sub foaf:name ?PersonName. 
    ?sub dbo:influenced|^dbo:influencedBy ?influencedPerson. 
    ?sub dbo:influencedBy|^dbo:influenced ?influencedByPerson. 
    ?influencedPerson foaf:name ?influencedPersonName. 
    ?influencedByPerson foaf:name ?influencedByPersonName. 
    Filter regex(?PersonName, "Andy Warhol", "i") 
} 
+0

おかげで、それは私の問題を解決しましたが、私は両方の影響を受け、同時に影響を受け照会することはできませんことに気づきました。だから私はそれらを別々に照会することにしました。もう一つの問題は、dbpediaよりも多くの結果を得ていることです(例えば、重複)。 – Sajan

+0

確かに重複がありますが、SPARQLは単にパターンマッチングです。これを避けるのはあなた次第です。確かに、クライアント側でこれを達成する方が簡単な場合もあります。 – AKSW

関連する問題