On 10/03/14 23:07, Miguel Bento Alves wrote:
Hi Andy,
Why not create a private word?
Something like:
(?r rdf:type ex:Square) <-
execSPARQL(select ?r
where {
?r ex:width ?width .
?r ex:height ?height .
FILTER(?width = ?height) .
}).
How do you find the string?
The parser sees 'execSPARQL' '(' then what?
how does it know where the close is?
You can't call the SPARQL parser - the rules parser has already read
ahead at least one char to deal with the '(' token. The SPARLQ parser
needs know when the subparse has finished, especially as SPARQL has
trailing elements like LIMIT, and if it sees the trailing ')' it will
throw a parser error.
You need to find the whole string, then pass it to the SPARQL parser.
So how do you find the string? How do you find the matching ')' The
SPARQL query has ')' in it. Why isn't that the end?
Caution needed;
SELECT * { ?s ?p "I am a string with an unmatched ) characters" }
Hence the solution of ```
See ```, skip to find the next ``` and then the bit in between is the
string. ``` in SPARQL is very unlikely. It can be escaped if you want
to do a complete job but this escape level is specific to the SPARQL
string finder (remove before passing to the SPARQL parser).
Let's make this a concrete dicussion. The rules parser is inner class
Parser in com.hp.hpl.jena.reasoner.rulesys.Rule.
What changes will be needed?
Andy
Miguel
On 10/03/14 15:16, "Andy Seaborne" <a...@apache.org> wrote:
On 09/03/14 22:35, Miguel Bento Alves wrote:
Hi Andy,
"I wonder if it might be better to build a new syntax for "SPARQL Rules"
which is SPARQL inspired using BGPs"
Yes, it is a good possibility. You, better than me for sure, know the
issues carried by the syntax.
And, what about something like:
(?r rdf:type ex:Square) <-
{select ?r
where {
?r ex:width ?width .
?r ex:height ?height .
FILTER(?width = ?height) .
}}.
The issue is to be able to find the SPARQL string part.
The easiest way to integrate the two is to be able to take a SPARQL
query string out of the rules syntax, and call the SPARQL parser on the
string.
But that needs finding the string to be identified before calling the
SPARQL parser.
Putting inside some obvious delimiters is one way but { ... } is not
simple because {} occurs inside SPARQL itself. (yes you can count
nestings .. until it appears in a ""-string as a single brace).
It's like the CDATA problem in XML.
One way is to use a delimiter that is not SPARQl related.
``` springs to mind and then just assume it never occurs inside SPARQL,
or of it does it's needs special quoting like \''' if used in rules.
This is all outside the SPARQL parser. It's just trying to
find the start and end of the string to pass to the SPARQL subsystem.
Whatever way you choose, it's need at least tinkering with the current
rules parser, or building a new syntax for "SPARQL Rules" (more work).
How comfortable are you in modifying the parser or creating a new one?
the ideia is combine SPARQL with rules. I will be possible rules like:
(?a ?b ?c) <-
(?a ?b ?d),
{select ?a
where {a? ?e ?f .}
group by ?a
having (count(1) > 1)
}.
Do you think that is complicate? However, I think that there is no
problem
to have rules only based on SPARQL.
BTW, do you think that I can get a mentor for this project?
As you'll have noticed, we are mentor-limited.
Some of the projects, JENA-632 (Custom JSON output) and JENA-491
(CONSTRUCT quads), aren't going to happen unless a mentor appears.
I can deal with at most 2.
And if it aligns in some way with my day job, that makes 2, rather than
1, more likely.
Andy
Miguel
On 09/03/14 17:42, "Andy Seaborne" <a...@apache.org> wrote:
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)