我正在尝试弄清SPARQL的GROUP_CONCAT
函数如何工作。
以下是我正在使用的数据: http://api.aucklandmuseum.com/id/humanhistory/object/1203
该对象具有三个P43_has_dimension
属性,每个属性都有其自己的值和类型(1,2,3:直径为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个结果,每个measure
和size
都在其相应的列中,但没有一个合并在dimension
列中。我将不胜感激,如果有任何帮助或链接到可以帮助我解决问题的地方。谢谢。
答案 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并重新加入合并结构。