Какой самый простой способ представить сетку/матрицу в RDF?

Я не уверен, как сформулировать этот вопрос, поэтому, если есть лучшие термины или существующие ответы, укажите мне на это! Я впервые проектирую что-либо с помощью RDF.

Я создаю небольшую личную базу знаний для отслеживания предметов в лаборатории и не знаю, как лучше всего кодировать 2D-местоположения. Единственная идея, которая пришла мне в голову, — сделать все контейнером. Например, если у меня есть 96-луночный планшет, это будет один большой контейнер с 12 столбцами и 8 рядами, и каждый из них будет контейнером с лунками, и каждая лунка будет контейнером, в котором будет что-то, что меня интересует. отслеживание.

Кажется достаточно гибким, чтобы справляться со многими реальными ситуациями, но запросы к нему довольно громоздки. Чтобы получить штамм в лунке B7 планшета p0001, это будет примерно так: «опишите штамм s, который находится в лунке w, который находится в строке r, а также в столбце c, где r и c находятся в планшете p, а p помечен как p0001, а c помечен как 7, а r помечен как B» (извините за ужасный псевдо-SPARQL)

Есть ли более простой способ? Я предполагаю, что это возникает во многих бизнес-контекстах, связанных с запасами, поэтому люди, вероятно, поняли это.

Еще одна вещь, в которой я не уверен, - это кодирование самих индексов. Должен ли я просто пометить их как литералы?

РЕДАКТИРОВАТЬ: Таблички выглядят вот так .


person jefdaj    schedule 24.02.2016    source источник


Ответы (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 в 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
comment
Спасибо, это супер полезно! Я почему-то не додумался описывать тарелку сверху вниз. Гораздо чище. На самом деле у меня есть таблицы обоих типов, в некоторых из которых строки/столбцы имеют смысл, а в некоторых — просто индексы. Для важных я буду использовать Tarql. - person jefdaj; 24.02.2016