在RDF中表示网格/矩阵的最简单方法是什么?

时间:2016-02-24 07:56:44

标签: sparql rdf knowledge-capture

我不确定如何说出这个问题,所以如果有更好的术语或现有的答案指向我那样!这是我第一次使用RDF设计任何东西。

我制作了一个小型的个人知识库来跟踪实验室中的项目,并且我不确定如何最好地编码2D位置。我到目前为止唯一的想法就是让所有成为一个容器。例如,如果我有一个96孔板,它将是一个有12列8行的大容器,每个容器都是带有孔的容器,每个孔都是容纳我的东西的容器。对跟踪感兴趣。

似乎足够灵活,可以处理很多真实情况,但查询它有点麻烦。为了在板B7的{​​{1}}井中获得应变,它将类似于:"描述应变p0001,它位于井s中,在行中w以及列r,其中cr位于c位置,p标记为pp0001标记为c7标记为r" (请原谅可怕的伪SPARQL)

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

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

编辑:牌照看like this

1 个答案:

答案 0 :(得分: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

然后是#34;传统&#34;表示这一点的方法是每个行都有一个具有与每列相对应的属性的个体:

: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 .

如果您将每一行视为关系的实例,那么Defining N-ary Relations on the Semantic Web中给出的方法或多或少都是如此。 A Direct Mapping of Relational Data to RDF也非常重要。

对于您的用例

由于你的用例(我不得不查看&#34;井板&#34;是什么),看起来你可能真的想要那些数字索引,所以第一种和第三种方法的某些组合可能是什么你要。

  

似乎足够灵活,可以处理很多真实情况,但是查询   这有点麻烦。为了获得板p0001的B7井的应变,   它会是这样的:&#34;描述一个很好的应变s,   在行r和列c中,其中r和c在板p中,   p标记为p0001,c标记为7,r标记为B&#34; (借口   可怕的伪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 ] .
}