2017-07-19 4 views
1

J'ai un problème pour la représentation des données RDF. La table contient des millions de lignes et plusieurs milliers de subject_id s. Voici un exemple de tableau.Comment représenter une relation temporelle comme <time:before> dans RDF?

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 

J'ai effectué une simple conversion de mappage rdf 1: 1 comme ceci en utilisant jena.

<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" 

Maintenant, je veux ajouter quelques attributs temporels comme <time:before> pour tous les subject_id, à savoir, pour information séquentielle. Voici des exemples de ce que je veux:

Pour 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> 

pour id_sujet = 146;

<foo/data/row_id=34951954> <time:before> <foo/data/row_id=34952105> 

Puis-je ajouter explicitement relation temporelle, <time:before>? Y a-t-il une meilleure façon de résoudre ce genre de problème?

+1

Je vous suggère de commencer par changer les valeurs datetime à la forme standard (un la '2016-07-15T22: 00: 00'), et de les stocker en tant que tels (par exemple,' xsd: datetime', plutôt que ' xsd: string'). Cela vous permet de faire facilement des choses comme «ORDER BY» dans les plus anciens ou les plus récents, entre autres choses ... – TallTed

+1

Vous pouvez également regarder la série de blog de Ian Davis sur [Représenter le temps dans RDF] (http : //blog.iandavis.com/2009/08/representing-time-in-rdf-part-1/) ... Comme vous pouvez le voir, ce n'est pas une question simple. – TallTed

+0

Merci @TallTed pour une suggestion valable. –

Répondre

1

Qu'est-ce que

De toute évidence, vous pouvez utiliser rdf:Seq ou rdf:List. Cependant, l'interrogation de ces structures est painful.

Je vous suggère de trouver l'ontologie ou le vocabulaire approprié pour ce type de série chronologique, ou d'utiliser votre propre vocabulaire léger. Veuillez noter que le préfixe time: est réservé par le Time ontology. Supposons que vous utilisiez la propriété foo:before.

Comment

Vous pouvez ajouter triplets avec cette propriété dans vos données RDF en utilisant SPARQL:

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)) 
    } 
} 

Performance

Analogous requête effectue environ 1 minute sur mon point final avec 3000+ "sujets" et 60000+ "rangées". Il est possible que votre table CSV ait été exportée à partir de SGBDR, où toutes ces données sont normalisées, et ce, probablement. Ensuite, vous pouvez créer une vue SQL avec des paires voisines de "lignes" et l'exporter ou générer des triplets RDF en utilisant les outils R2RML.

Une autre option consiste à trier/fichier de transformation RDF d'une certaine façon et générer des triplets que vous avez besoin avec sed, python etc.

Mise à jour

Bien sûr, les dates devraient être de type xsd:dateTime, ou au moins devrait être comparable d'une manière naturelle.

+0

Merci @Stanislav pour une réponse rapide. Apprécié. –

+0

_ "Veuillez noter que l'heure: le préfixe est réservé par l'ontologie temporelle" _ - Réservé? Comment? Où? Y a-t-il un registre? –

+0

@ MichałPolitowski, probablement un autre mot (pas «réservé») serait plus approprié. Ce préfixe est bien connu, voir [ici] (https://prefix.cc/time) (ou plutôt [this] (http://prefix.cc/popular/all.file.json) fichier). Un lecteur pourrait être confus, si quelqu'un utilise 'time:' pour quelque chose d'autre. –