Это может быть слишком широко для правильного ответа, но я думаю, что есть несколько вариантов. Я начну с тех, которые на самом деле касаются кодирования сеток, но закончу тем, что я считаю наиболее подходящим.
Кодировать структуры со всеми их индексами массива
Контейнеры в 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 (которые представляют собой односвязные списки) и находить элементы по положению таким же образом, как вы можете вычислить положение элементов в списке. Я описал это в своем ответе на Можно ли получить позицию элемента в коллекции RDF в 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 также очень важно.
Для вашего варианта использования
Поскольку ваш вариант использования (мне пришлось посмотреть, что такое «планшет с лунками»), кажется, что вам действительно могут понадобиться эти числовые индексы, поэтому вам может понадобиться некоторое сочетание первого и третьего подходов.
Кажется достаточно гибким, чтобы справляться со многими реальными ситуациями, но запросы к нему довольно громоздки. Чтобы получить штамм в лунке B7 планшета p0001, это будет примерно так: «опишите штамм s, который находится в лунке w, который находится в строке 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 ] .
}
person
Joshua Taylor
schedule
24.02.2016