You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SPARQL INSERT查询中为对象应用字面量类型

解决SPARQL INSERT中无法指定xsd:token字面量类型的问题

在处理知识图谱中大量个体的自动标识生成时,需要为每个foaf:Person个体添加去除foaf:name空格后的xsd:token类型dcterms:identifier。通过SELECT查询可以生成正确的带类型字面量,但直接在INSERT子句的三元组中使用STRDT函数会触发语法错误。

问题复现

基础图谱数据:

@prefix : <http://my.example.web/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

:1 a foaf:Person ;
    foaf:name "Jane Doe" .

:2 a foaf:Person ;
    foaf:name "John Smith" .

尝试直接在INSERT中使用STRDT的错误查询:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX dcterms: <http://purl.org/dc/terms/>

INSERT 
{
    GRAPH <http://my.example.web/> {
        ?s dcterms:identifier STRDT(?token, xsd:token) .
    }
}
WHERE {
    GRAPH <http://my.example.web/> {
        ?s foaf:name ?name .
        BIND(REPLACE(STR(?name)," ","") AS ?token) .
    }
}

错误提示:

*** Error 37000: [Virtuoso Driver][Virtuoso Server]SQ074: Line 17 (line 17 of "(console)"): SP030: SPARQL compiler, line 9: syntax error at 'STRDT' before '('

解决方案

SPARQL的INSERT模板部分不支持直接使用函数表达式,需要将带类型的字面量绑定移到WHERE子句中完成,再在INSERT中引用已绑定的变量。

修正后的INSERT查询:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX dcterms: <http://purl.org/dc/terms/>

INSERT 
{
    GRAPH <http://my.example.web/> {
        ?s dcterms:identifier ?typedToken .
    }
}
WHERE {
    GRAPH <http://my.example.web/> {
        ?s foaf:name ?name .
        BIND(REPLACE(STR(?name)," ","") AS ?token) .
        # 在WHERE阶段绑定带xsd:token类型的变量
        BIND(STRDT(?token, xsd:token) AS ?typedToken) .
    }
}

原理说明

  • 在WHERE子句中,先通过REPLACE生成去除空格的字符串?token,再用STRDT将其转换为xsd:token类型的字面量并绑定到?typedToken。
  • INSERT模板直接引用已绑定的?typedToken,避免了在模板中使用函数导致的语法错误,同时确保插入的字面量带有目标类型。

执行该查询后,个体:1和:2将分别被添加三元组:1 dcterms:identifier "JaneDoe"^^xsd:token .和:2 dcterms:identifier "JohnSmith"^^xsd:token .。

内容的提问来源于stack exchange,提问作者Luís de Sousa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:40:27