Связано с этим вопросом (и его предыдущими):
Использование sh:maxExclusive для сравнения (значения) двух свойств типа данных
Я создал небольшую онтологию с тремя классами: DataSubject, MemberState и Minor. Есть два свойства типа данных: has-age и has-minimalage. Первый — от DataSubject(s) к целым числам, второй — от MemberState(s) к целым числам. Затем есть свойство объекта has-member-state от DataSubject(s) до MemberState(s).
Теперь у нас есть следующие лица:
ontology:John
rdf:type ontology:DataSubject ;
ontology:has-age "20"^^xsd:positiveInteger ;
ontology:has-member-state ontology:Spain ;
.
ontology:Spain
rdf:type ontology:MemberState ;
ontology:has-minimalage "16"^^xsd:positiveInteger ;
.
И я хочу написать правило SHACL, говорящее, что каждый DataSubject, чей возраст меньше минимального возраста его государства-члена, также является индивидуумом класса Minor.
В свете ответов, которые я получил на другие свои вопросы, я попытался:
sh:rule [
rdf:type sh:TripleRule ;
sh:condition [
sh:property [
sh:path ontology:has-age ;
sh:lessThan (ontology:has-member-state ontology:has-minimalage)
] ;
] ;
sh:subject sh:this ;
sh:predicate rdf:type;
sh:object ontology:Minor ;
] ;
Что не работает: он классифицирует Джона как младшего, но 20 не меньше 16. Конечно, я пробовал много других вариантов, например, sh:lessThan[sh:node[sh:path (онтология: Онтология has-member-state:has-minimalage)];];, многие из которых, вероятно, не имеют никакого смысла, но ни один из них не работает.
Может ли кто-нибудь предложить мне, как встроить путь в параметр sh:lessThan?
Извините, если я начинаю раздражать со всеми этими вопросами :-( Я новичок в SHACL и SPARQL, но я действительно стараюсь изо всех сил выучить их из всего, что я могу найти в Интернете.
Спасибо, Ливио.