- From: Andy Seaborne <andy@apache.org>
- Date: Wed, 5 Aug 2020 15:15:07 +0100
- To: public-rdf-star@w3.org
Implementation notes: ARQ supports <<>> in CONSTRUCT, VALUES, expressions and SPARQL Update. ---- There is one new production "TripleTerm" and then that is used in DataBlockValue (VALUES), VarOrTerm (which covers BGPs, paths update templates and expressions). ---- <<>> is a new RDFTerm Because in Jena RDFTerms are immutable, you can't create cycles. ---- There is one new operator in the algebra (TR in the paper) that is called "(find)" - it matches a <<>> pattern recursively, and assigns the top level match to a variable. Because this is fundamentally different to BIND -- (find) is multivalued and not a function of its arguments -- the syntax calls this FIND. This leaves open the possibility of writing <<>> in SPARQL expressions. Using BIND for FIND blocks this because "BIND(<<>> AS ?T)" is ambiguous in meaning. Jena supports functions on triple terms so it's in expressions whether indirect via variables or directly writing. e.g. accessors: afn:subject(<<:s :p :o>>) ==> :s constructor: afn:triple(?s, ?p, ?o) ==> << ?s ?p ?o>> if ?s ?p ?o are bound. which is what happens in CONSTRUCT. Writing a grammar that distinguishes "BIND(<<>> AS ?T)" means it can't be plain assignment. If <<>> is also to be allowed in expressions, the grammar becomes complicated (several extra productions) at this point if we stick the simple requirements of SPARQL (LL(1)) or several steps of lookahead which for some parser generators is a burden (not for ARQ which uses JavaCC). A different keyword removes all these problems. The keywords MBIND (M=multiple) or TBIND were also considered. TRIPLETERM is a bit too long! ---- The use case for separate annotations means that parsing is SA. <<:s :p :o>> :q 123 . is one triple. This flows in N-triples because "one line - one triple" is natural there. "wc -l" works on real world data and database dumps are more portable. It also means that DELETE does not need special handling. DELETE DATA { :s :p :o. } has a conditional side effect of DELETE WHERE { << :s :p :o >> ?p ?o } ; DELETE WHERE { ?s ?p << :s :p :o >> } depending on the whole update operation. Combined with multiple requests in the same update, it effectively blocks streaming. Looking up termified triples all the time seems expensive, at least without some machinery to know when a look up isn't necessary. --- These are decisions that seemed natural at the time - I'd expect Jena users at the moment to care more about compatibility across implementations. Andy On 04/08/2020 11:40, Andy Seaborne wrote: > Jena version 3.16.0 completes the supports for RDF* and SPARQL*. > > This is a "deep integration" - it is available by default in various > syntaxes and in Fuseki. The application does not need to enable it. > > It is supported in: > > text/turtle > application/n-triples > text/trig > application/n-quads > > and for storage in-memory, and persistently in TDB (both TDB1 and TDB2). > > For SPARQL results, it is available in formats > JSON, XML, TSV, and RDF Thrift (binary), text. > > > https://jena.apache.org/documentation/rdfstar/ > > Andy
Received on Wednesday, 5 August 2020 14:15:23 UTC