如何在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 文件并生成您需要的三元组 sed
、python
等
更新
当然,您的日期应该是 xsd:dateTime
类型,或者至少应该以自然的方式进行比较。
我对 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 文件并生成您需要的三元组 sed
、python
等
更新
当然,您的日期应该是 xsd:dateTime
类型,或者至少应该以自然的方式进行比较。