Какой самый простой способ представить сетку / матрицу в RDF?
Я не уверен, как сформулировать этот вопрос, поэтому, если есть лучшие термины или существующие ответы, укажите мне на это! Я впервые проектирую что-либо с помощью RDF.
Я создаю небольшую личную базу знаний для отслеживания предметов в лаборатории и не знаю, как лучше всего кодировать 2D-местоположения. Единственная идея, которую я выдвинул, - это сделать все контейнером. Например, если у меня есть 96-луночный планшет, это был бы один большой контейнер с 12 столбцами и 8 рядами, и каждый из них был бы контейнером с лунками в них, а каждая лунка - это контейнер, в котором хранится то, что мне интересно отслеживание.
Кажется достаточно гибким, чтобы справиться с множеством реальных ситуаций, но запрашивать его довольно громоздко. Чтобы получить напряжение в колодце B7
пластины p0001
было бы что-то вроде: "опишите штамм s
который в колодце w
, который находится в ряду r
а также в столбце c
, где r
а также c
в тарелке p
, а также p
помечен p0001
, а также c
помечен 7
а также r
помечен B
" (Извините за ужасный псевдо-SPARQL)
Есть ли более простой способ? Я полагаю, что это происходит во многих бизнес-контекстах, связанных с инвентаризацией, поэтому люди, вероятно, поняли это.
Другая вещь, в которой я не уверен - это кодирование самих индексов. Должен ли я просто отметить их как литералы?
РЕДАКТИРОВАТЬ: пластины выглядят так.
1 ответ
Это может быть слишком широким для правильного ответа, но я думаю, что есть несколько вариантов. Я начну с тех, которые на самом деле касаются кодирования сеток, но закончу тем, что я считаю наиболее подходящим.
Кодировать структуры со всеми их индексами массива
Контейнеры в 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 Collection в 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 ] .
}