How do I add a start and end time to a RDF triple?

允我心安 提交于 2020-05-28 04:10:13

问题


Supposing we have the following triple in Turtle syntax:

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

How do I add a start and end time? For example if I want to say he started at 10 am and finished his 10miles run at 12 am. I want to use xsd:dateTime.


回答1:


One way of doing this is through reification - making statements about the statement. Here, you have a choice of giving the statement a URI, so that it's externally dereferenceable, or using a blank node. That would mean, in your case, that you need to identify the statement by making statements about it subject, object and predicate, and tell more things about it, in your case - about start and end of a period it represents. This is how it would look with a blank node:

[
  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 ;
].

When defining ex:hasPeriodStart and ex:hasPeriodEnd you might want to declare their type and range:

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

Or you might prefer to assure the quality of your data with SHACL, where you'll define your constraints with shape expressions.

I'd recommend not to define your time-related properties but to reuse those from the time ontology.




回答2:


Give each of Paul’s runs its own URI:

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

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

This allows you (and others) to make statements about each run:

@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 .

Instead of listing all these runs as objects of ex:Paul ex:running, you could specify the runner for each run:

@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.

If you don’t want to create a URI for each runner’s run, you could use (unlabeled) blank nodes instead. But this makes it hard/impossible for others to refer to these runs.




回答3:


Just as an idea.

1. The modelling part (not much RDF involved)

{
    "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. The RDF part: define a proper context for your document.

   "@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. The fun part: Throw it to an RDF converter of your choice

This is how it looks in JSON-Playground



来源:https://stackoverflow.com/questions/49726990/how-do-i-add-a-start-and-end-time-to-a-rdf-triple

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!