Defining a property whose range is an ordered list

2019-08-17 08:41发布

问题:

Given two classes Container and Element, I would like to define a property contains to describe the contents of a Container.

However, the order of Elements is important, so I can't simply write

_:container :contains _:element1, _:element2, _:element3 .

How can I define the contains property correctly?

I've looked at rdf:List and owl:Seq but I don't know how to translate that into my ontology.

回答1:

You can define your property in many ways depending on what your requirements and your use cases are.

First, it is sometimes possible to avoid using lists or sequences completely, and yet keep the ordering of things. This can be done if the elements that you are ordering have an intrinsic order. For instance, if you want to name the children of someone from the oldest to the youngest, you can just use a hasChild relation:

ex:someone  onto:hasChild  ex:child3, ex:child1, ex:child2 .
ex:child1  onto:birthDay  "1995-10-25"^xsd:date .
ex:child2  onto:birthDay  "1997-03-10"^xsd:date .
ex:child3  onto:birthDay  "2003-01-14"^xsd:date .

If you do not have the exact dates, it is also possible to use a relation isOlderThan to make the order explicit. However, this cannot work in many cases. If you want to say in which order participants to a race arrived at the finish line, you cannot say:

ex:runner1  onto:arrivedBefore  ex:runner2 .
# etc.

because this only applies to this particular race. One solution is to use an RDF list like so:

ex:race42  onto:arrival  (ex:runner1 ex:runner2 ex:runner3) .

However, RDF lists cannot be used like this in OWL DL. The typical way of dealing with such lists in OWL is what is described in the document that AKSW links to in his comment. That is, you define a class and properties that mimic the RDF list constructs:

ex:container42  onto:contains  [
    a  listonto:OWLList;
    listonto:hasElement  ex:element1;
    listonto:hasNext  [
        a  listonto:OWLList;
        listonto:hasElement  ex:element2;
        listonto:hasNext  [
            a  listonto:OWLList;
            listonto:hasElement  ex:element3;
            listonto:hasNext  listonto:emptylist
        ]
    ]
] .

This is not the only solution. Using rdf:Seq is also an option (though usually discouraged by many people). Again, this cannot be used in OWL DL. However, one can introduce an ontology that partially mimics the way rdf:Seq works:

ex:container42  onto:contains  [
    a  seqonto:Sequence;
    seqonto:hasSlots
        [ a seqonto:Slot; seqonto:content ex:element1; seqonto:position 1 ],
        [ a seqonto:Slot; seqonto:content ex:element2; seqonto:position 2 ],
        [ a seqonto:Slot; seqonto:content ex:element3; seqonto:position 3 ],
    seqonto:numberOfElements 3
] .

The property position with its number are used to mimic the properties rdf:_1, rdf:_2, etc. from the RDF vocabulary. Other ways of identifying the last slot could be a special seqonto:lastSlot property. Note that this is what the ordered list ontology does.

There may be other options, probably as involved as the ones discussed here, but I think it covers most possibilities well enough.



回答2:

Perhaps can you find a partial answer in this paper :

P. Ciccarese ans S. Peroni, The Collections Ontology: creating and handling collections in OWL 2 DL frameworks, 2013 Source



标签: list owl protege