Once the machinery for one language is there, adding other is easy if the language has a javax.script.ScriptEngineManager (JSR 223). Groovy does. That means the custom functions can be loaded and run without the static compile/load steps for the customisations needed to get stuff into the server jar. Just ensure the language is on the classpath.
You can call java from javascript in nashorn; it does some nice idiomatic stuff like "obj.getProp()" is "obj.prop". And being highly dynamic with reflection, a bit difficult to trace mistakes! It is only a bit more complicated to create java objects but you can do that too. Andy On 8 September 2017 at 00:04, Bruno P. Kinoshita <brunodepau...@yahoo.com.br.invalid> wrote: > Maybe Groovy could be an option as well? I like the idea of being able to > customize Jena with Groovy + Grape's. > Whenever I use JavaScript I always rely on a few dependencies (e.g. > moment.js). If we allowed users to grab extra dependencies with npm that > would work as well I think. > > In Jenkins, you can customize the server behaviour, and automate pretty much > everything with Groovy. There is a Groovy console, and a few extension points > where you can plug in Groovy code. The main advantage being that there is no > translation between Groovy/Java objects. You simply call the Java objects > from within Groovy. Which means we could even call utility classes and > methods I think. > > Bruno > > From: Andy Seaborne <a...@apache.org> > To: users@jena.apache.org > Sent: Friday, 8 September 2017 1:20 AM > Subject: Re: SPIN support > > The nice things about JS functions it allows extension without java > programming, whether writing the custom function in java or having to > rebuild Fuseki to get the java code in. war files and jar+dependencies > (run with -jar) are sealed. And it isn't as hard as embedded Java like > JSPs. > > Just restricting the thoughts to SPARQL functions in JS - list of args > in, single value out. (So not property functions, not modifying the > graph data itself.) > > I came up with 3 different designs of the function calling model based > on what is passed in. > > 1/ Pass in JS values - strings, numbers, booleans, null. > > Convert the function arguments as passed in from SPARQL into JS native > things. Also, convert the return to an XSD values by inspection. The JS > writer is insulated from RDF details. > > Works really nicely for strings. > Everything could be a string, and the dynamic nature of JS will work > (caveat the overheads for simple functions called many, many times). > (Enough said about numbers in JS!) > > Other items (URIs, bNodes) can be some kind of object. If they have a > "toString()", then it works in unaware JS code. > > I've mocked this up and got it working. > > 2/ Pass in JS-ish RDFterms - e.g. [A] > > This exposes the fact the arguments are RDF terms, with datatypes and > differentiates between URIs and literals. The function writer is more > aware of RDF, such as URIs (NamedNodes in the language of [A]). > > For custom functions, I think there is less usefulness per se because > the function is not manipulating the RDF data, its working on values. > On the other hand, one way to handle RDF terms in JS is better. > > 3/ Pass in Jena Nodes or NodeValues. > > This is the raw Jena-java-RDF view. The JS function writer is exposed > to Jena details has full power. Probably not meeting the goals of ease > of use for a non-Java writing person. NodeValue.toString means the JS > writer can be semi-unaware of this. > > > Another design point is whether the JS function can call back into Jena, > if at all (well, it can't be stopped in Nashorn but that does not make > it a good idea. The result if a good function is entire defined by its > inputs. No side effects, no state.) > > For Fuseki: > > We need a library of functions to be loaded and ideally compiled once. > > We could get the JS scripts into the Context by reading from URL, or a > literal string in the file. There is a Context that is server-wide, in > the server section of a configuration file,and the one used for > execution can be added to with dataset-specific Context settings. > > Andy > > [A] https://github.com/rdfjs/representation-task-force > > On 06/09/17 22:37, Holger Knublauch wrote: >> >> >> On 6/09/2017 19:45, Adrian Gschwend wrote: >>> On 06.09.17 00:21, Holger Knublauch wrote: >>> >>> Hi Holger, >>> >>>> Is this about SPARQL functions or functions called from Java? For SPARQL >>>> functions written in JavaScript, see >>>> >>>> https://w3c.github.io/data-shapes/shacl-js/#js-functions >>> ok but that still expects the SPARQL engine to support that right? >> >> This is implemented for Jena's SPARQL functions registry here >> >> https://github.com/TopQuadrant/shacl/blob/master/src/main/java/org/topbraid/shacl/arq/SHACLJSARQFunction.java >> >> >> Holger >> >> >> >>> >>> regards >>> >>> Adrian >> > > >