2017-07-19 45 views
1

我對RDF數據表示有問題。該表包含數百萬行和數千個subject_id。這是一個表格樣本。如何在RDF中表示時間關係如<time:before>?

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 

我已經做了簡單的1:1 rdf映射轉換這樣使用jena。

<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" 

現在,我想添加一些時間屬性一樣<time:before>所有subject_id,即,對於連續的信息。這裏是我想要的例子:

對於subject_id = 144;

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

爲subject_id = 146;

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

我可以明確地添加時間關係,<time:before>?有沒有更好的方法來解決這類問題?

+1

我建議你先將標準格式的日期時間值改成(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的屬性。

如何

可以使用這個特性在RDF數據添加三元組SPARQL:

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,可能是另一個詞(不是'保留')會更合適。這個前綴是衆所周知的,參見[這裏](https://prefix.cc/time)(或者更確切地說[this](http://prefix.cc/popular/all.file.json)文件)。讀者可能會感到困惑,如果有人使用「時間:」來做其他事情。 –