Существует ли запрос SPARQL для отслеживания различных этапов одного рабочего процесса в одной строке?
Я использую GraphDB для хранения различных этапов производства. Шаги производства представлены такими шагами, как A,B,C,D. Связанные друг с другом шаги процесса связаны свойством объекта ":hasUpstreamProduktionsnummer".
Данные содержат множество различных рабочих процессов. Где также отсутствуют несколько производственных этапов. Итак, рабочий процесс может заканчиваться экземпляром класса B или начинаться экземпляром класса C.
Чтобы визуализировать рабочий процесс, мне нужно создать таблицу, содержащую все этапы производства в одной строке и оставляющую свободное место для недостающих. Например:
A1 B1 C1
B2 C2
A3 B3
A4
C4
Мой подход был таков:hasUpstreamProduktionsnummer as transtiv и следующее:
select distinct ?A ?B ?C where {
{ ?A a :A.
?A :hasUpstreamProduktionsnummer ?AUP.}
Optional
{ ?B owl:sameAs ?AUP.
?B a :B.}
Optional
{ ?C owl:sameAs ?AUP.
?C a :C. }
}
Запрос для рабочего процесса 1 приведет к следующему:
A1 C1
A1 B1
A1
Есть ли возможность запросить их в одну строку?
Есть ли какой-нибудь более эффективный запрос? В моем случае мне нужно было бы записать то же самое для B и C в качестве отправной точки.
Данные:
@base <http://BLB.de/Daten/Produktionsdaten/>
@prefix : <http://BLB.de/Daten/Produktionsdaten/> .
<A1> a :A;
:hasUpstreamProduktionsnummer <B1>.
<B1> a :B;
:hasUpstreamProduktionsnummer <C1>.
<C1> a :C.
<B2> a :B;
:hasUpstreamProduktionsnummer <C2>.
<C2> a :C.
<A3> a :A;
:hasUpstreamProduktionsnummer <B3>.
<B3> a :B.
<A4> a :A.
<C4> a :C
Заранее спасибо за помощь!
1 ответ
Проблема решена UninformedUser с элементами SPARQL Необязательно, объединение и фильтр не существует в следующем запросе:
prefix : <http://BLB.de/Daten/Produktionsdaten/>
select distinct ?A ?B ?C where {
{ ?A a :A.
OPTIONAL {?A :hasUpstreamProduktionsnummer ?B .
?B a :B
Optional{?B :hasUpstreamProduktionsnummer ?C .
?C a :C. }} }
UNION { ?B a :B
Optional{?B :hasUpstreamProduktionsnummer ?C . ?C a :C. }
filter not exists {?A :hasUpstreamProduktionsnummer ?B} }
UNION { ?C a :C. filter not exists {?B :hasUpstreamProduktionsnummer ?C} } }