2

我不知道如何表达这个问题,所以如果有更好的术语或现有的答案指向我!这是我第一次用 RDF 设计任何东西。

我正在建立一个小型个人知识库来跟踪实验室中的项目,并且不确定如何最好地编码 2D 位置。到目前为止,我提出的唯一想法是将所有东西都变成容器。例如,如果我有一个 96 孔板,它将是一个有 12 列和 8 行的大容器,每个容器都是带有孔的容器,每个孔都是一个容器,里面装着我感兴趣的东西追踪。

看起来足够灵活,可以处理很多实际情况,但是查询它有点麻烦。要获得B7板孔中的应变p0001,它可能类似于:“描述孔中的应变sw行中的应变,r列中的应变,板中的c位置r和位置,并且被标记,并且被标记并且被标记”(请原谅可怕的伪 SPARQL)cppp0001c7rB

有没有更简单的方法?我想这在很多涉及库存的商业环境中都会出现,所以人们可能已经弄清楚了。

我不确定的另一件事是对索引本身进行编码。我应该将它们标记为文字吗?

编辑:盘子看起来像这样

4

1 回答 1

2

对于正确的答案,这可能过于宽泛,但我认为有几个选择。我将从实际上与编码网格有关的那些开始,但以我认为实际上最合适的结束。

使用所有数组索引对结构进行编码

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 ] .
}
于 2016-02-24T14:49:57.573 回答