On Aug 3, 2014, at 4:17 AM, Andy Seaborne <[email protected]> wrote:

> On 02/08/14 19:47, Arthur Keen wrote:
>> 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{}}
> 
> (DISTINCT not needed)
> 
>> 
>> Which finds empty graphs
> 
> Sort of :-)
> 
> The default in-memory dataset knows about empty graphs because it's a map of 
> (URI->Graph).  TDB does not because it is a set of triples and a set of quads 
> with no separate graph management.
> 
> So in TDB the names of all graphs is calculated by looking in the graph field 
> of the quads with the effect that no quad (no triple in graph) means no name. 
>  It is like (but more efficient) than the first way with {?s ?p ?o}.
> 
>       Andy

Thanks, that explains your earlier comment about CREATE being irrelevant for 
quad stores - no quads; no named graph. In this particular case, the query 
result is dependent on the physical implementation...

Arthur

> 
>> 
>> 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
>>> 
>> 
>> 
> 

Reply via email to