Pilot error: The issue was caused by my using
SELECT DISTINCT ?g WHERE{GRAPH ?g {?s ?p ?o}}
Which finds non empty named graphs (containing one or more statements). I
should have been using:
SELECT DISTINCT ?g WHERE {GRAPH ?g{}}
Which finds empty graphs
On Aug 1, 2014, at 3:49 PM, Arthur Keen <[email protected]> wrote:
> Andy,
>
> Thanks for clearing that up. One cannot underestimate Occam's Razor. I
> switched my code back to update and replaced DELETE with DROP and that is
> working, and INSERT also works to create graphs, but using CREATE on update
> is not creating graphs.
>
> When I tried the same queries from the Fuseki control panel and observed the
> same behavior, ie., the CREATE query
>
> In SPARQL Update Panel
> CREATE SILENT GRAPH <http://testGraph10.com/graph10>
>
> In SPARQL Query Panel
> SELECT DISTINCT ?g WHERE{GRAPH ?g {?s ?p ?o}}
> ---------------------------
> | g |
> ===========================
> | <http://testGraph1> |
> | <http://booger.com/boo> |
> | <http://queries> |
> ---------------------------
> Am I missing something in the CREATE?
>
> Arthur
>
> On Aug 1, 2014, at 5:44 AM, Andy Seaborne <[email protected]> wrote:
>
>> It's DROP not DELETE in SPARQL Update.
>>
>> DELETE is for triples, DROP is for whole graphs.
>>
>> http://www.w3.org/TR/sparql11-update/#graphManagement
>>
>> On 31/07/14 22:47, Arthur Keen wrote:
>>> For executing CREATE or DELETE GRAPH in Fuseki
>>> I tried to use them the same way as SPARQL INSERT/DELETE by posting to
>>> ../ds/update, but this did not work
>>>
>>> Which Endpoint URL pattern I should use:
>>> http://localhost:8080/ds/update,
>>> http://localhost:8080/ds/graph
>>
>> There are two things here:
>>
>> 1/ SPARQL Update -- CREATE and DROP -- use the "update" endpoint
>>
>> 2/ SPARQL Graph Store Protocol -- this is not SPARQL Update -- use a
>> writeable GSP endpoint.
>>
>> GSP is normal HTTP usage on web resource GET/PUT/POST/DELETE/HEAD
>>
>> http://www.w3.org/TR/sparql11-http-rdf-update/
>>
>> what that document does is really explain how the REST(ish) use of HTTP
>> applies to graph store. It isn't defining anything new except the naming
>> scheme for graphs.
>>
>> In GSP, the app (HTTP) PUT RDF syntax (Turtle, N-triples, JSON-LD) to create
>> or replace the contents of a graph and POST to create or add to a graph.
>>
>> HTTP DELETE deletes a web resource as normal.
>>
>>>
>>> For Creating a graph do you use an http put or post request?
>>> For deleting a graph do you use an http delete request
>>>
>>> And the name of the variable to bind the query to. Using query, update,
>>> etc as variable names, see commented out lines of code below
>>> Thanks very much,
>>
>> They don't take variables.
>>
>> Just do e.g.
>>
>> INSERT DATA { GRAPH :g { :s :p :o } }
>>
>> and a graph is created for :g
>>
>> INSERT
>> { GRAPH ?g { :s :p :o } }
>> WHERE
>> { ... ?g ... }
>>
>> Whether CREATE is necessary in other situations depends on the storage
>> implementation. In Fuseki, with all the Jena provided storage
>> alternative, it is not needed.
>>
>> It's possible other storage layers need graphs creating beforehand. I
>> don't know of any. In a quad store, it's fairly irrelevant distinction.
>>
>>>
>>> Any guidance would be much appreciated
>>>
>>> Arthur
>>
>> Hope that makes it clearer,
>> Andy
>>
>>> For context, here is the node.js code that I am using to call fuseki, with
>>> commented out variations of httpreq that I have tried
>>>
>>> //http://localhost:3000/graph/create?graphName=http://testGraph
>>> app.get('/api/graph/create', function(req, res){
>>> var update = "CREATE SILENT GRAPH <?:graphName>";
>>> var graphName = req.param("graphName");
>>> update = update.replaceAll("?:"+"graphName", graphName);
>>> //httpreq.post(endpoint.getUpdateURL(), {parameters: {update:
>>> update}}, function (geterr, getres){
>>> //httpreq.post(endpoint.getGraphURL(), {parameters: {update:
>>> update}}, function (geterr, getres){
>>> httpreq.put(endpoint.getGraphURL(), {parameters: {query: update}},
>>> function (geterr, getres){
>>> if (geterr) return console.log(geterr);
>>> res.send(endpoint.getGraphURL()+" "+ update+" "+ graphName);
>>> });
>>> });
>>>
>>> //http://localhost:3000/graph/delete?graphName=http://testGraph
>>
>> If you are using the default naming /delete and /create don't exist as
>> services.
>>
>>>
>>> app.get('/graph/delete', function(req, res) {
>>> var update = "DELETE SILENT GRAPH <?:graphName>";
>>> var graphName = req.param("graphName");
>>> update = update.replaceAll("?:" + "graphName", graphName);
>>> //httpreq.post(endpoint.getUpdateURL(), {parameters: {update: update}},
>>> function(geterr, getres) {
>>> httpreq.delete(endpoint.getGraphURL(), {parameters: {graph: update}},
>>> function(geterr, getres) {
>>> if (geterr)
>>> return console.log(geterr);
>>> console.log(update);
>>> res.send(endpoint.getGraphURL());
>>> });
>>> });
>>
>>
>> If you want security, you can either front Fuseki with httpd/nginx (that's
>> advisable anyway for any java web container), or wait for Fuseki2.
>>
>> Andy
>