2017-07-19 4 views
1

RDFデータ表現に問題があります。この表には、数百万行と数千種類のsubject_idが含まれています。ここに表のサンプルがあります。<time:before>のような時間的関係をRDFで表現する方法は?

row_id  subject_id DateTime 
34951953 144   14/07/2016 22:00 
34952051 145   14/07/2016 22:00 
34951954 146   14/07/2016 22:00  
34951976 144   15/07/2016 3:00 
34952105 146   15/07/2016 3:00 
34952004 144   15/07/2016 20:00 

jenaを使用してこのように単純な1:1 rdfマッピング変換を行っています。

<foo/data/row_id=34951953> <foo/data/subject_id> "144" 
<foo/data/row_id=34951954> <foo/data/subject_id> "146" 
<foo/data/row_id=34951954> <foo/data/subject_id> "146" 
<foo/data/row_id=34952051> <foo/data/subject_id> "145" 
<foo/data/row_id=34951976> <foo/data/subject_id> "144" 
<foo/data/row_id=34952105> <foo/data/subject_id> "146" 
<foo/data/row_id=34952004> <foo/data/subject_id> "144" 
<foo/data/row_id=34951953> <foo/data/DateTime> "14/07/2016 22:00:00" 
<foo/data/row_id=34952051> <foo/data/DateTime> "14/07/2016 22:00:00" 
<foo/data/row_id=34952054> <foo/data/DateTime> "14/07/2016 22:00:00" 
<foo/data/row_id=34951976> <foo/data/DateTime> "15/07/2016 3:00:00" 
<foo/data/row_id=34952105> <foo/data/DateTime> "15/07/2016 3:00:00" 
<foo/data/row_id=34952004> <foo/data/DateTime> "15/07/2016 20:00:00" 

は今、私は、シーケンシャルな情報のために、すなわち、すべてのsubject_idため<time:before>のようにいくつかの時間属性を追加します。ここに私が欲しいものの例があります:

subject_id = 144; subject_id = 146用

<foo/data/row_id=34951953> <time:before> <foo/data/row_id=34951976> 
<foo/data/row_id=34951976> <time:before> <foo/data/row_id=34952004> 

<foo/data/row_id=34951954> <time:before> <foo/data/row_id=34952105> 

私は明示的、時間的関係、<time:before>を追加することはできますか?この種の問題を解決するためのより良い方法はありますか?

+1

日時の値を標準形式(a la '2016-07-15T22:00:00')に変更し、それらを' xsd:datetime'として保存することをお勧めします。 xsd:string')。これにより、古いものから新しいもの、新しいものから古いものへの 'ORDER BY'のようなものを簡単に行うことができます。 – TallTed

+1

また、Ian Davisのブログシリーズ[RDFでの表現時間](http ://blog.iandavis.com/2009/08/representing-time-in-rdf-part-1/)...そこに見られるように、これは簡単な質問ではありません。 – TallTed

+0

貴重なご提案ありがとうございます@TallTed。 –

答えて

1

明らかに、あなたはrdf:Seqrdf:Listを使用することができます。ただし、これらの構造を照会するのはpainfulです。

この種の時系列の適切なオントロジや語彙を見つけたり、独自の軽量語彙を使用することをお勧めします。 time:接頭辞はTime ontologyで予約されています。

foo:beforeという名前のプロパティを使用するとします。

どう

あなたはSPARQLを使ってRDFデータでこのプロパティでトリプルを追加することができます。

INSERT 
{ 
?row_1 foo:before ?row_2 . 
} 
WHERE { 
    ?row_1 foo:subject ?subject . 
    ?row_2 foo:subject ?subject . 
    ?row_1 foo:time ?time_1 . 
    ?row_2 foo:time ?time_2 . 
    FILTER (?time_1 > ?time_2) 
    FILTER NOT EXISTS { 
     ?row_3 foo:subject ?subject . 
     ?row_3 foo:time ?time_3 . 
     FILTER ((?time_1 < ?time_3) && (?time_3 < ?time_2)) 
    } 
} 

パフォーマンス

Analogous問合せは、私のエンドポイントに約1分を行い、 3000件以上の「件名」と60000件以上の「行」があります。

あなたのCSVテーブルがRDBMSからエクスポートされた可能性があります。これらのデータはすべて標準化されています。次に、隣接する「行」のペアを含むSQLビューを作成し、それをエクスポートするか、R2RMLツールを使用してRDFトリプルを生成することができます。

別のオプション/並べ替え何らかの方法でRDFファイルを変換し、あなたがsedに必要なトリプルを生成することで、pythonなど

更新

もちろん、あなたの日付は、タイプxsd:dateTimeである必要があり、少なくとも自然な方法で比較可能でなければならない。

+0

@Stanislavありがとうございます。感謝。 –

+0

_ "時間:接頭辞は時間オントロジーによって予約されていることに注意してください" _ - 予約済みですか?どうやって?どこ?レジストリはありますか? –

+0

@MichałPolitowski、おそらく別の単語( '予約済み'ではない)がより適しています。このプレフィックスはよく知られています。[here](https://prefix.cc/time)(あるいは[this](http://prefix.cc/popular/all.file.json)ファイル)を参照してください。誰かが 'time:'を何か他のものに使うと、読者は混乱するかもしれません。 –

関連する問題