- From: Sandro Hawke <sandro@w3.org>
- Date: Mon, 11 Aug 2014 21:18:46 -0400
- To: Alexandre Bertails <alexandre@bertails.org>
- CC: Linked Data Platform WG <public-ldp-wg@w3.org>
- Message-ID: <53E96B76.5000503@w3.org>
On 08/11/2014 04:12 PM, Alexandre Bertails wrote:
> On Mon, Aug 11, 2014 at 11:39 AM, Sandro Hawke <sandro@w3.org> wrote:
>> Arguably we should have made a patch test suite years ago.
>>
>> Off the top of my head, here are a few patch challenges. It's not
>> necessarily a requirement that they all be done, but I think it would help
>> show the differences to see how they are done in ldpatch, etc.
> You can find the result at [1].
Impressive, thanks.
Do you have code to generate patches? I gather you made these ones by
hand.
Some syntactic concerns which I've mentioned before. My apologies if
there's been a response I missed. Also, the attendeeOf bug is still
there in the spec.
1. Why these seemingly gratuitous differences from SPARQL path expression:
- instead of ^ for inverse path operator
paths start with / instead of having it be an infix operator
?
2. Why > as the slice operator? It looks like the vast majority [1]
of languages use colon, and the the rest use "..". I think either of
those would be familiar to experienced programmers, unlike >. I
suppose I'd pick .. because colon seems too much like a pname, but I'm
fine with colon, too.
[1] http://en.wikipedia.org/wiki/Array_slicing
3. Why square brackets for filter? I'd think parens for grouping,
then = for filter would do it. Doing that and making / infix (as in
sparql) instead of prefix, we'd get:
Bind ?event <#> schema:attendeeOf/(schema:url =
<http://conferences.ted.com/TED2009/>)
Alternatively, if you keep square brackets, there's no need for the
equal sign, either for parsing, or for looking familiar.
--
I think my biggest advice, and this is what keeps making me raise my
voice during meetings -- for which I'm sorry -- is to understand that
you've created a new language here, and you have to teach it to your
audience. You can't just say "it's just patch". Your audience is going
to take a while to learn it, as they do any new language.
I'd suggest giving them a series of increasing examples, such as the
test cases I posed to you, so they can see that blank nodes get selected
from the nearest node via forward or backward arcs, then filtered if
necessary. Which makes me think....
== TEST 9
== FROM
<alice> <knows >
[ <first> "Bob", <last> "Smith" ],
[ <first> "Bob", <last> "Jones" ],
[ <first> "Charlie", <last> "Smith" ],
[ <first> "Charlie", <last> "Jones" ].
== TO
<alice> <knows >
[ <first> "Bob", <last> "Smith" ],
[ <first> "Bob", <last> "Jones" ],
[ <first> "Charlie", <last> "Smith" ],
[ <first> "Chuck", <last> "Jones" ].
== END
Every language features needs a test in the test suite, and really
should be motivated by a use case. If you allow multiple filters in
one path, provide an example where that's necessary. (I think that's
what Test 9 is.)
And just to push a tiny bit more, to make sure we can step after the filter:
== TEST 10
Somewhat artificial use of <text> but surely there are situations like this
== FROM
<alice> <knows >
[ <first> [ <text> "Bob"], <last> [ <text> "Smith"] ],
[ <first> [ <text> "Bob"], <last> [ <text> "Jones"] ],
[ <first> [ <text> "Charlie"], <last> [ <text> "Smith"] ],
[ <first> [ <text> "Charlie"], <last> [ <text> "Jones"] ].
== TO
<alice> <knows >
[ <first> [ <text> "Bob"], <last> [ <text> "Smith"] ],
[ <first> [ <text> "Bob"], <last> [ <text> "Jones"] ],
[ <first> [ <text> "Charlie"], <last> [ <text> "Smith"] ],
[ <first> [ <text> "Chuck"], <last> [ <text> "Jones"] ].
== END
Is the value of Bind unique, or can it be a set? That is, is !
implicit in bind? If not, can every path expression be re-written as a
sequence of single-step Bind operations?
To try my understanding, how's this:
Bind ?CharlieJones "Charlie" /-<text>/-<first>/[/<last>/<text> = "Jones"]!
How about three properties being needed:
== TEST 11
== FROM
<alice> <knows >
[ <first> "Bob", <middle> "A", <last> "Smith" ],
[ <first> "Bob", <middle> "B", <last> "Smith" ],
[ <first> "Bob", <middle> "A", <last> "Jones" ],
[ <first> "Bob", <middle> "B", <last> "Jones" ],
[ <first> "Charlie", <middle> "A", <last> "Smith" ],
[ <first> "Charlie", <middle> "B", <last> "Smith" ],
== TO
== END
Then I guess we'd use something like:
Bind ?BobASmith <alice> /<knows>[/<first> = "Bob"][/<middle> =
"A"][/<last> = "Jones"]!
Right?
- s
> All tests that are not about pathological graphs pass with the
> implementation matching the current spec.
> It works both with Jena, and Sesame, and the pure Scala implementation.
>
> Please read the comments inside the code for more information.
>
> Alexandre
>
> [1] https://github.com/betehess/banana-rdf/blob/d49e417c6c5560a6a852e587318da4493d25f5b1/ldpatch/src/test/scala/SandrosChallenge.scala
>
>
>> -- Sandro
>>
>>
>> ==TEST 1
>> ==FROM
>> <alice> <knows> <bob>, <charlie>.
>> ==TO
>> <alice> <knows> <bob>, <dave>.
>> ==END
>>
>>
>> ==TEST 2
>> ==FROM
>> <alice> <knows> ( <bob> <charlie> )
>> ==TO
>> <alice> <knows> ( <bob> <dave> )
>> ==END
>>
>>
>>
>> ==TEST 3
>> ==FROM
>> <alice> <knows> [ <knows> <bob> ], [<knows> <charlie>].
>> ==TO
>> <alice> <knows> [ <knows> <bob> ], [<knows> <dave>].
>> ==END
>>
>> ==TEST 4
>> ==FROM
>> <alice> <knows>
>> [ <name> "Bob" ],
>> [ <name> "Charlie"].
>> ==TO
>> <alice> <knows>
>> [ <name> "Bob" ],
>> [ <name> "Dave"].
>> ==END
>>
>> ==TEST 5 (two changes: the secound count, and the second street addr)
>> ==FROM
>> [ a <Order>;
>> <items> (
>> [ <code> "4343"; <count> 1 ]
>> [ <code> "4344"; <count> 3 ]
>> [ <code> "4347"; <count> 3 ]
>> );
>> <shipTo> [
>> a <Address>;
>> <street> [ <num> 32; <name> "Vassar St" ];
>> <city> "Cambridge";
>> <state> "MA";
>> <zip> 02139
>> ];
>> <billTo> [
>> a <Address>;
>> <street> [ <num> 32; <name> "Vassar St" ];
>> <city> "Cambridge";
>> <state> "MA";
>> <zip> 02139
>> ]
>> ].
>> ==TO
>> [ a <Order>;
>> <items> (
>> [ <code> "4343"; <count> 1 ]
>> [ <code> "4344"; <count> 2 ]
>> [ <code> "4347"; <count> 3 ]
>> );
>> <shipTo> [
>> a <Address>;
>> <street> [ <num> 32; <name> "Vassar St" ];
>> <city> "Cambridge";
>> <state> "MA";
>> <zip> 02139
>> ];
>> <billTo> [
>> a <Address>;
>> <street> [ <num> 36; <name> "Vassar St" ];
>> <city> "Cambridge";
>> <state> "MA";
>> <zip> 02139
>> ]
>> ].
>> ==END
>>
>>
>>
>> ==TEST 6
>> ==FROM
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 1
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 2
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 3
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 4
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 5
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 6
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 7
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 8
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 9
>> ]]]]]]]]].
>> ==TO
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 1
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 2
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 3
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 4
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 5
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 6
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 7
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 8
>> ]]]]]]]]].
>> <node> <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> [ <p> 0
>> ]]]]]]]]].
>> ==END
>>
>> ==TEST 7
>> ==FROM
>> _:x <a> _:y.
>> _:y <a> _:z.
>> _:z <a> _:x.
>> ==TO
>> _:x <a> _:y.
>> _:y <a> _:z.
>> _:x <a> _:z.
>> ==END
>>
>> ==TEST 8
>> ==FROM
>> <node> <p> [ <p> [ <p> [ <p> "1" ],
>> [ <p> "1" ]] ,
>> [ <p> [ <p> "1" ]]],
>> [ <p> [ <p> [ <p> "1" ] ,
>> [ <p> "1" ]],
>> [ <p> [ <p> [ <p> "1" ]]].
>> ==TO
>> <node> <p> [ <p> [ <p> [ <p> "1" ],
>> [ <p> "1" ]] ,
>> [ <p> [ <p> "1" ]]],
>> [ <p> [ <p> [ <p> "1" ] ,
>> [ <p> "1" ], [ <p> "1" ],
>> [ <p> [ <p> [ <p> "1" ]]].
>> ==END
>>
>>
Received on Tuesday, 12 August 2014 01:18:54 UTC