Запрос sparql, чтобы получить триплет, связанный с другими тройками
Предположим, у нас много RDF-троек, связанных как:
1: <S,P1,O>
2: <O,P2,O3>
3: <O,P3,O4>
4: <O3,P4,O5>
Я хотел бы получить тройные № 2, 3 и 4, просто зная тройное число 1, потому что тройные № 2 и 3 делят "О" с тройным № 1, а тройные № 4 делят "О3" с тройным № 2, который поделиться "O" с тройным N°1 Можно ли сформулировать это с помощью запроса sparql без знания P2,P3,P4?
заранее спасибо
2 ответа
Конечно. Этот запрос сделает это просто так:
CONSTRUCT {
?s ?p ?o .
?o ?q ?z.
?w ?r ?o .
}
WHERE {
?s ?p ?o .
FILTER (?s = :O || ?o = :O)
OPTIONAL { ?o ?q ?z . }
OPTIONAL { ?w ?r ?o . }
}
Это вряд ли будет очень эффективным, хотя. Однако, не зная больше о ваших фактических данных или о том, почему вы хотите получить именно этот конкретный результат, сложно найти лучшее решение.
Похоже, вы знаете, :O
и вы спрашиваете о тройках, у которых он есть в качестве субъекта, и о тройках, у которых объект этих троек является субъектом. Вы спрашиваете что-то вроде этого, тогда?
select * where {
:O ?p2 ?o2 .
optional { ?o2 ?p3 ?o3 }
}