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