- From: Pierre-Antoine Champin <pierre-antoine.champin@ercim.eu>
- Date: Tue, 24 Nov 2020 09:40:44 +0100
- To: "Peter F. Patel-Schneider" <pfpschneider@gmail.com>, public-rdf-star@w3.org
- Message-ID: <6bb325c4-f02f-4e1a-8c25-f1efa39d3cc6@ercim.eu>
Peter,
thanks for this proposal; this is in fact quite similar to what I had in
mind in my proposal in issue 37 [1].
Two remarks:
1) Is it really necessary that N transforms literals? I find this quite
intrusive that a simple graph such as:
:xavier :name "Xavier".
would be encoded as another graph... (of course, you can use a less
probable marker than "X", but still...).
Since the only rdf*:subject*/rdf*:predicate/rdf*:object triples in the
encoded graph are those generated by the mapping, I don't think values
need to be "protected" by N.
2) In my idea, RDF semantics was extended to enforce some dependency
between subject and subject*, between predicate and predicate*, and
between object and object*, and to ensure that subject, predicate and
object were functional (a statement describes only one "fact"). In other
words, the following things would have been *inconsistent* (under RDF*
entailment recognizing xsd:integer):
# G1
_:stmt rdf*:object* M("a"^^xsd:integer); rdf*:object 42.
# G2
_:stmt rdf*:object* M("42"^^xsd:integer); rdf*:object 43.
Disclaimer: those semantic constraints make the malformed-literal-bnode
test [2] problematic, I don't have a solution for that, and I am not
even sure that this test should be kept (but I put it here for
discussion). The dedicated semantics in my pull-request [3], however,
passes this test, and the others (I think).
[1] https://github.com/w3c/rdf-star/issues/37#issue-746823745
[2]
https://w3c.github.io/rdf-star/tests/semantics/manifest.html#malformed-literal-bnode
[3] https://github.com/w3c/rdf-star/pull/19
On 24/11/2020 00:59, Peter F. Patel-Schneider wrote:
> Here is a mapping from generalized RDF* to generalized RDF that I believe
> satisfies all the test cases:
>
>
> Short and a bit sloppy version:
>
> Define M on RDF terms as follows:
> M(I) is the string of I for I an IRI
> M(L) is the long lexical form of L for L an RDF literal
>
> Let L be an injective mapping from RDF triples to "fresh" blank nodes.
>
> Define the mapping -* from a generalized RDF* graph G* to a generalized RDF
> graph G as follows:
> Pick some embedded triple < s p o > such that none of s, p, and o are
> embedded triples, replace all occurrences of it by L(< s p o >), and add the
> triples
> < L(< s p o >) rdf:type rdf:Statement >
> < L(< s p o >) rdf:subject s > if s is not a malformed literal
> < L(< s p o >) rdf:subject* M(s) > if s is not a blank node
> < L(< s p o >) rdf:predicate p > if p is not a malformed literal
> < L(< s p o >) rdf:predicate* M(p) > if p is not a blank node
> < L(< s p o >) rdf:object o > if o is not a malformed literal
> < L(< s p o >) rdf:object* M(o) > if o is not a blank node
> Finish when there are no embedded triples left.
>
>
>
>
>
> Longer and more careful version:
>
> Let rdf* be an IRI namespace.
>
> Let M be an injective mapping from IRIs and RDF literals to strings starting
> with "X"
>
> Let L be an injective mapping from RDF triples to blank nodes whose range
> excludes an infinite number of blank nodes.
>
> Let N be an injective mapping from IRIs to IRIs, strings to strings, and blank
> nodes to blank nodes that does not include any IRIs in the rdf* namespace or
> strings that start with "X" or blank nodes in the range of L in its range.
> (This is just used to ensure that the encoding of IRIs, strings, and blank
> nodes do not clash with RDF terms in the graphs.)
>
> Define the mapping -* from a generalized RDF* graph G* to a generalized RDF
> graph G as follows:
> First replace each RDF term by its mapping under N.
> Pick some embedded triple < s p o > such that none of s, p, and o are
> embedded triples, replace all occurrences of it by L(< s p o >), and add the
> triples
> < L(< s p o >) rdf*:type rdf*:Statement >
> < L(< s p o >) rdf*:subject s > if s is not a malformed literal
> < L(< s p o >) rdf*:subject* M(s) > if s is not a blank node
> < L(< s p o >) rdf*:predicate p > if p is not a malformed literal
> < L(< s p o >) rdf*:predicate* M(p) > if p is not a blank node
> < L(< s p o >) rdf*:object o > if o is not a malformed literal
> < L(< s p o >) rdf*:object* M(o) > if o is not a blank node
> Finish when there are no embedded triples left.
>
>
>
>
>
> peter
>
>
>
>
>
> On 11/23/20 6:30 AM, Pierre-Antoine Champin wrote:
>> Hi all,
>>
>> as per my action assigned on our last call [1], I pushed a first version of
>> a test-suite. The first goal is to provide a set of concrete examples of how
>> RDF* implementations are expected to behave. An HTML rendering of that
>> test-suite is available here:
>>
>> https://w3c.github.io/rdf-star/tests/semantics/manifest.html
>>
>> so that everyone can review, reference, and comment each of the test cases.
>>
>> If "entail" sounds esoteric to you, think of the 2nd graph in each test case
>> as a SPARQL* ASK query, which is expected to return TRUE (or FALSE, in the
>> case of "not entail").
>>
>> Coming next: a similar test suite for SPARQL*.
>>
>> best
>>
>> [1] https://github.com/w3c/rdf-star/issues/40
>> <https://github.com/w3c/rdf-star/issues/40>
>>
Attachments
- application/pgp-keys attachment: OpenPGP_0x9D1EDAEEEF98D438.asc
Received on Tuesday, 24 November 2020 08:40:55 UTC