如何在RDF中表示像<time:before>这样的时间关系?

How to represent temporal relation like <time:before> in RDF?

我对 RDF 数据表示有疑问。 table 包含数百万行和数千个 subject_id。这是 table.

的示例
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;

<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>?有没有更好的办法解决这类问题?

什么

显然,您可以使用 rdf:Seq or rdf:List. However, querying these structures is painful

我建议你为这种时间序列找合适的ontology或词汇,或者使用你自己的轻量级词汇。请注意 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+ "subjects" 和 60000+ "rows".

可能您的 CSV table 是从 RDBMS 导出的,您在 RDBMS 中对所有这些数据进行了规范化。然后您可以使用 "rows" 的相邻对创建 SQL 视图并导出它或使用 R2RML 工具生成 RDF 三元组。

另一种选择是以某种方式 sort/transform RDF 文件并生成您需要的三元组 sedpython

更新

当然,您的日期应该是 xsd:dateTime 类型,或者至少应该以自然的方式进行比较。