- From: David Booth <david@dbooth.org>
- Date: Mon, 19 Sep 2022 18:17:05 -0400
- To: Pierre-Antoine Champin <pierre-antoine@w3.org>, "semantic-web@w3.org" <semantic-web@w3.org>
Hi Pierre-Antoine,
On 9/18/22 21:36, Pierre-Antoine Champin wrote:
> it seems to me that RDF + Shapes + Ontology gives you all this already:
Agreed, but that kind of illustrates the point: yes, these things are
*possible* to do using RDF, but they are substantially more difficult
than they should be. Objects (composed of key-value pairs, which can
also give us n-ary relations) and arrays are so basic to developers,
they should be *easy*, not merely possible.
According to the DB-Engines site, of the top 10 graph databases, RDF
databases have only 14% of the market. And even that is probably an
over-count, because most of those RDF databases are actually
multi-modal, so it isn't clear how many of them are being used for their
RDF capability.
https://db-engines.com/en/ranking/graph+dbms
If it were easier in RDF to do things that are trivially easy for
programmers to do in non-RDF applications, I think RDF could get much
greater uptake.
Best wishes,
David Booth
>
> - Shapes can be used to guarantee that any node with a :disease property
> also has a :probability property (and vice-versa) -- and that these
> properties can't have multiple values.
>
> - Ontologies can be used to guarantee that any two nodes with the same
> :disease and :probability values are owl:sameAs.
>
> All your examples would then work with the standard [] syntax instead of
> the new @[] syntax.
>
>
> Note that Shapes + Ontologies can also be used for lists, constraining
> first/rest ladders to be well-formed. Granted, this would require
>
> 1) to solve the problem of rdf:first/rdf:rest being not allowed in OWL
> A-boxes, and
> 2) to extend the SPARQL syntax to make it more convenient to query lists
>
> but none of it, in my opinion, calls for an extension of RDF itself.
>
> pa
>
> On 18/09/2022 13:20, David Booth wrote:
>> Great discussion! It seems that lists and n-ary relations are closely
>> related, in that one could view a list as a set of key-value pairs (or
>> predicate-object pairs) of an n-ary relation.
>>
>> For example, if the Turtle list syntax were used to express a built-in
>> list object -- or more properly an *array* object -- rather than a
>> first-rest ladder of triples, then this example:
>>
>> # Example 1
>> :dogShow winners ( :ginger :bailey ) .
>>
>> might be almost equivalent to:
>>
>> # Example 2
>> :dogShow :winners [
>> 0 :ginger ;
>> 1 :bailey
>> ] .
>>
>> if integers could be used as predicates, which they can in generalized
>> RDF. https://www.w3.org/TR/rdf11-concepts/#section-generalized-rdf
>>
>> However, example 1 expresses a single triple, whereas example 2
>> expresses three triples.
>>
>> In languages that manipulate RDF, such as SPARQL and various
>> programming languages, it is always helpful to have ways to convert
>> between a built-in construct and its constituent parts, and this can
>> either be done implicitly or with explicit operators. Implicit
>> conversion offers more convenience, but at the price of being more
>> error prone. For example, if SPARQL did this conversion implicitly,
>> the ordered list of winners from example 1 above might be obtained by:
>>
>> # Example 3: implicit conversion from list to set of triples
>> SELECT ?winner ?index
>> WHERE {
>> :dogShow :winners [ ?index ?winner ]
>> }
>> ORDER BY ?index
>>
>> On the other hand, if an explicit "@[ ... ]" operator were instead
>> added to SPARQL, to convert a built-in list to its equivalent set of
>> explicit triples, then the query might look like this:
>>
>> # Example 4: explicit conversion from list to set of triples
>> SELECT ?winner ?index
>> WHERE {
>> :dogShow :winners @[ ?index ?winner ]
>> }
>> ORDER BY ?index
>>
>> I'm just making up a possible syntax here for illustrative purposes.
>> Some other syntax might be better.
>>
>> A method should also be provided to go the other direction: convert a
>> set of triples into the equivalent built-in object. And although I
>> think that sets and bags would also be useful, I think they could be
>> readily layered on top of lists/arrays if we get proper built-in
>> list/array support.
>>
>> Example 2 above is strikingly similar to a commonly used idiom for
>> encoding an n-ary relation:
>>
>> # Example 5
>> :christine :diagnosis [
>> :disease :breastCancer ;
>> :probability 0.8
>> ] .
>>
>> Idioms for n-ary relations are explained in
>> https://www.w3.org/TR/swbp-n-aryRelations/
>>
>> This similarity that others have pointed out between lists and n-ary
>> relations seems like good news, because it suggests that if we can
>> figure out how to add one to RDF, we can also add the other, and both
>> are sorely needed for convenience. For reasons why, see:
>> https://github.com/w3c/EasierRDF/issues/74
>> https://github.com/w3c/EasierRDF/issues/20
>>
>> Example 5 above is really a work-around for the lack of native n-ary
>> relations in RDF. It expresses three triples:
>>
>> # Example 5a -- ntriples for example 5
>> :christine :diagnosis _:b0 .
>> _:b0 :disease :breastCancer .
>> _:b0 :probability 0.8 .
>>
>> However, inspired by example 4 above, perhaps a similar syntax could
>> be used to write an n-ary relation that would treat Christine's
>> suspected disease and probability as a single entity participating in
>> the :diagnosis relation:
>>
>> # Example 6
>> :christine :diagnosis @[
>> :disease :breastCancer ;
>> :probability 0.8
>> ] .
>>
>> This differs from example 5 because example 6 expresses a *single*
>> triple that connects :christine with a diagnosis object -- not 3
>> triples. The order in which the diagnosis properties are listed has
>> no effect -- they are a set:
>>
>> # Example 7a: property order does not matter
>> @[ :probability 0.8 ; :disease :breastCancer ]
>> owl:sameAs @[ :disease :breastCancer ; :probability 0.8 ] .
>>
>> and adding or removing a property makes it different:
>>
>> # Example 7b
>> @[ :probability 0.8 ; :disease :breastCancer ]
>> :NOT_sameAs @[ :disease :breastCancer ; :probability 0.8 :year
>> 2022 ] .
>>
>> Trying to specify the same property twice should be a syntax error:
>>
>> # Example 7c -- INVALID -- SYNTAX ERROR!
>> :christine :diagnosis @[
>> :disease :breastCancer ;
>> :disease :colonCancer ;
>> :probability 0.8
>> ] .
>>
>> But the following would not be a syntax error, even if it may be
>> semantically wrong:
>>
>> # Example 7d
>> :malady owl:sameAs :disease .
>> :christine :diagnosis @[
>> :disease :breastCancer ;
>> :malady :colonCancer ;
>> :probability 0.8
>> ] .
>>
>> And of course, these constructs could be nested as desired.
>>
>> I think something like this could meet the need for n-ary relations in
>> some future RDF syntax. And based on previous comments by Pat and
>> Anthony, it sounds like the semantics would not be a problem.
>>
>> Thanks very much to Thomas, Pat, Anthony and others for a very helpful
>> discussion!
>>
>> David Booth
>>
Received on Monday, 19 September 2022 22:17:21 UTC