如果需要保持顺序,可以将列表表示为 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 集合实用程序,以便从代码中更轻松地处理这个问题。要将您的 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()));
编辑也可以使用 SPARQL 1.1 按顺序检索此类 RDF 集合项,尽管这并不简单。请参阅是否可以在 SPARQL 的 RDF 集合中获取元素的位置?一个好的解决方案。
尽管如此,停下来想想你是否真的需要以固定的顺序存储东西可能是个好主意。RDF 本质上是无序的,虽然 RDF 集合建模提供了一种机制,但将所有内容都存储为集合并不高效。
在最常见的情况下,顺序实际上并不是实际数据模型的一部分,而是一个表示问题。在这些情况下,您可以在大多数情况下使用带有ORDER BY
子句的 SPARQL 查询来对查询结果进行排序。