【问题标题】:SPARQL query: How to have a new "null" element for each resultSPARQL 查询:如何为每个结果创建一个新的“null”元素
【发布时间】:2014-12-04 14:21:24
【问题描述】:

我正在使用 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)...

我想知道是否可以在同一张表中添加类似的元素

表格(博物馆-艺术品-摘要-拇指链接-personal_element_code)

如果新元素为空,则所有新元素都很好......

提前致谢

更新

我已经使用这种“类型”的查询做了一个点

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 变量” 这有点野蛮,但它有效

【问题讨论】:

    标签: sparql dbpedia


    【解决方案1】:

    正如所写,您的查询实际上不是合法的 SPARQL。投影变量之间不应有逗号。 DBpedia 的端点 Virtuoso 因允许一些非标准语法而臭名昭著。这尤其令人沮丧,因为如果您的 client 必须首先解析您的查询,那么您直接在 DBpedia Web 服务中尝试的某些操作可能无法与您的客户端库一起使用。您可以通过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 编译器:变量“x”用于查询结果集中但未分配

    但是,您可以轻松解决此问题。只需在查询正文中使用 values ?x { undef }。例如:

    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,这一切都容易得多。你可以('null' as ?x)。例如:

    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"
    

    【讨论】:

      【解决方案2】:

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

      例如

      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.}
          }
      

      【讨论】:

      • 我的印象是 OP 不是在寻找可选值,而是在寻找一种将空列引入结果集中的方法,以便 CSV 有一个“空列”(大概是匹配一些需要一些列数的处理)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多