CONSTRUCT/WHERE 中的 SPARQL 函数
SPARQL functions in CONSTRUCT/WHERE
我主要使用 SPARQL SELECT 进行查询以进行调试,但最后我想以 CONSTRUCT 方式使用最终结果;因为我想使用图表而不是 key/value 查询结果。
我还没有得到(并且似乎无法通过搜索 engines/docs 找到)的是我是否也可以那样使用函数。例如,我使用 属性 路径连接我进入 "superstring" 的标题,稍后我将其用于构建 Lucene 索引以提高纯文本搜索质量:
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT (group_concat(?title ; separator = " ") AS ?fancytitle) WHERE {
GRAPH ?graph {
<http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> dc:relation+ ?relation .
?relation dc:title ?title .
}
}
现在我想拥有与 ?fancytitle
相同的新三元组
<http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> <fancytitle> ?fancytitle .
所以我可以直接将它存储在一个新的图表中。这可能吗?我尝试了一些查询,但无法让 SPARQL 处理器接受它。仅供参考,我正在使用 Fuseki。
你可以在我的 SPARQL Endpoint
试试
是的,这是可能的
您不能在 CONSTRUCT
模板中直接使用表达式,但您可以通过子查询中的 SELECT
表达式或使用 WHERE
子句中的变量赋值BIND
.
在你的情况下,GROUP_CONCAT
是一个聚合,它只能是一个 SELECT
表达式,所以你只需要将整个 SELECT
作为子查询,例如
PREFIX dc: <http://purl.org/dc/elements/1.1/>
CONSTRUCT
{
<http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> <http://fancyTitle> ?fancytitle
}
WHERE
{
SELECT (group_concat(?title ; separator = " ") AS ?fancytitle) WHERE {
GRAPH ?graph {
<http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> dc:relation+ ?relation .
?relation dc:title ?title .
}
}
}
以上在您的端点上运行良好
在我同事的帮助下,我们让它开始工作,UNION
和 GROUP BY
是必不可少的。此查询将图中所有 locah:ArchivalResource
的字符串放在一起:
CONSTRUCT
{
?archresource skos:hiddenLabel ?supertitle
}
WHERE
{
SELECT ?archresource (group_concat(?title ; separator = ", ") AS ?supertitle) WHERE {
GRAPH ?graph {
{
SELECT ?title ?archresource WHERE {
GRAPH ?graph {
{
?archresource a locah:ArchivalResource ;
dc:title ?title .
} UNION
{
?archresource dc:relation+ ?relation .
?relation dc:title ?title .
}
}
}
}
}
} GROUP BY ?archresource
}
我主要使用 SPARQL SELECT 进行查询以进行调试,但最后我想以 CONSTRUCT 方式使用最终结果;因为我想使用图表而不是 key/value 查询结果。
我还没有得到(并且似乎无法通过搜索 engines/docs 找到)的是我是否也可以那样使用函数。例如,我使用 属性 路径连接我进入 "superstring" 的标题,稍后我将其用于构建 Lucene 索引以提高纯文本搜索质量:
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT (group_concat(?title ; separator = " ") AS ?fancytitle) WHERE {
GRAPH ?graph {
<http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> dc:relation+ ?relation .
?relation dc:title ?title .
}
}
现在我想拥有与 ?fancytitle
相同的新三元组
<http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> <fancytitle> ?fancytitle .
所以我可以直接将它存储在一个新的图表中。这可能吗?我尝试了一些查询,但无法让 SPARQL 处理器接受它。仅供参考,我正在使用 Fuseki。
你可以在我的 SPARQL Endpoint
试试是的,这是可能的
您不能在 CONSTRUCT
模板中直接使用表达式,但您可以通过子查询中的 SELECT
表达式或使用 WHERE
子句中的变量赋值BIND
.
在你的情况下,GROUP_CONCAT
是一个聚合,它只能是一个 SELECT
表达式,所以你只需要将整个 SELECT
作为子查询,例如
PREFIX dc: <http://purl.org/dc/elements/1.1/>
CONSTRUCT
{
<http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> <http://fancyTitle> ?fancytitle
}
WHERE
{
SELECT (group_concat(?title ; separator = " ") AS ?fancytitle) WHERE {
GRAPH ?graph {
<http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> dc:relation+ ?relation .
?relation dc:title ?title .
}
}
}
以上在您的端点上运行良好
在我同事的帮助下,我们让它开始工作,UNION
和 GROUP BY
是必不可少的。此查询将图中所有 locah:ArchivalResource
的字符串放在一起:
CONSTRUCT
{
?archresource skos:hiddenLabel ?supertitle
}
WHERE
{
SELECT ?archresource (group_concat(?title ; separator = ", ") AS ?supertitle) WHERE {
GRAPH ?graph {
{
SELECT ?title ?archresource WHERE {
GRAPH ?graph {
{
?archresource a locah:ArchivalResource ;
dc:title ?title .
} UNION
{
?archresource dc:relation+ ?relation .
?relation dc:title ?title .
}
}
}
}
}
} GROUP BY ?archresource
}