我正在查询DBpedia,以获得特定艺术家的所有受影响和影响力。但是对于大多数艺术家来说,这个问题给了我一个空白的结果,但是对于一些艺术家来说却显示例如,安迪沃霍尔(http://dbpedia.org/page/Andy_Warhol)的结果是空白的,但杜鲁门卡波特(http://dbpedia.org/page/Truman_Capote)有一些值。我在下面附上了我的问题。
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" )
}
请让我知道我的查询有什么问题。
答案 0 :(得分:2)
问题在于数据以及属性dbo:influenced
和dbo:influencedBy
。实际上,一个人可以出现在三人的主体或对象位置。而对于安迪·沃霍尔来说,他的情况只发生在与这些关系三元组的对象位置。在DBpedia页面中,这可以通过&#34;的 PROPERTY 模式来显示,即&#34;是 dbo:受影响的&#34; &&#34; dbo:affectedBy of&#34;。
作为Andy Warhol的解决方案,您必须将查询更改为:
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" )
}
更通用的解决方案是使用SPARQL 1.1 property paths,特别是替代(|
)和反向(^
)运算符的组合:
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
(顺便说一句,结果仍然是空的原因)foaf:name
分配给两个不同的变量?sub rdf:type owl:Thing
在语义上是无用的&#34; 我猜您的查询应该更像这样:
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" )
}