So using a generic dataset, I could create a dynamic dataset determining the graph uris and named graph uris from the query. Thanks so much!
Cheers, Willie > On Feb 9, 2015, at 16:09, Andy Seaborne <[email protected]> wrote: > > You'll notice that the query: > > static final String fromAliceQuery = "" + > "SELECT (COUNT(*) AS ?count)\n" + > "WHERE {\n" + > " GRAPH <"+aliceGraphUri+"> { ?s ?p ?o . }\n" + > "}\n"; > > gets the same answers in both cases (count of 2). > > Using FROM will: > >>> FROM/FROM NAMED completely overrides the dataset to be queried. > > I got that the wrong way round. If you pass in a dataset, it will use that > dataset. In effect, it ignores the FROM. > > Calling > queryDataset(null, fromAliceQuery); > will illustrate that (you get a 404). > > > 1/ Default dataset - You gave it a dataset so the dataset has empty default > graph and 2 named graphs. > > { ?s ?p ?o . } matches on the empty default - no results. > > To access the named graphs, GRAPH is needed. > > 2/ TDB dataset: Picks the graph http://example.org/alice out of the dataset > and puts it in a new dataset with that as the default graph. > > TDB dataset, dynamic datasets applies. > > { ?s ?p ?o . } matches the default graph which is a link to a specific graph > (the alice graph) from the dataset. > > Or use unionDefaultGraph in which case the default graph is the union of all > the named graph, hiding any real default graph. > > Andy > >> On 09/02/15 18:52, Willie Milnor wrote: >> Andy, >> >> Thanks for your reply, and for any further assistance/clarification. >> >> I've previously read the link to dynamic datasets, which seems to be >> specific to TDB datasets. I am also familiar with as well as section 13.2 >> of the SPARQL spec, and I understand the differences in GRAPH and FROM/FROM >> NAMED. >> >> But what I'm seeing is that the use of FROM results in different query >> results from a general Dataset as opposed to a TDB datasets, even loaded >> with the same quads. I'm not trying to pull data from the web, >> necessarily, rather I am loading it from a set of files. >> >> Below is my code. I am loading the same quads into both the general >> Dataset and the TDB dataset. When run, the count query returns 0 against >> the Dataset and 2 against the TDB dataset. >> >> Code: >> >> static final String aliceGraphUri = "http://example.org/alice"; >> static final String bobGraphUri = "http://example.org/bob"; >> static final String fromAliceQuery = "" + >> "SELECT (COUNT(*) AS ?count)\n" + >> "FROM <"+aliceGraphUri+">\n" + >> "WHERE {\n" + >> " ?s ?p ?o .\n" + >> "}\n"; >> /** >> * @param args >> */ >> public static void main(String[] args) { >> Dataset defaultDataset = DatasetFactory.createMem(); >> Dataset tdbDataset = TDBFactory.createDataset("C:/tempTDB"); >> populateDataset(defaultDataset); >> populateDataset(tdbDataset); >> System.out.println("\n---------------------------------" + >> "-------------------\nFROM "+aliceGraphUri+"\n"); >> queryDataset(defaultDataset, fromAliceQuery); >> queryDataset(tdbDataset, fromAliceQuery); >> } >> >> private static void populateDataset(Dataset dataset) { >> DatasetGraph datasetGraph = dataset.asDatasetGraph(); >> datasetGraph.add(new Quad( >> NodeFactory.createURI(bobGraphUri), // graph name >> NodeFactory.createURI("urn:bob"), >> NodeFactory.createURI("http://xmlns.com/foaf/0.1/name"), >> NodeFactory.createLiteral("Bob"))); >> >> datasetGraph.add(new Quad( >> NodeFactory.createURI(bobGraphUri), // graph name >> NodeFactory.createURI("urn:bob"), >> NodeFactory.createURI("http://xmlns.com/foaf/0.1/mbox"), >> NodeFactory.createURI("mailto:bob@example"))); >> // add data to the alice named graph >> datasetGraph.add(new Quad( >> NodeFactory.createURI(aliceGraphUri), // graph name >> NodeFactory.createURI("urn:alice"), >> NodeFactory.createURI("http://xmlns.com/foaf/0.1/name"), >> NodeFactory.createLiteral("Alice"))); >> >> datasetGraph.add(new Quad( >> NodeFactory.createURI(aliceGraphUri), // graph name >> NodeFactory.createURI("urn:alice"), >> NodeFactory.createURI("http://xmlns.com/foaf/0.1/mbox"), >> NodeFactory.createURI("mailto:alice@example"))); >> } >> private static void queryDataset(Dataset dataset, String sparql) { >> Query query = QueryFactory.create(sparql); >> QueryExecution qexec = QueryExecutionFactory.create(query, dataset); >> ResultSetFormatter.out(qexec.execSelect()); >> qexec.close(); >> } >> >> >> >> >>> On Mon, Feb 9, 2015 at 1:08 PM, Andy Seaborne <[email protected]> wrote: >>> >>>> On 09/02/15 15:07, Willie Milnor wrote: >>>> >>>> Hello, >>>> >>>> I want to be able to load a set of ontologies into dataset in order to be >>>> able to have named graph support in my SPARQL queries against said >>>> dataset. Specifically, I would like to be able to use FROM, FROM NAMED, >>>> and GRAPH clauses in my SPARQL. >>>> >>>> From my investigation, it appears that full named graph support is only >>>> available with TDB datasets, but not available when creating a dataset >>>> using DatasetFactory. Specifically, against a DatasetFactory created >>>> dataset, using FROM in the query appears to have no affect at all, and >>>> even >>>> using FROM NAMED has no affect over simply having GRAPH in the query. >>>> >>>> Am I correct, or is there something I'm missing? Perhaps there is a >>>> specific implementation of DatasetGraph that I should be creating? >>>> >>>> I have sample code, but thought I'd simply ask the question in hopes that >>>> there's a simple answer, either way. Please let me know if the sample >>>> code >>>> will be useful. >>> GRAPH and FROM/FROM NAMED do different things. >>> >>> GRAPH accesses named graphs in the dataset (i.e. happens during query >>> execution) >>> >>> FROM/FROM NAMED describe the dataset to be queried (i.e. happens before >>> the query starts). >>> >>> FROM/FROM NAMED completely overrides the dataset to be queried. >>> >>> In the case of a TDB dataset, the FROM/FROM NAMED pick graph out of the >>> dataset to form a new one specifically for the query. >>> >>> https://jena.apache.org/documentation/tdb/dynamic_datasets.html >>> >>> For a general query, on a general Dataset from DatasetFactory, the graphs >>> are drawn from the web at large. >>> >>> If you want FROM/FROM NAMED to pull graphs from the web, use a general >>> dataset. >>> >>> If you want some graphs from a TDB dataset and some from the web at large, >>> create a general Dataset, and add graphs from TDB. >>> >>> If you use a TDB dataset alone, you can't have dynamic data from the web. >>> It's database, not a web cache. >>> >>> Andy >
