Орден предикатов не сохраняется с Apache Jena RDF
Когда я пытаюсь восстановить более 9 объектов свойств с помощью API Apache Jena, порядок добавления не сохраняется. Может кто-нибудь объяснить причину и как я могу это исправить?
1 ответ
Хотя вопрос очень старый, это повторяющаяся проблема: единственный способ поддерживать порядок в наборе троек - это переопределить тройки и ввести явное свойство для кодирования последовательности. Итак, вместо того, чтобы делать
:my :first :triple.
:my :other :triple.
ты можешь сделать
:s1 rdfs:subject :my; rdfs:predicate :first; rdfs:object :triple.
:s2 rdfs:subject :my; rdfs:predicate :other; rdfs:object :triple.
:s1 my:next :s2.
Или более компактный (но и менее читаемый):
[ rdfs:subject :my; rdfs:predicate :first; rdfs:object :triple;
my:next
[ rdfs:subject :my; rdfs:predicate :other; rdfs:object :triple ] ]
Реальная беда начинается , если вы успешно закодировать последовательность , но затем, вы не в состоянии поддерживать его в совокупности. Нет надежного обходного пути.
Следующее может работать, а может и не работать. Никаких гарантий, и в зависимости от вашего оптимизатора запросов он может завершиться неудачно ... и это будет в соответствии с семантикой SPARQL.
SELECT ?preds
WHERE {
?first my:next [].
MINUS { [] my:next ?first }
# we establish that ?first is the first in a series of statements
{ SELECT ?first (GROUP_CONCAT(?pred; separator="/") as ?preds)
WHERE {
?first my:next*/rdfs:predicate ?p.
BIND(str(?p) as ?pred)
} GROUP BY ?first
}
}
Наивное ожидание состоит в том, что порядок появления в? Preds сохраняется. Это не гарантируется.