Если вам нужно сохранить порядок, вы можете представить список в виде коллекции 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
для сортировки результатов запроса.