SPARQL查询:如何使用新的" null"每个结果的元素

时间:2014-12-04 14:21:24

标签: sparql dbpedia

我正在使用DBpedia Sparql端点创建的.csv文件创建项目。 对于普通查询没有问题,我使用这个有结果:

    SELECT ?museum, ?artwork, ?abstract, ?thumbnail WHERE {
?museum <http://dbpedia.org/ontology/address> ?address.
?artwork <http://dbpedia.org/ontology/location> ?museum.
?artwork <http://dbpedia.org/ontology/abstract> ?abstract.
?artwork <http://dbpedia.org/ontology/thumbnail> ?thumbnail.
 FILTER contains(?address, "Roma")
}

它会生成一个表格(博物馆 - 艺术品 - 摘要.thumblink)......

我想知道是否可以使用添加了像

这样的元素的相同表格

表(博物馆 - 艺术品 - 摘要 - thumblink - personal_element_code)

如果它们为空,那么所有新元素都是好的......

提前致谢

更新

我使用这种“善意的”查询做了一个poit

SELECT ?museum ?artwork ?abstract ('null' as ?beacon_code) WHERE {

?museum <http://dbpedia.org/ontology/address> ?address.
?artwork <http://dbpedia.org/ontology/location> ?museum.
?artwork <http://dbpedia.org/ontology/abstract> ?abstract.

 FILTER contains(?address, "Firenze")
}

注意:不要标记:“严格检查void变量” 这是野蛮的野蛮但它的作用

2 个答案:

答案 0 :(得分:1)

如上所述,您的查询实际上并不合法SPARQL。您的投影变量之间不应该有逗号。 DBpedia的端点Virtuoso因允许一些非标准语法而臭名昭着。它特别令人沮丧,因为如果您的客户端必须首先解析您的查询,那么您在DBpedia webservice中直接尝试的内容可能无法与您的客户端库一起使用。您可以在sparql.org's query validator查看查询。

在SPARQL中,您可以选择不会出现在查询中的变量,它们应该具有一种空值。也就是说,您应该能够做到:

SELECT ?museum ?artwork ?abstract ?thumbnail ?personal_element_code WHERE {

然而,这实际上并不适用于DBpedia端点(同样,Virtuoso奇怪)。例如,如果您尝试以下查询,则会收到以下错误:

select ?person ?x where {
  ?person a dbpedia-owl:Person
}
limit 10
  

Virtuoso 37000错误SP031:SPARQL编译器:变量&#39; x&#39;用于查询结果集但未分配

但是,你可以毫不费力地解决这个问题。只需在查询正文中使用值?x {undef} 即可。 E.g:

select ?person ?x where {
  values ?x { undef }
  ?person a dbpedia-owl:Person
}
limit 10

SPARQL results

如果您为此请求CSV,则会返回以下内容,其中包含您要查找的空列:

"person","x"
"http://dbpedia.org/resource/%C3%81ngel_Gim%C3%A9nez",
"http://dbpedia.org/resource/Aaron_Lines",
"http://dbpedia.org/resource/Abel_Lafleur",
"http://dbpedia.org/resource/Ada_Maimon",
"http://dbpedia.org/resource/Adam_Krikorian",
"http://dbpedia.org/resource/Albert_Constable",
"http://dbpedia.org/resource/Alex_Reid_(actress)",
"http://dbpedia.org/resource/Alex_Reid_(art_dealer)",
"http://dbpedia.org/resource/Alex_Reid_(fighter)",
"http://dbpedia.org/resource/Alex_Reid_(footballer)",

如果你真的只想要字符串null,这就容易多了。你可以(&#39; null&#39; as?x)。 E.g:

select ?person ('null' as ?x) where {
  values ?x { undef }
  ?person a dbpedia-owl:Person
}
limit 10

SPARQL results

"person","x"
"http://dbpedia.org/resource/%C3%81ngel_Gim%C3%A9nez","null"
"http://dbpedia.org/resource/Aaron_Lines","null"
"http://dbpedia.org/resource/Abel_Lafleur","null"
"http://dbpedia.org/resource/Ada_Maimon","null"
"http://dbpedia.org/resource/Adam_Krikorian","null"
"http://dbpedia.org/resource/Albert_Constable","null"
"http://dbpedia.org/resource/Alex_Reid_(actress)","null"
"http://dbpedia.org/resource/Alex_Reid_(art_dealer)","null"
"http://dbpedia.org/resource/Alex_Reid_(fighter)","null"
"http://dbpedia.org/resource/Alex_Reid_(footballer)","null"

答案 1 :(得分:0)

处理可能存在或不存在的数据项的方法是使用OPTIONAL。

e.g。

SELECT ?museum ?artwork ?abstract ?thumbnail WHERE {
    ?museum <http://dbpedia.org/ontology/address> ?address.
    ?artwork <http://dbpedia.org/ontology/location> ?museum.
    FILTER contains(?address, "Roma")
    OPTIONAL{?artwork <http://dbpedia.org/ontology/abstract> ?abstract.}
    OPTIONAL{?artwork <http://dbpedia.org/ontology/thumbnail> ?thumbnail.}
    }