In a certain knowledge graph there is a large number of individuals that need
to be assigned a literal token of the type xsd:token. It is not practical to
do so manually, therefore I am trying with an INSERT instruction. However, I
can't find a way to assign the desired literal type in that kind of query.
Consider in first place this basic example knowledge graph:
@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" .
The exercise would be to add a token created by removing the blank spaces from
the foaf:name literal. For the :1 this would translate into the addition of the triple:
:1 dcterms:identifier "JaneDoe"^^xsd:token .
With a SELECT query I can archive it the following
way:
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT STRDT(?token, xsd:token)
WHERE {
GRAPH <http://my.example.web/> {
?s foaf:name ?name .
BIND(REPLACE(STR(?name)," ","") AS ?token) .
}
}
Which produces the result:
LONG VARCHAR
_______________________________________________________________________________
JaneDoe
JohnSmith
2 Rows. -- 54 msec.
Now using the same formulation, but with an INSERT query:
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) .
}
}
An error is the result:
*** Error 37000: [Virtuoso Driver][Virtuoso Server]SQ074: Line 17 (line 17 of "(console)"): SP030: SPARQL compiler, line 9: syntax error at 'STRDT' before '('
In essence I need a way to apply the STRDT function to the
object of a triple inside the INSERT clause. Or any other alternative mechanism allowing to set a literal type in this kind of query.