Вот несколько примеров данных с четырьмя классами. Первый и второй классы содержат детей с именами «name1» и «name2». Третий класс содержит «name1» и «name3», а четвертый содержит «name3» и «name4». Пятый класс содержит всех детей четвертого, а также «имя5». Итак, первый и второй классы эквивалентны, а четвертый класс - подкласс пятого.
@prefix : <http://example.org/> .
:class1 :child [ :objectName "name1" ] ,
[ :objectName "name2" ] .
:class2 :child [ :objectName "name2" ] ,
[ :objectName "name1" ] .
:class3 :child [ :objectName "name1" ] ,
[ :objectName "name3" ] .
:class4 :child [ :objectName "name3" ] ,
[ :objectName "name4" ] .
:class5 :child [ :objectName "name3" ] ,
[ :objectName "name4" ] ,
[ :objectName "name5" ] .
Вашего описание звучит, как вы на самом деле ищете подклассы, так как вы упоминаете классы все из которых дети и в другом классе. Таким образом, этот запрос SPARQL следует позаботиться о поиске подкласса отношений:
prefix : <http://example.org/>
select distinct ?c1 ?c2 where {
?c1 :child [] .
?c2 :child [] .
NOT EXISTS { ?c1 :child [ :objectName ?name ] .
NOT EXISTS { ?c2 :child [ :objectName ?name ] } }
FILTER(!sameTerm(?c1, ?c2))
}
Вложенных NOT EXIST
модель гарантирует, что только классы мы выбираем такие, что делает NOT EXIST
Элемент ?c1
, который делает NOT EXIST
в ?c2
. То есть мы отвергаем любые пары множеств, где является элементом в ?c1
, который не находится в ?c2
; мы отвергаем любую ?c1,?c2
пару, где ?c1
является не подмножество ?c2
, поэтому мы держим только те, где ?c1
является подмножество ?c2
. Фильтр sameTerm
удаляет тривиальные пары ?c,?c
, так как все будет подмножеством. Использование командной строки АЗП инструменты Jena, мы получаем следующие результаты:
$ arq --data data.n3 --query query.sparql
---------------------
| c1 | c2 |
=====================
| :class4 | :class5 |
| :class2 | :class1 |
| :class1 | :class2 |
---------------------
Как и следовало ожидать, :class1
и :class2
являются каждыми подмножествами другой, и :class4
является подмножеством :class5
.
Если вы хотите эквивалентные классы, достаточно всего лишь второй NOT EXISTS
, чтобы гарантировать, что ?c2
также подмножество ?c1
:
prefix : <http://example.org/>
select distinct ?c1 ?c2 where {
?c1 :child [] .
?c2 :child [] .
NOT EXISTS { ?c1 :child [ :objectName ?name ] .
NOT EXISTS { ?c2 :child [ :objectName ?name ] } }
NOT EXISTS { ?c2 :child [ :objectName ?name ] .
NOT EXISTS { ?c1 :child [ :objectName ?name ] } }
FILTER(!sameTerm(?c1, ?c2))
}
С этим запросом, мы вернемся только :class1
и :class2
:
$ arq --data data.n3 --query query.sparql
---------------------
| c1 | c2 |
=====================
| :class2 | :class1 |
| :class1 | :class2 |
---------------------
Был обнаружен [недавний вопрос] (http://stackoverflow.com/questions/17323636/comparing-sparql-graphs/17344570#17344570) о вычислении подмножеств в SPARQL. Этот вопрос касался проверки того, является ли один из названных графов подмножеством другого, но некоторые из методов могут применяться здесь, где вы хотите узнать, является ли набор {'? X':' class1: child? X'} подмножество {'? x':' class2: child? x'}. –
Вы сказали «дублировать» классы, но затем «все дети в одном классе тоже в другом». Если все дети второго класса не находятся в первом классе, вы говорите только об _sub_-классе, а не о _equivalent_-классе. Кого вы намеревались? –