【问题标题】:What's the simplest way to represent a grid/matrix in RDF?在 RDF 中表示网格/矩阵的最简单方法是什么?
【发布时间】:2016-02-24 07:56:44
【问题描述】:

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

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

看起来足够灵活,可以处理很多实际情况,但是查询它有点麻烦。为了在板p0001 的井B7 中获得应变,它类似于:“描述在井w 中的应变s,在行r 和列c 中,其中rc 在板p 中,p 标记为p0001c 标记为7r 标记为B”(请原谅可怕的伪SPARQL)

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

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

编辑:盘子看起来like this

【问题讨论】:

    标签: sparql rdf knowledge-capture


    【解决方案1】:

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

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

    RDF 中的容器,除了与它们类似的列表和结构外,不会获得有序存储。 RDF 只是一个 set 三元组。这意味着如果您想维护任何类型的基于索引的引用,那么您需要直接对其进行编码。这不是太难。假设我们有一个类似

    的数组
    [[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 .
    

    这或多或少是Defining N-ary Relations on the Semantic Web 中给出的方法,如果您将每一行视为关系的一个实例。 A Direct Mapping of Relational Data to 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 ] .
    }
    

    【讨论】:

    • 谢谢,非常有帮助!出于某种原因,我没有想到自上而下描述盘子。干净多了。我实际上有两种表,有些行/列是有意义的,有些只是索引。对于有意义的我将使用Tarql
    猜你喜欢
    • 2021-03-21
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多