如何为RDF三元组添加开始和结束时间?

时间:2018-04-09 06:46:52

标签: xsd rdf turtle-rdf

假设我们在Turtle语法中有以下三倍:

<http:/example.com/Paul> <http:/example.com/running> <http:/example.com/10miles> .

如何添加开始和结束时间?例如,如果我想说他在上午10点开始并在上午12点完成他的10英里跑。我想使用xsd:dateTime

3 个答案:

答案 0 :(得分:4)

这样做的一种方法是通过具体化 - 对声明做出陈述。在这里,您可以选择为语句提供URI,以便可以从外部取消引用,或者使用空白节点。在您的情况下,这意味着您需要通过对主语,对象和谓词进行陈述来识别语句,并在您的情况下告诉它有关它的更多信息 - 关于它所代表的句点的开始和结束。这是一个空白节点的外观:

[
  rdf:type rdf:Statement ;   #this anonymous resource is a Statement... 
  rdf:subject ex:Paul ;      #...with subject Paul
  rdf:predicate ex:running ; #...predicate running
  rdf:object "10miles" ;     #...and object "10miles"
  ex:hasPeriodStart "2018-04-09T10:00:00"^^xsd:dateTime ;
  ex:hasPeriodEnd "2018-04-09T12:00:00"^^xsd:dateTime ;
].

定义ex:hasPeriodStartex:hasPeriodEnd时,您可能需要声明其类型和范围:

ex:hasPeriodStart
  rdf:type owl:DatatypeProperty ;
  rdfs:range xsd:dateTime ;

或者您可能希望使用SHACL确保数据的质量,您可以使用形状表达式定义约束。

我建议您不要定义与时间相关的属性,而应重用time ontology中的属性。

答案 1 :(得分:1)

给Paul的每个游戏都有自己的URI:

@prefix ex: <http://example.com/> .

ex:Paul ex:running ex:PaulsRun1, ex:PaulsRun2, ex:PaulsRun3 .

这允许您(和其他人)对每次运行做出陈述:

@prefix ex: <http://example.com/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

ex:PaulsRun3 
  ex:lengthInMiles 10.0 ;
  ex:startTime "2018-04-09T10:00:00"^^xsd:dateTime ;
  ex:endTime "2018-04-09T12:00:00"^^xsd:dateTime .

您可以为每次运行指定运行器,而不是将所有这些运行列为ex:Paul ex:running的对象:

@prefix ex: <http://example.com/> .

ex:PaulsRun1
  ex:runner ex:Paul .
  # ex:lengthInMiles, ex:startTime, ex:endTime, etc.

ex:PaulsRun2
  ex:runner ex:Paul .
  # ex:lengthInMiles, ex:startTime, ex:endTime, etc.

ex:PaulsRun3 
  ex:runner ex:Paul .
  # ex:lengthInMiles, ex:startTime, ex:endTime, etc.

如果您不想为每个跑步者的跑步创建一个URI,您可以改用(unlabeled) blank nodes。但这使得其他人很难/不可能参考这些运行。

答案 2 :(得分:0)

就像一个想法。

<强> 1。建模部分(涉及的RDF不多)

{
    "runs": [
        {
            "id": "runs:0000001",
            "distance": {
                "length": 10.0,
                "unit": "mile"
            },
            "time": {
                "start": "2018-04-09T10:00:00",
                "end": "2018-04-09T12:00:00"
            },
            "runner": {
                "id": "runner:0000002",
                "name": "Paul"
            }
        }
    ]
}

<强> 2。 RDF部分:为您的文档定义适当的上下文。

   "@context": {
        "ical": "http://www.w3.org/2002/12/cal/ical#",
        "xsd": "http://www.w3.org/2001/XMLSchema#",
        "runs": {
            "@id": "info:stack/49726990/runs/",
            "@container": "@list"
        },
        "distance": {
            "@id": "info:stack/49726990/distance"
        },
        "length": {
            "@id": "info:stack/49726990/length",
            "@type": "xsd:double"
        },
        "unit": {
            "@id": "info:stack/49726990/unit"
        },
        "runner": {
            "@id": "info:stack/49726990/runner/"
        },
        "name": {
            "@id": "info:stack/49726990/name"
        },
        "time": {
            "@id": "info:stack/49726990/time"
        },
        "start": {
            "@id":"ical:dtstart",
            "@type": "xsd:dateTime"
        },
        "end": {
            "@id":"ical:dtend",
            "@type": "xsd:dateTime"
        },
        "id": "@id"
    }

第3。有趣的部分:将其扔到您选择的RDF转换器

这是how it looks in JSON-Playground