I WROTE THIS A LONG TIME AGO. I RECOMMEND YOU USE PLAIN HTTP + JSON TO DEAL WITH SPARQL ENDPOINTS.
npm install sparql
sparql = require 'sparql'
client = new sparql.Client 'http://dbpedia.org/sparql'
client.query 'select * where { ?s ?p ?o } limit 100', (err, res) ->
console.log res
The result of calling the query() function will be a raw object conforming to the SPARQL-JSON[1] results format.
Low level function. Returns the complete SPARQL-JSON results object.
client.query 'select * where {?s ?p ?o} limit 10', (err, res) ->
console.log row.s for row in res.results.bindings
Convenience method to get to the rows directly. Builds on top of sparql.query, like most of the other query methods.
client.rows 'select * where {?s ?p ?o} limit 10', (err, res) ->
console.log row.s for row in res
Convenience method that only returns the first row in the result set
client.row 'select * where {?s ?p ?o} limit 10', (err, res) ->
console.log res.s
Convenience method that returns an array of with the first value of each row
client.col 'select distinct ?name where {?s foaf:name ?name} limit 10', (err, res) ->
console.log( rdf_value.value ) for rdf_value in res
What's with the rdf_value.value part? Read the SPARQL-JSON results format specification page.
Convenience method that returns only the first binding of the first row or NULL
client.col 'select ?name where {?s foaf:name ?name} limit 1', (err, res) ->
console.log res
There are a bunch of higher level methods that generate SPARQL for you. I am providing a small number of such methods, as I don't want this library to grow into something like Active Record.
Writing SPARQL by hand is highly encouraged.
Provide an abstraction atop a simple 'entity oriented' operation that is not so simple when you are working with SPARQL.
Imagine you want to do something like this, conceptually speaking:
aldo.name = 'Aldo'
You can get that with one simple call to the API
client.set '<urn:test:graph>', '<urn:test:aldo>', '<urn:test:name>', '"Aldo"', no, (err, res) ->
console.log 'Aldo is now named Aldo, hooray!'
Not so simple? Well, compare that to the SPARQL Update statement that gets generated under the covers:
modify <urn:test:graph>
delete { <urn:test:aldo> <urn:test:name> ?x }
insert { <urn:test:aldo> <urn:test:name> "Aldo" }
where { optional{ <urn:test:aldo> <urn:test:name> ?x } }
Notice that, if <urn:test:aldo>
had a previous <urn:test:name>
, it will be replaced. If it doesn't, then a new triple will be inserted.
You can also delete a value by setting it to null ( effectively removing one or more triples )
client.set '<urn:test:graph>', '<urn:test:aldo>', '<urn:test:name>', null, no, (err, res) ->
console.log 'Aldo went back to anonimity'
In this case, the generated SPARQL is:
delete from <urn:test:graph>
{ <urn:test:aldo> <urn:test:name> ?x }
where { <urn:test:aldo> <urn:test:name> ?x }
The 5th parameter is a boolean flag indicating whether the triple patterns should be inverted ( useful for when you only have the reversed predicate )
One Subject, several pairs Predicate-Object
Let's group some attributes of an user
attributes =
'<urn:test:username>' : 'haj'
'<urn:test:password>' : '123'
'<urn:test:name>' : 'Herman'
And we invoke mset
client.mset '<urn:test:graph>', <urn:test:haj>', attributes, (err, res) ->
if err?
console.log 'Success'
else
console.log 'Error: ' + err
The SPARQL query generated is:
INSERT INTO <urn:test:graph>
{ <urn:test:haj> <urn:test:username> 'Haj';
<urn:test:password> '123';
<urn:test:name> 'Herman'. }
You must have OpenLink Virtuoso >= 6.1.2 installed and virtuoso
, isql
in your path.
Also, maybe you have to set Virtuoso to allow INSERT and DELETE to be done via sparql:
$ isql
SQL> grant execute on DB.DBA.SPARQL_MODIFY_BY_DICT_CONTENTS to "SPARQL";
You must also have expresso npm install expresso
(Coming Soon)