3

I am creating an RDF graph by using SPARQL CONSTRUCT statement. Following is my query:

prefix map: <#> 
prefix db: <> 
prefix vocab: <vocab/> 
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix xsd: <http://www.w3.org/2001/XMLSchema#> 
prefix d2rq: <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> 
prefix jdbc: <http://d2rq.org/terms/jdbc/>
prefix fn: <http://www.w3.org/2005/xpath-functions#> 

CONSTRUCT { 
map:database a fn:concat('d2rq:Database', ';').
map:database d2rq:jdbcDriver str(?o1).
map:database d2rq:jdbcDSN ?o2.
map:database d2rq:username ?o3.
map:database d2rq:password ?o4.
}
FROM <http://www.ndssl.vbi.vt.edu/epidl>
WHERE 
{ 
<http://www.ndssl.vbi.vt.edu/epidl#NDSSLDB> <http://www.ndssl.vbi.vt.edu/epidl#driver> ?o1.
<http://www.ndssl.vbi.vt.edu/epidl#NDSSLDB> <http://www.ndssl.vbi.vt.edu/epidl#dsn> ?o2.
<http://www.ndssl.vbi.vt.edu/epidl#NDSSLDB> <http://www.ndssl.vbi.vt.edu/epidl#username> ?o3.
<http://www.ndssl.vbi.vt.edu/epidl#NDSSLDB> <http://www.ndssl.vbi.vt.edu/epidl#password> ?o4.

}

}

I have found that fn:concat() and str() functions are not working with SPARQL CONSTRUCT. Query is giving me an error. However above mentioned functions works properly with separate select statements like followings:

fn:concat()

prefix fn: <http://www.w3.org/2005/xpath-functions#> 
select (fn:concat('d2rq:jdbcDriver', ';') AS ?p) where {?s ?p ?o} LIMIT 1

str()

select str(?o) from <http://www.ndssl.vbi.vt.edu/epidl> 
where {<http://www.ndssl.vbi.vt.edu/epidl#NDSSLDB> <http://www.ndssl.vbi.vt.edu/epidl#dsn> ?o}  

Please let me know how can I use fn:concat() and str() functions with SPARQL CONSTRUCT.

| improve this question | |
4

The CONSTRUCT clause in a SPARQL query can only contain graph patterns. Filters or functions can not be included.

To include the output of some function in your CONSTRUCT query result, you need to use a BIND operation in your WHERE clause that assigns the function output to a new variable, and then you can use that new variable in your CONSTRUCT clause.

For example, to use the output of the STR() function, you'd do something like this:

CONSTRUCT { ?s ?p ?string }
WHERE {
        ?s ?p ?o .
        BIND(STR(?o) as ?string)
 }
| improve this answer | |
  • If this answers OP'S question, then I really think this is a duplicate of one of the other questions. – Joshua Taylor Feb 18 '16 at 12:25
  • Possibly, but I didn't spot one where the answer showed a solution with BIND. I you have a duplicate I overlooked, feel free to vote to close. – Jeen Broekstra Feb 18 '16 at 18:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.