如何在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
相关产品推荐
相关产品推荐

