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

Querying dbpedia to get influenced and influence by for a particular artist

我正在查询 DBpedia 以获得特定艺术家的所有影响和影响。但是查询为大多数艺术家提供了空白结果,但为某些艺术家提供了展示。例如,Andy Warhol (http://dbpedia.org/page/Andy_Warhol) but has some values for Truman Capote (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" ) 
}

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

问题出在数据以及属性 dbo:influenceddbo:influencedBy 中。事实上,一个人可以同时出现在三元组的主语或宾语位置。对于安迪沃霍尔来说,他只出现在具有这些关系的三元组的对象位置。在 DBpedia 页面中,这通过模式 "is PROPERTY of" 可视化,即 "is dbo:influenced of" 和 "is dbo:influencedBy of"。

作为 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" ) 
    }

一些评论:

  • 你有这么多多余的前缀声明
  • 你的查询 returns 只有当有人影响了安迪·沃霍尔时才会有结果,反之亦然,因为你使用了相同的变量 obj (顺便说一句,这就是结果仍然为空的原因)
  • 除了上一点之外,您还将同一资源的 foaf:name 分配给两个不同的变量
  • 三重模式 ?sub rdf:type owl:Thing 在语义上是 "useless"

我猜你的查询应该更像这样:

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" ) 
}