これは適切な答えを出すには広すぎるかもしれませんが、いくつかの選択肢があると思います。実際にグリッドのエンコードに関するものから始めますが、実際に最も適切と思われるもので終わります。
すべての配列インデックスで構造体をエンコードする
リストとそれらに類似した構造を除いて、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 RDF Collection 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 .
各行をリレーションのインスタンスとして扱う場合、 それは多かれ少なかれSemantic Web での N 項リレーションの定義で説明されているアプローチです。リレーショナル データの RDF への直接マッピングも非常に関連性があります。
あなたのユースケースのために
あなたのユースケース(「ウェルプレート」とは何かを調べる必要がありました)以来、実際にはこれらの数値インデックスが必要なように思われるため、最初と3番目のアプローチの組み合わせが必要な場合があります。
多くの実際の状況を処理するのに十分な柔軟性があるように見えますが、クエリを実行するのは面倒です。プレート p0001 のウェル B7 のひずみを取得するには、次のようになります。 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 ] .
}