Hello, Since the topic has come up. I've put together an implementation of all the GeoSPARQL modules which I was getting around to discussing contributing.
It has dependencies on JTS, for spatial relations and distances etc., and GeoTools, for coordinate reference system conversions. I think the remainder are Apache dependencies. The only item to implement was additional unit tests. Would this be suitable for incorporating into Jena or better as an extending project? Also, the GeoSPARQL function namespace mentioned by the OP seems incorrect. The published namespace is: geof: http://www.opengis.net/def/function/geosparql/ Thanks, Greg From: Andy Seaborne Sent: Friday 24 August, 18:29 Subject: Re: Spatial distance in Fuseki To: users@jena.apache.org (PS JENA-664 is the open JIRA for GeoSPARQL) A complete example with imports etc: https://gist.github.com/afs/a8dfe6680324110bdb675190f9c73035 and also below. This is for doing everything in one java program. It is the simplest way and runs in an IDE for debugging. > My main problems in understandig are: > - where to put the java code and how to name it It will have a URI name. From the example below: // Register the function FunctionRegistry ref = FunctionRegistry.get(); ref.put("http://my/num", MyFunction.class); using the global function registry (you can have one uique to the dataset if you want as well but the joy of globally unique URIs is that putting it the JVM-registry just works. > - how to include it with Fuseki The example below is the simplest way using embedded Fuseki. It's a plain Java program and avoids the need to repack jar files which for development makes things easier and can be debugged in an IDE. If you want to create a packaged standalone jar file, this is a a template: "basic" is a standalone jar using embedded Fuseki and with a command line interface. https://github.com/apache/jena/tree/master/jena-fuseki2/jena-fuseki-basic It makes: http://jena.apache.org/documentation/fuseki2/fuseki-embedded.html#fuseki-basic so using that, adding your own code and making the command line start register the function should work. > - how to call it in the SPARQL query Functions are invoked like: (?Z) which is URI + arguments. The URI can a prefixed name as well; prefixes and expanded during parsing and it is the URI that matters. BIND ((?Z) AS ?X ) FILTER((?Z) = "number") Andy ------------------------ https://gist.github.com/afs/a8dfe6680324110bdb675190f9c73035 and with slight reformatting: public class FuFunctionEx { /** Our function */ public static class MyFunction extends FunctionBase1 { @Override public NodeValue exec(NodeValue v) { if ( v.isNumber() ) return NodeValue.makeString("number"); return NodeValue.makeString("not a number"); } } public static void main(String...a) { FusekiLogging.setLogging(); // Register the function FunctionRegistry ref = FunctionRegistry.get(); ref.put("http://my/num", MyFunction.class); int PORT = FusekiLib.choosePort(); // Some empty dataset DatasetGraph dsg = DatasetGraphFactory.createTxnMem(); FusekiServer server = FusekiServer.create() .setPort(PORT) .add("/ds", dsg) .build(); server.start(); // Test query. String queryString = StrUtils.strjoinNL( "SELECT * { " , " VALUES ?Z { 123 'abc'}" , " BIND ((?Z) AS ?X )" ,"}" ); try { String url = "http://localhost:"+PORT+"/ds"; // Connect to the server and execute the query. try ( RDFConnection conn = RDFConnectionFactory.connect(url) ) { // Using Java8 features. conn.queryResultSet(queryString, ResultSetFormatter::out); // Without Java8 features try ( QueryExecution qExec = conn.query(queryString) ) { ResultSet rs = qExec.execSelect(); ResultSetFormatter.out(rs); } } } catch (Exception ex) { ex.printStackTrace(); } finally { server.stop(); } } } Andy