On 05/03/14 10:09, Miguel Bento Alves wrote:
Hi Andy,

Below, a first draft how a SPARQL command can be defined in a Jena rule.
In example 1) is defined that a
given student is diligent in a given class if he doesn't fail more than 1
lesson of that class. As this command has an aggregate clause, in the best
of my knowledge I can’t express the same thing with owl or rules. In a
same situation that I have in a project that i’m developing, I bypassed
using the clause "construct" and load the result to the data repository.
However, I cannot do this with dynamic data.

Example 2) and example 3) I took from http://spinrdf.org/. I know that i
can do the same thing using rules. However, SPARQL is a very expressive
command and there are several situations that we can better express in
SPARQL than in rules.


Example 1)

A given student is diligent in a given class if he doesn't fail more than
1 lesson of that class.

prefix exa: <http://www.example.org/example#>

(?s ex:isDiligent ?c) <-
        (select ?s ?c
        where {
                ?s exa:enroledAt ?c .
                MINUS {
                        select ?s ?c
                        {
                        select ?s ?c (count(1) AS ?nc)
                        where {
                                ?s exa:failsTo ?l .
                                ?l exa:isLessonOf ?c .
                        }
                        group by ?s ?c
                        having (?nc >= 2)
                }               
        }
        }).

Miguel - combining parsers is hard. Parsers have a nasty tendency to lookahead in the input stream so you can't just hand an input stream to a another parser especially one that looks for EOF.

Either some easy delimiter on the SPARQL expression (but messy as it'll imply escaping in that string) or a use the SPARQL parser machinery.

I wonder if it might be better to build a new syntax for "SPARQL Rules" which is SPARQL inspired using BGPs


{?s ex:isDiligent ?c } <-
        { select ?s ?c
        where {
                ?s exa:enroledAt ?c .
                MINUS {
                        select ?s ?c
                        {
                        select ?s ?c (count(1) AS ?nc)
                        where {
                                ?s exa:failsTo ?l .
                                ?l exa:isLessonOf ?c .
                        }
                        group by ?s ?c
                        having (?nc >= 2)
                }               
        }
        } .

{?r rdf:type ex:Square} <-
        {select ?r
        where {
                ?r ex:width ?width .
                ?r ex:height ?height .
                FILTER(?width != ?height) .
        }}.


Such a syntax would need to sort the functors out somehow but if SPARQL forms are inside {} (c.f. nested SELECTs ... and {} are useful as delimiters fo rthe end of the query) bare "functor(name, name, ..)" should work (I haven't tried).

        Andy

                

Example 2:
A rectangle is square if the width is equal to the height.

(?r rdf:type ex:Square) <-
        (select ?r
        where {
                ?r ex:width ?width .
                ?r ex:height ?height .
                FILTER(?width != ?height) .
        }).

err - FILTER(?width = ?height) ?!


Example 3:
The area of a rectangle is the product between the width and the height.

        
(?r ex:area ?area) <-
        unbound(?area),
        (select ?r ?area
        where {
                ?r ex:width ?width .
                ?r ex:height ?height .
                bind( ?width * ?height as ?area ) .
        }).

(?r ex:area ?area) <-
        bound(?area),
        (select ?r ?area
        where {
                ?r ex:width ?width .
                ?r ex:height ?height .
                bind( ?width * ?height as ?a ) .
                FILTER (?a = ?area) .
        }).



Miguel

On 05/03/14 08:03, "Andy Seaborne" <a...@apache.org> wrote:

Hi Miguel,

So that we know we're talking about the same thing, do you have some
concrete examples of what the SPARQL commands would look like?

This isn't to fix the design in anyway, just to have an illustration of
the ideas for the moment.

        Andy

On 04/03/14 18:18, Miguel Bento Alves wrote:
Dear all,

I¹m Miguel Bento Alves, I¹m a Phd student in New University of Lisbon. I
want to develop the project described below, that was proposed by
myself,
in Google Summer code 2014. I need a mentor with knowledge about how
Jena
is implemented to give me the guidelines to implement the project and
supervised my implementation.

Best regards, Miguel Bento Alves

On 04/03/14 18:09, "Miguel Bento Alves (JIRA)" <j...@apache.org> wrote:

Miguel Bento Alves created JENA-650:
---------------------------------------

              Summary: Define SPARQL commands in Jena rules
                  Key: JENA-650
                  URL: https://issues.apache.org/jira/browse/JENA-650
              Project: Apache Jena
           Issue Type: New Feature
             Reporter: Miguel Bento Alves


The goal of this project is allow the definition of SPARQL commands in
Jena rules. Thus, we increase the expressiveness of Jena. Something
look
alike is spin-rules, where SPIN means SPARQL Inferencing Notation, a
SPARQL-based rule [1][2]. However, the purpose is not to implement SPIN
in Jena but provide Jena with the mechanisms to take the same
expressiveness as the spin frameworks.

The main tasks of this project are:
        1. Defining how a SPARQL command can be declared in a rule. This task
encompass the discussion with the Jena community.
        2. Provide Jena with the mechanisms defined in 1.

[1] http://www.w3.org/Submission/2011/SUBM-spin-overview-20110222/
[2] http://www.w3.org/Submission/2011/SUBM-spin-sparql-20110222/



--
This message was sent by Atlassian JIRA
(v6.2#6252)






Reply via email to