对于正确的答案,这可能过于宽泛,但我认为有几个选择。我将从实际上与编码网格有关的那些开始,但以我认为实际上最合适的结束。
使用所有数组索引对结构进行编码
RDF 中的容器,除了与它们类似的列表和结构外,不会获得有序存储。RDF 只是一组三元组。这意味着如果您想维护任何类型的基于索引的引用,那么您需要直接对其进行编码。这不是太难。假设我们有一个数组
[[a, b, c],
[d, e, f]]
然后我们可以轻松地执行以下操作:
@prefix : <urn:ex:>
:array :hasElement [ :value :a ; :row 0 ; :column 0 ] ,
[ :value :b ; :row 0 ; :column 1 ] ,
[ :value :c ; :row 0 ; :column 2 ] ,
[ :value :d ; :row 1 ; :column 0 ] ,
[ :value :e ; :row 1 ; :column 1 ] ,
[ :value :f ; :row 1 ; :column 2 ] .
然后您可以轻松地使用 SPARQL 查询,例如:
prefix : <urn:ex:>
select ?value where {
:array :hasElement [ :value ?value ; :row 1 ; :column 2 ]
}
使用隐式索引编码结构
您还可以使用 RDF 列表(它们是单链表)之类的结构并按位置查找元素,就像计算列表中元素的位置一样。我在对Is it possible to get the position of an element in an RDF Collection in SPARQL 的回答中对此进行了描述? 但是,这可能会相当低效,我怀疑您是否想要这样做。
使用底层语义对结构进行编码
但是,如果您有一个表格或数据网格,那么行和列可能实际上意味着什么;它可能不仅仅是一个价值网格。在这种情况下,您可能可以以更具语义意义的方式表示数据。例如,如果您有一个像这样的表:
Name Age Height
---------------------
John 45 78
Mary 30 60
Susan 25 59
然后,一种“传统”的方式来表示这一点,每一行都有一个对应于每一列的属性:
:row1 a :Row ; :name "John" ; :age 45 ; :height 78 .
:row2 a :Row ; :name "Mary" ; :age 30 ; :height 60 .
:row3 a :Row ; :name "Susan" ; :age 25 ; :height 59 .
如果您将每一行视为关系的实例, 那或多或少就是在语义网上定义 N 元关系中给出的方法。关系数据到 RDF 的直接映射也非常相关。
对于您的用例
由于您的用例(我必须查找“孔板”是什么),看来您实际上可能想要这些数字索引,因此第一种和第三种方法的混合可能是您想要的。
看起来足够灵活,可以处理很多实际情况,但是查询它有点麻烦。为了得到板 p0001 的 B7 孔中的应变,它类似于:“描述在 w 孔中的应变 s,它在 r 行和 c 列中,其中 r 和 c 在板 p 中,p 是标记为 p0001,c 标记为 7,r 标记为 B”(请原谅可怕的伪 SPARQL)
我不认为这一切都那么麻烦。根据您标记列和行的方式,它可能类似于:
select ?strain where {
?plate rdfs:label "p0001" ;
:hasWell [ :row "7" ; #-- or :row/rdfs:label "7", or ...
:col "B" ; #-- or :col/rdfs:label "B", or ...
:contains ?strain ] .
}