Как поддерживать порядок при получении данных в sparql - PullRequest
2 голосов
/ 07 апреля 2020

Есть ли способ обеспечить порядок при поиске в sparql?

Скажем, я хочу сохранить List<Literals> (порядок важен) как объект

{:subj :pred 'o1'. :subj :pred 'o2'. :subj :pred 'o3'}

Как я могу вставить вышеуказанные данные так, чтобы при выполнении select ?s ?p ?o where {?s ?p ?o} порядок не изменился?

Всегда ли sparql сохраняет порядок вставки данных при получении?

В Приведенный выше пример, я использовал литералы в качестве примера. Есть ли способ сохранить порядок IRI?

Я видел документацию sparql по RDF.Seq, но я не совсем понял, как это использовать. Пожалуйста, предоставьте несколько простых вставок и выберите запросы для обеспечения заказа или поделитесь любыми соответствующими ресурсами.

Ответы [ 2 ]

3 голосов
/ 08 апреля 2020

Если вам нужно сохранить порядок, вы можете представить список в виде коллекции RDF. Если у вас есть список строк, например:

 List<String> objects = Arrays.asList("o1", "o2", "o3");

, представляющий его как коллекцию RDF, будет выглядеть примерно так (в синтаксисе Turtle):

_:node a rdf:List;
       rdf:first "o1" ;
       rdf:rest [ 
          rdf:first "o2";
          rdf:rest [
             rdf:first "o3";
             rdf:rest rdf:nil .
          ]
       ].          

Это может выглядеть громоздко, но библиотеки RDF4J предлагают некоторые утилиты RDF Collection , чтобы упростить обработку этого кода. Чтобы преобразовать ваш список Java в коллекцию RDF, вы можете сделать что-то вроде этого:

// starting node of the RDF collection
Resource head = valueFactory.createBNode();
// convert our list and add it to a newly-created Model
Model collection = RDFCollections.asRDF(objects, head, new LinkedHashModel());

Здесь collection - это просто модель RDF (набор операторов RDF), которую вы можете добавить к ваше триплетное хранилище, как и любые другие данные RDF (см. документацию RDF4J для получения дополнительных советов о том, как работать с коллекциями при хранении и извлечении из репозитория).

Чтобы преобразовать коллекцию RDF обратно в список Java (в порядке сохранения):

List<Value> values = RDFCollections.asValues(collection, head, new ArrayList<Value>());

Или, если вы хотите, чтобы они снова были в виде списка строковых объектов:

List<String> values = new ArrayList<>();
RDFCollections.consumeValues(collection, head, v -> values.add(v.stringValue()));

Редактировать it Также возможно получить такие элементы коллекции RDF по порядку, используя SPARQL 1.1, хотя это не так просто. См. Возможно ли получить положение элемента в RDF Collection в SPARQL? для хорошего решения.

Несмотря на это, вероятно, это хорошая идея остановиться и подумать если вам на самом деле нужно , чтобы хранить вещи в фиксированном порядке. RDF по своей природе неупорядочен, и хотя моделирование RDF-коллекций обеспечивает механизм, неэффективно хранить все как коллекции.

В большинстве распространенных случаев порядок на самом деле не является частью фактической модели данных, а является проблемой представления. В этих случаях вы можете использовать запрос SPARQL с предложением ORDER BY для сортировки результатов запроса.

1 голос
/ 07 апреля 2020

Вариант использования, похоже, не подходит для модели RDF. Поскольку RDF описывает граф, порядок его ребер не важен.

С учетом вышесказанного, одним простым решением для вашего конкретного варианта использования может быть, например, использование усовершенствованного узла с двумя дополнительными свойствами RDF :order и :value:

RDF:

:subj :pred [:order 1; :value 'o1']. 
:subj :pred [:order 2; :value 'o2']. 
:subj :pred [:order 3; :value 'o3'].

SPARQL:

SELECT ?s ?p ?o {
  ?s ?p [:order ?order; :value ?o]
} ORDER BY ?order
...