多个字段上的SPARQL concat plus group_concat

时间:2016-12-13 04:25:23

标签: sparql rdf owl

我有以下无法更改的RDF结构: enter image description here

可以将多个分配与每个员工(Manager)相关联。我喜欢的输出(包括""和"&):

Employee Name   | Assignment

Name 1          | Assignment1 in Location1 & Assignment2 in Location2 &....
Name 2          | Assignment1 in Location2 & Assignment3 in Location1 &....

有没有办法在Sparql中执行此操作?

这是我到目前为止所做的:

select ?name group_concat(DISTINCT ?description; separator("&"))
where
{
  ?employee :hasName ?name
  {
  select concat(?name, "In", ?location)
  ?employee ^:hasManager/:hasAsstName ?name
  ?employee ^:hasManager/:hasLocation ?location
  }

}

这给了我空的员工姓名和很多?描述。它似乎没有反映出我的期望。

1 个答案:

答案 0 :(得分:3)

假设嵌套查询没问题,您应该在那里为变量分配一个变量,然后将所有非连接变量的结果分组。查询应如下所示:

select ?name (group_concat(DISTINCT ?description; separator = " & ") as ?descriptions)
where
{
  ?employee :hasName ?name
  {
  select (concat(?name, " in ", ?location) AS ?description)
  ?employee ^:hasManager/:hasAsstName ?name
  ?employee ^:hasManager/:hasLocation ?location
  }

}

GROUP BY ?name

请注意GROUP_CONCAT

的语法

如果删除子查询,则速度会快得多。由于我没有您的数据,这里有一个非常类似的DBpedia查询,而不是使用子查询:

SELECT ?name (GROUP_CONCAT(DISTINCT ?SpouseInfo; separator = " & ") AS ?SpousesInfo)

{
    ?name a foaf:Person;
    dbo:spouse ?spouse.
    ?spouse dbo:residence/rdfs:label ?residence;
    rdfs:label ?spouse_name

    BIND (CONCAT(?spouse_name, " lives in ",?residence) AS ?SpouseInfo)
}
GROUP BY ?name
ORDER BY ?name

LIMIT 100

此处the result