查询dbpedia以受特定艺术家的影响和影响

时间:2017-09-08 18:15:46

标签: sparql dbpedia

我正在查询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" ) 
}

请让我知道我的查询有什么问题。

1 个答案:

答案 0 :(得分:2)

问题在于数据以及属性dbo:influenceddbo: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" ) 
    }

一些意见:

  • 你有这么多多余的前缀声明
  • 如果有人影响Andy Warhol,您的查询只会返回结果,反之亦然,因为您使用了同一个变量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" ) 
}