我正在构建一个应用程序,显示有关给定文本的实体的信息。我正在使用Python的sparqlwrapper库来查询DBpedia。当我得到一个Person
实体时,我正在使用以下代码:
def get_person_data(einfo):
data = {}
try:
uri = einfo['disambiguated']['dbpedia']
sparql = SPARQLWrapper("http://dbpedia.org/sparql")
query = u"""
SELECT ?birthDate, ?birthName, ?birthPlace
WHERE { <%s>
dbpprop:birthDate ?birthDate ;
dbpprop:birthName ?birthName ;
dbpprop:birthPlace ?birthPlace
}
""" % uri
sparql.setQuery(query)
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
此代码的问题是,当DBpedia页面中缺少某个字段时,结果不会返回任何内容。很难知道给定类型的所有实体中存在哪些属性,因此我想定义一些理想的属性,然后得到存在的属性。我尝试用类似的东西查询:
SELECT * WHERE {
?x rdfs:label "New York"@en.
?x dbpedia-owl:abstract ?abstract.
OPTIONAL {
?x dbpedia-owl:areaTotal ?areaTotal.
?x dbpprop:governor ?governor.
?x dbpprop:birthPlace ?birthPlace.
}
FILTER (LANG(?abstract) = 'en')
}
在这种情况下,纽约没有birthPlace
,因此我最终只获得abstract
信息。我也希望获得areaTotal
和governor
。
答案 0 :(得分:3)
整个可选块匹配或不匹配。如果您想要选择性地匹配一些不同的东西,则需要多个可选块,如
SELECT * WHERE {
?x rdfs:label "New York"@en.
?x dbpedia-owl:abstract ?abstract.
OPTIONAL { ?x dbpedia-owl:areaTotal ?areaTotal. }
OPTIONAL { ?x dbpprop:governor ?governor. }
OPTIONAL { ?x dbpprop:birthPlace ?birthPlace. }
FILTER (LANG(?abstract) = 'en')
}