使用GROUP_CONCAT和BIND生成单个语句

时间:2018-08-24 02:51:10

标签: sparql

我正在尝试弄清SPARQL的GROUP_CONCAT函数如何工作。

以下是我正在使用的数据: http://api.aucklandmuseum.com/id/humanhistory/object/1203

该对象具有三个P43_has_dimension属性,每个属性都有其自己的值和类型(123:直径为52mm,高度为77mm,和15毫米深)。

我想退还的是“ 52mm(直径)”; “ 77毫米(高)”; “ 15mm(深度)”。换句话说,每个值及其对应的类型都放在方括号中。

在这里浏览了数十个其他问题之后,我尝试使用the following SPARQL query,但收效甚微:

PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  ecrm: <http://erlangen-crm.org/current/>
PREFIX  tdwg: <http://rs.tdwg.org/ontology/voc/Specimen#>
PREFIX  am:   <http://collections.aucklandmuseum.com/ontology/core/>
PREFIX  foaf: <http://xmlns.com/foaf/0.1/>
PREFIX  dc:   <http://purl.org/dc/elements/1.1/>

SELECT ?measure ?size (GROUP_CONCAT(?dimension ; separator='; ') AS ?dimensions)
WHERE
  {   { <http://api.aucklandmuseum.com/id/humanhistory/object/1203> ecrm:P43_has_dimension/ecrm:P90_has_value ?size }
    UNION
      { <http://api.aucklandmuseum.com/id/humanhistory/object/1203> ecrm:P43_has_dimension/ecrm:P2_has_type ?measure }
    BIND(coalesce(?size, "") AS ?size1)
    BIND(coalesce(?measure, "") AS ?measure1)
    BIND(concat(?size1, " (", ?measure1, ")") AS ?dimension)
  }
GROUP BY ?measure ?size ?dimension

这将返回6个结果,每个measuresize都在其相应的列中,但没有一个合并在dimension列中。我将不胜感激,如果有任何帮助或链接到可以帮助我解决问题的地方。谢谢。

1 个答案:

答案 0 :(得分:2)

部分麻烦是您对错误的功能进行了分组。您希望为每个主题组合不同的维度类型和值。因此,该主题必须位于您的GROUP_BY中。在您的原始查询中,只有一个主题(<http://api.aucklandmuseum.com/id/humanhistory/object/1203>),但是我们需要将其作为变量使用,以便无论如何都能对其进行分组。

此外,我认为您不需要联合和大多数其他绑定。假设每个主题的维度将始终具有类型和值,则只需执行以下操作即可:

SELECT (GROUP_CONCAT(?dim) as ?dimensions)
WHERE
  {  
    VALUES ?subject { <http://api.aucklandmuseum.com/id/humanhistory/object/1203> }
    ?subject ecrm:P43_has_dimension [ ecrm:P90_has_value ?size ;
                                      ecrm:P2_has_type ?measure ]. 
    BIND(concat(?size, " (", ?measure, ")") AS ?dim)
  } GROUP BY ?subject

当然,如果并非总是具有尺寸和尺寸的尺寸,则可以使用OPTIONAL并重新加入合并结构。