You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by Dibyanshu Jaiswal <dj...@gmail.com> on 2013/12/19 06:30:18 UTC

How to add User Defined functions to be used via SPARQL Query.

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.


-- 
*Dibyanshu Jaiswal*
Mb: +91 9038304989
Mb: +91 9674272265

Re: How to add User Defined functions to be used via SPARQL Query.

Posted by Mona Salem <mo...@gmail.com>.
This guy answers questions on rdf and sparql

Sent from my iPhone

On Dec 19, 2013, at 1:48 PM, Andy Seaborne <an...@apache.org> 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 <an...@apache.org> 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 <an...@apache.org> 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
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>> 
>>>> 
>>> 
>> 
>> 
> 

Re: How to add User Defined functions to be used via SPARQL Query.

Posted by Andy Seaborne <an...@apache.org>.
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 <an...@apache.org> 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 <an...@apache.org> 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
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>
>
>


Re: How to add User Defined functions to be used via SPARQL Query.

Posted by Dibyanshu Jaiswal <dj...@gmail.com>.
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.

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

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.



On Thu, Dec 19, 2013 at 4:05 PM, Andy Seaborne <an...@apache.org> 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 <an...@apache.org> 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
>>>
>>>
>>>
>>>
>>>
>>>
>>
>>
>


-- 
*Dibyanshu Jaiswal*
Mb: +91 9038304989
Mb: +91 9674272265

Re: How to add User Defined functions to be used via SPARQL Query.

Posted by Andy Seaborne <an...@apache.org>.
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 <an...@apache.org> 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
>>
>>
>>
>>
>>
>
>


Re: How to add User Defined functions to be used via SPARQL Query.

Posted by Dibyanshu Jaiswal <dj...@gmail.com>.
>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?


On Thu, Dec 19, 2013 at 3:07 PM, Andy Seaborne <an...@apache.org> 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
>
>
>
>
>


-- 
*Dibyanshu Jaiswal*
Mb: +91 9038304989
Mb: +91 9674272265

Re: How to add User Defined functions to be used via SPARQL Query.

Posted by Andy Seaborne <an...@apache.org>.
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