Rick, SPIN is indeed more than a SPARQL vocabulary -- it can do SPARQL-based rules, constraints etc.
I think in your case it could be used to represent queries in RDF - which is a platform-independent way to do it. So far there is no SPIN support in Sesame, but the SPIN API is built on Jena: http://topbraid.org/spin/api/ If you're using ARQ anyway, I think you might just as well use the SPIN API. I think you should give Graphity a try, we have SPIN built-in ;) https://github.com/Graphity/graphity-processor/wiki/How-Graphity-Processor-works Martynas graphityhq.com On Thu, Jun 4, 2015 at 6:38 PM, Rick Moynihan <ric...@swirrl.com> wrote: > Hi Martynas, > > Yes I'm aware of SPIN; and I agree it's a really nice way to solve this > problem. I have a few issues with it as a solution to my problem right now > though... Which is why I didn't follow up on your suggestion earlier: > > 1) I've not had time to fully understand it. It seems SPIN is more than > just representing SPARQL queries in RDF. > > 2) It doesn't appear to have much real world support yet (the only place > I've seen it mentioned is in relation to top quadrant stuff). In > particular to my knowledge none of the stores I've used support it yet > (Sesame, Jena, Stardog, Blazegraph, GraphDB). > > I don't know if the intention is for stores to run SPIN queries; but if the > stores themselves can't process SPIN RDF queries, then to use SPIN I'd need > to parse a SPARQL into SPIN RDF. Once in RDF I can obviously easily > rewrite the query; but I then need to render the query back out into SPARQL > to use it with one of my stores. > > I skimmed the code when you posted it on the Sesame list, but couldn't > quite figure out how to use it to solve my problem. IIRC it seemed to only > do the first bit, but not the final rendering back out as SPARQL, and the > code appears also to be embedded in a larger project. > > So basically I figured it was less risky to use ARQ. > > Anyway, if I'm wrong on any of these points I'd genuinely love to know what > I can do to make use of it. > > Thanks again, > > R. > > On 4 June 2015 at 16:37, Martynas Jusevičius <marty...@graphity.org> wrote: > >> Hey, >> >> this is probably not directly relevant to your use case, but once >> again I'd like to suggest using SPIN Vocabulary as an API-neutral way >> to represent and manage SPARQL natively as RDF: >> http://spinrdf.org/sp.html >> >> I know Sesame has plans to implement support for SPIN: >> https://openrdf.atlassian.net/browse/SES-1840 >> >> Martynas >> >> On Thu, Jun 4, 2015 at 5:23 PM, Rick Moynihan <ric...@swirrl.com> wrote: >> > On 4 June 2015 at 14:08, Andy Seaborne <a...@apache.org> wrote: >> > >> >> Hi Rick, >> >> >> >> Are you in a position where you give some background on what you're >> trying >> >> to achieve overall? >> >> >> > >> > Sure. Basically we're porting some existing work of ours which was based >> > on Sesame, which would rewrite queries (and then the results on the way >> > out) using sesame's AST. We're not doing anything especially fancy... >> > mostly simple URI substitutions on URI constants, both on the query and >> > then the results; so from the query side the transformation is >> essentially >> > invisible. >> > >> > This worked great, whilst the we were using the sesame native store, as >> > we'd essentially go from SPARQL -> AST -> rewritten AST -> execution & >> > results. However we now wish to make this same code work with remote >> > stores, which essentially means we have to convert the rewritten queries >> > back into valid SPARQL queries. >> > >> > We don't care about syntactic or structural differences in queries, that >> > occur, but semantically the queries need to be isomorphic. We originally >> > tried using sesame's query renderer, but it doesn't support SPARQL 1.1 >> So >> > we thought we'd port this code to use ARQ. >> > >> > and inline ... >> >> >> >> On 04/06/15 13:49, Rick Moynihan wrote: >> >> >> >>> Hi Rob, >> >>> >> >>> Firstly thanks for filing the bug for me. >> >>> >> >>> Secondly in the case you cite, I don't understand why the query you >> cite: >> >>> >> >>> SELECT * { >> >>> SELECT ?x { ?x a ?type } >> >>> } >> >>> >> >>> Isn't converted into the SSE: >> >>> >> >>> (project (?x ?type) >> >>> (project (?x) >> >>> (bgp >> >>> (triple ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> >> >>> ?type)))) >> >>> >> >>> >> >> I hope not - that is the algebra for: >> >> >> >> SELECT ?x ?type { >> >> SELECT ?x { ?x a ?type } >> >> >> >> same effect, different way of writing it. >> >> >> > >> > I expanded the * partly because I didn't know whether SSE's represent >> > wildcards. For my particular use case either way is fine. >> > >> > Rewriting does no "optimization" however simple. >> >> >> >> Or the semantically equivalent: >> >>> >> >>> (project (?x ?type) >> >>> (bgp >> >>> (triple ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> >> ?type))) >> >>> >> >>> Both of which will OpAsQuery.asQuery back into a semantically >> equivalent >> >>> SPARQL query. >> >>> >> >>> I clearly don't quite understand the role of the SSE's and the various >> >>> representations of Query inside ARQ. >> >>> >> >> >> >> SSE is the syntax in which the ARQ internal algebra can be written out >> and >> >> read in. We do loosely talk about SSE for the alegbra but in fact theer >> >> are lots of other things that can be written in SSE. Includind RDF >> data! >> >> >> >> http://jena.apache.org/documentation/notes/sse.html >> >> >> >> SSE is just a syntax. >> >> >> >> >> >>> Essentially I was wanting to use the SSE's to convert a SPARQL query >> into >> >>> a >> >>> tree, rewrite the query tree, and convert it back into SPARQL with >> >>> OpAsQuery. >> >>> >> >> >> >> If you want to do transforms that restructure the query, that's the way >> >> I'd do it. >> >> >> > >> > That's a relief. As I've already spent 2 days porting my rewriting code >> to >> > ARQ and this style, and my only failing test case is currently with >> nested >> > sub queries. >> > >> > I think I'd misread Robs answer with regards to the semantics of * and >> > subqueries, and thought it was returning a different query! >> > >> > So am I right that once JENA-954 is fixed, round tripping should always >> be >> > possible, and should always yield a semantically equivalent query? >> > >> > >> > If you want more of a surface manipulation, and only such manipulations, >> >> e.g. rename a variable, then a transformation of the query syntax tree >> >> might be easier. I have some code for this I can contribute (written >> as an >> >> alternative to the query builder / parameterized query code). >> >> >> >> https://github.com/afs/AFS-Dev/tree/master/src/main/java/element >> >> >> >> If you think you are ever going to need the complicated part, investing >> in >> >> setting up the op based one is better. AST manipulation is a bit of a >> dead >> >> end. >> >> >> >> The OpAsQuery contract can't be query=>op=>exactly the same query >> because >> >> there ways to write two queries that lead to "the same" algebra. >> >> >> >> ARQ executes the algebra so the Op=>Query step isn't needed (or >> desirable). >> >> >> >> I had assumed that aside from handling the trivialities around >> restoring >> >>> the outer queries type (e.g. CONSTRUCT/ASK/DESRIBE etc...) that this >> would >> >>> work, and that SPARQL queries would be round tripable. >> >>> >> >>> What is the reasoning for this property not holding? I understand that >> >>> SSE's can express things that can't be expressed in SPARQL, presumably >> >>> useful once the SSE has been optimized; but why isn't every valid >> SPARQL >> >>> query round tripable, as suggested above? >> >>> >> >> >> >> We hope to have that contract (essentially, reverse the syntax to >> algebra >> >> algorithm in the SPARQL spec). >> >> >> > >> > Amazing! I think this answers my above question. >> > >> > I noticed that JENA-954 has been scheduled for 3.0.0; is that release >> > expected anytime soon? I'm not sure I know enough about JENA to provide >> a >> > patch for this issue yet, but if we could assemble one, could it be >> > included in an earlier release? >> > >> > >> > R. >> > >> > >> > Thanks again for filing the bug report for me, and answering my >> questions. >> >> >> >> Kind regards, >> >> >> >> R. >> >> >> >> On 4 June 2015 at 12:28, Rob Vesse <rve...@dotnetrdf.org> wrote: >> >> >> >> Rick >> >>> >> >>> Yes this does look like a bug >> >>> >> >>> Please bear in mind however that conversion to algebra does NOT >> guarantee >> >>> to round trip because some parts of a query do not end up in the >> algebra >> >>> and so OpAsQuery has simply no way to reconstruct the exact original >> query >> >>> >> >>> For example: >> >>> >> >>> SELECT * { >> >>> SELECT ?x { ?x a ?type } >> >>> } >> >>> >> >>> Would round trip back to just: >> >>> >> >>> SELECT ?x { ?x a ?type } >> >>> >> >>> >> >>> There are also other cases where things could move around slightly, for >> >>> example a BIND is potentially indistinguishable from a SELECT >> expression >> >>> depending on the structure of the query. >> >>> >> >>> I have filed this as JENA-954 - >> >>> https://issues.apache.org/jira/browse/JENA-954 >> >>> >> >>> Thanks for reporting this, >> >>> >> >>> Rob >> >>> >> >>> On 04/06/2015 11:45, "Rick Moynihan" <ric...@swirrl.com> wrote: >> >>> >> >>> Hi all, >> >>>> >> >>>> I have been playing around using ARQ to rewrite queries with Jena >> 2.13.0 >> >>>> and have encountered what appears to be a bug when roundtripping a >> valid >> >>>> SPARQL query through to an SSE and back out as SPARQL. >> >>>> >> >>>> The original SPARQL query is this: >> >>>> >> >>>> SELECT (COUNT(*) as ?count) { >> >>>> SELECT DISTINCT ?uri ?graph WHERE { >> >>>> GRAPH ?graph { >> >>>> ?uri ?p ?o . >> >>>> } >> >>>> } LIMIT 1 >> >>>> } >> >>>> >> >>>> This parses into the following SSE by going through >> QueryFactory.create >> >>>> -> >> >>>> Algebra.compile : >> >>>> >> >>>> #<OpProject (project (?tripod_count_var) >> >>>> (extend ((?tripod_count_var ?.0)) >> >>>> (group () ((?.0 (count))) >> >>>> (distinct >> >>>> (project (?uri ?graph) >> >>>> (graph ?graph >> >>>> (bgp (triple ?uri ?p ?o)))))))) >> >>>> >> >>>> To my eye this looks correct so far... next we round trip it back >> into a >> >>>> SPARQL query by using OpAsQuery.asQuery that results in: >> >>>> >> >>>> #<Query SELECT DISTINCT (count(*) AS ?tripod_count_var) >> >>>> WHERE >> >>>> { { SELECT ?uri ?graph >> >>>> WHERE >> >>>> { GRAPH ?graph >> >>>> { ?uri ?p ?o} >> >>>> } >> >>>> } >> >>>> } >> >>>> >> >>>>> >> >>>>> >> >>>> This now seems broken... asQuery has mixed the inner select distinct >> >>>> onto >> >>>> the outer one. This appears to happen with all sub selects. I >> suspect >> >>>> it >> >>>> might be due to OpAsQuery.asQuery building only Query object which is >> >>>> somehow being reused for all sub queries. >> >>>> >> >>>> I took a look in the unit tests and found that some of the test >> queries >> >>>> in >> >>>> TestOpAsQuery are also subject to this bug e.g. the query on line 223: >> >>>> >> >>>> SELECT ?key ?agg WHERE { { SELECT ?key (COUNT(*) AS ?agg) { ?key ?p >> ?o } >> >>>> GROUP BY ?key } } >> >>>> >> >>>> Though the tests don't seem to currently test for this kind of thing. >> >>>> >> >>>> Can anyone confirm that this is a bug? >> >>>> >> >>>> Kind regards, >> >>>> >> >>>> R. >> >>>> >> >>> >> >>> >> >>> >> >>> >> >>> >> >>> >> >> >>