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 <***@apache.org>
To: ***@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
Post by Holger KnublauchPost by Adrian GschwendHi Holger,
Post by Holger KnublauchIs 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