SPARQL concat plus group_concat 在多个字段上
SPARQL concat plus group_concat on multiple fields
我有以下无法更改的 RDF 结构:
每个员工(经理)可以关联多个分配。我想要的输出是(包括单词 "in" 和 "&):
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
}
}
这给了我空的员工姓名和很多?描述。它似乎没有反映我的期望。
假设嵌套查询没问题,您应该在其中分配一个变量以分组连接,然后对所有未连接变量的结果进行分组。查询应如下所示:
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。
我有以下无法更改的 RDF 结构:
每个员工(经理)可以关联多个分配。我想要的输出是(包括单词 "in" 和 "&):
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
}
}
这给了我空的员工姓名和很多?描述。它似乎没有反映我的期望。
假设嵌套查询没问题,您应该在其中分配一个变量以分组连接,然后对所有未连接变量的结果进行分组。查询应如下所示:
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。