Warning:
This wiki has been archived and is now read-only.
Rdf:List Stresstest
This is meant as a “stresstest” rather than as a practical use case:
Can we express validating rdf:Lists a in our framework? Conditions (are these sufficient?):
- Is there an rdf:rest that is neither rdf:nil, nor a bnode?
- Is there an rdf:rest without an rdf:first?
- rdf:nil should not have outgoing edges
- subject for rdf:rest or rdf:first and first must be a bnode
- lists may not branch (cardinality on first and rest must be exactly 1.
- no cycles
This could be extended to constraints *on* lists... e.g. are the elements in the list all numeric, ore the elements ordered, etc.
In SPIN (untested, just showing the ASK queries attached to rdf:List via spin:constraint):
# Cardinality of rdf:first must be 1 ASK WHERE { FILTER (spl:objectCount(?this, rdf:first) != 1) . }
# Cardinality of rdf:rest must be 1 ASK WHERE { FILTER (spl:objectCount(?this, rdf:rest) != 1) . }
# rdf:rest must be a bnode or rdf:nil ASK WHERE { ?this rdf:rest ?rest . FILTER (!(isBlank(?rest) || (?rest = rdf:nil))) . }
# Subject of rdf:first or rdf:rest must be a bnode ASK WHERE { ?this rdf:first|rdf:rest ?any . FILTER isIRI(?this) . }
# Lists must be acyclic ASK WHERE { ?this (rdf:rest)+ ?this . }
(If the system triple rdf:nil a rdf:List is present then some WHERE clauses need to include a FILTER ?this != rdf:nil because they do not apply to rdf:nil itself).
This SPIN solution could be made more readable by introducing Templates - many patterns here are generic and therefore may be reused with different properties.