2

この質問の言い方がわからないので、より良い用語や既存の回答があれば、そのように指摘してください! RDF を使用して何かを設計するのはこれが初めてです。

ラボでアイテムを追跡するための小さな個人的なナレッジベースを作成していますが、2D 位置を最適にエンコードする方法がわかりません。これまでに思いついた唯一のアイデアは、すべてをコンテナーにすることです。たとえば、96 ウェル プレートがある場合、それは 12 列と 8 行の 1 つの大きなコンテナーになり、それぞれにウェルが入ったコンテナーになり、各ウェルは興味のあるものを保持するコンテナーになります。追跡。

多くの実際の状況を処理するのに十分な柔軟性があるように見えますが、クエリを実行するのは面倒です。B7プレート のウェル内のひずみを取得するには、次のp0001ようになります。恐ろしい疑似 SPARQL ですみません)swrcrcppp0001c7rB

もっと簡単な方法はありますか?これは、在庫を含む多くのビジネス コンテキストで出てくると思うので、人々はおそらくそれを理解しているでしょう。

私が確信していないもう1つのことは、インデックス自体のエンコードです。それらをリテラルとしてタグ付けする必要がありますか?

編集: プレートは次のようになります

4

1 に答える 1

2

これは適切な答えを出すには広すぎるかもしれませんが、いくつかの選択肢があると思います。実際にグリッドのエンコードに関するものから始めますが、実際に最も適切と思われるもので終わります。

すべての配列インデックスで構造体をエンコードする

リストとそれらに類似した構造を除いて、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 ] .
}
于 2016-02-24T14:49:57.573 に答える