One way to do this would be to use generic "starts" and "ends" properties that you assign to a triple (or a named graph if you prefer) like this:
ex:ng { ex:smith foaf:worksFor ex:acme }
ex:ng :starts "2009-07-06"^^xsd:date ;
:ends "2010-06-05"^^xsd:date .
Or you could use a custom format for temporal intervals and write something like:
ex:ng :validDuring "[2009-07-06,2010-06-05]" .
which allows you to put several intervals during which the triples were true (e.g., Mr Smith was employed twice by the same company).
The advantage of this approach is that it is very generic, and you can even apply inferences on temporal labels. The disadvantage is that it needs named graphs or some kind of reification to which attach the temporal annotation, and such annotations are currently not well supported by implementations.
Several research papers described temporal extensions of RDF, more or less along the line of what I present above [1,2,3] but I'm not sure what they have in terms of implementation, although I think (AFAICR) that [2] were trying to make something scalable and efficient for practical data.
- [1] Gutierrez, C., Hurtado, C., and Vaisman, A. Temporal RDF. In Proceedings of European Conference on the Semantic Web (ECSW’05), pages 93–107, 2005.
- [2] Pugliese, A., Udrea, O., and Subrahmanian, V. 2008. Scaling RDF with Time. In Proceeding of the 17th international Conference on World Wide Web (WWW'08), pages 605-614, 2008.
- [3] Tappolet, J., and Bernstein, A. Applied Temporal RDF: Efficient Temporal Querying of RDF Data with SPARQL. In Proceedings of European Semantic Web Conference (ESWC'09), pages 308–322. 2009.