This guy answers questions on rdf and sparql Sent from my iPhone
On Dec 19, 2013, at 1:48 PM, Andy Seaborne <[email protected]> wrote: > On 19/12/13 12:29, Dibyanshu Jaiswal wrote: >> Thanks..Its Working!! >> for the query >> SELECT (NS:MYFunc(3.5) AS ?ThreeSquared) { } >> >> To my observation say suppose I use the MYFunc in a FILTER construct then >> it is invoked >> several times for each record obtained by the SPO triple pattern specified >> in the WHERE clause. > > Yes - a FILTER is applied to every row in the results it applies to. > >> I want to use it in a query like as follows: >> SELECT ?Names WHERE {?Name rdf:type NS:SomeClass. FILTER(NS:MYFunc(?Names))} >> >> So in This case for each instance of NS:SomeClass, MYFunc will be invoked. >> >> Another thing that would like to confirm is: >> 1. What will be the return type of MYFunc > > Your choice. > > The Java type must be NodeValue but a NodeValue can be a string, IRI, bNode , > number, date, etc etc - or even your own literal datatype. > > There are rules for whether a value is "true" or "false" on a FILTER - > > http://www.w3.org/TR/sparql11-query/#ebv > >> For e.g. If I want to fetch some information regarding to the Instance Name >> passed to MYFunc and the Information i want to return is some desciption of >> that Instance in say String format. >> >> I am not that much familiar with SPARQL syntax but as mentioned above, i >> want MYFunc to return some Information which is returned in the SPARQL >> query Result. > > Either in the SEELCt clause as you have currently or > > BIND(NS:MYFunc(?Names) AS ?MyVarName) > > which is an assignment and can go in a pattern. See the spec for details. > > Andy > >> >> >> >> On Thu, Dec 19, 2013 at 4:05 PM, Andy Seaborne <[email protected]> wrote: >> >>> On 19/12/13 10:10, Dibyanshu Jaiswal wrote: >>> >>>> From the reply what I can figure out is: I need to perform 2 steps. >>>> 1. To register the function class with a given URI using - >>>> FunctionRegistry.get().put(String uri, Class<?> funcClass) >>>> >>>> 2. To make a new Class for that function which extends FunctionBase1 or >>>> say >>>> implements class Function. Where I need to write my function definition >>>> in >>>> MyFunction.exec(NodeValue v){} >>>> >>>> After which I can use my defined function like any other inbuilt ARQ >>>> function. >>>> Am I right? >>>> >>> >>> Yes. >>> >>> Andy >>> >>> >>> >>>> >>>> On Thu, Dec 19, 2013 at 3:07 PM, Andy Seaborne <[email protected]> wrote: >>>> >>>> On 19/12/13 05:30, Dibyanshu Jaiswal wrote: >>>>> >>>>> Hi all! >>>>>> >>>>>> I want to define my own functions which i would like to use via a SPARQL >>>>>> query. For E.g. >>>>>> >>>>>> SELECT (<http://example/square>(3) AS ?ThreeSquared) { } >>>>>> >>>>>> 1. SELECT (<myFunctionURI>(parameter) AS ?x){} >>>>>> OR >>>>>> 2. SELECT ?names WHERE { ?names rdf:type NS:ClassA. >>>>>> FILTER(NS:myFunction(?names)} >>>>>> >>>>>> Is that possible?? >>>>>> >>>>>> The corresponding effort made by me is as follows: >>>>>> The following package : >>>>>> com.hp.hpl.jena.sparql.function.user<http://jena. >>>>>> apache.org/documentation/javadoc/arq/com/hp/hpl/jena/ >>>>>> sparql/function/user/package-summary.html>and >>>>>> its class >>>>>> UserDefinedFunctionFactory<http://jena.apache.org/ >>>>>> documentation/javadoc/arq/com/hp/hpl/jena/sparql/function/user/ >>>>>> UserDefinedFunctionFactory.html>gives >>>>>> >>>>>> a brief description of defining our own functions which supports as >>>>>> shown in Example 1 above. But I need something like Example 2 shown >>>>>> above. >>>>>> Having browsing Jena-core and ARQ Javadocs, I can find classes like >>>>>> FunctionFactory, FunctionRegistry, FunctionBase etc, by which I see some >>>>>> hope of what I want. Can I achieve this? Or such function are limited to >>>>>> the ARQ engine and cannot be expanded? >>>>>> >>>>>> To Breif: I want to define a fuction, register it with a URI and hence >>>>>> use >>>>>> it via SPARQL Query Engine as NS:myFunction() in FILTER and etc >>>>>> constructs >>>>>> of a SPARQL query. >>>>>> >>>>>> >>>>>> >>>>>> Yes - you can do that. ARQ, internally, uses the public mechanism to >>>>> add >>>>> all the additional functions that are not keywords in the langauge. >>>>> >>>>> UserDefinedFunctions are, in fact, macros for expressions. >>>>> >>>>> Completely new functionality is added by implemenign >>>>> >>>>> Take FN_Abs (which is fn:abs or <http://www.w3.org/2005/xpath- >>>>> functions#abs -- the form of the URI does not matter as the compiler >>>>> expands them all during parsing. >>>>> >>>>> The same functions act in filters and SELECT expressions. Your examples >>>>> 1 >>>>> and 2 are using the same mechanism. >>>>> >>>>> See >>>>> com.hp.hpl.jena.sparql.function.StandardFunctions >>>>> >>>>> The core function is: >>>>> >>>>> FunctionRegistry.get().put(String uri, Class<?> funcClass) >>>>> >>>>> or specifically >>>>> >>>>> registry.put( >>>>> "http://www.w3.org/2005/xpath-functions#abs", >>>>> FN_Abs.class) >>>>> >>>>> >>>>> and the implementation is >>>>> >>>>> public class FN_Abs extends FunctionBase1 >>>>> { >>>>> public FN_Abs() { super() ; } >>>>> >>>>> @Override >>>>> public NodeValue exec(NodeValue v) >>>>> { return XSDFuncOp.abs(v) ; } >>>>> } >>>>> >>>>> Your code must implement interface Function. >>>>> >>>>> There are helper classes for the cases of one, two, three and four >>>>> arguments. Functions, in general, can be variable numbers of arguments. >>>>> >>>>> FunctionRegistries can be per query execution - I've shown using the >>>>> global one which is usually all you need. >>>>> >>>>> Andy >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>> >>>> >>> >> >> >
