Suite

Comment gérer les identifiants en double lors de l'utilisation de la fonction as_sp dans le package R osmar

Comment gérer les identifiants en double lors de l'utilisation de la fonction as_sp dans le package R osmar


Parfois, lorsque je souhaite convertir un sous-ensemble de méthodes à partir d'un fichier osm chargé avec le package osmar, je rencontre une erreur en me plaignant de noms de lignes en double. Le code suivant exécuté sur ce fichier en pièce jointe renvoie cette erreur :

Erreur dans 'row.names<-.data.frame'('*tmp*', value = c(4067932, 4296467, : les doublons 'row.names' ne sont pas autorisés). 'row.names' : '123074181', '154043350', '171826984', '176273732', '196520271', '202157002', '24240315', '24913519', '284493291', '304517627', '35556702', '38210407', '4399491', '4840974', '4840977', '60333308', '61583424', '67627350', '67627353', '68711084', '72157174'

C'est le code :

osm_data <- get_osm(complete_file(), source = osmsource_file('extract.osm')) hw_ids <- find(osm_data, way(tags(k == "highway"))) hw_ids <- find_down(osm_data, way(hw_ids )) manières <- subset(osm_data, ids = hw_ids) manières <- as_sp(ways, "lines")

Je suppose que c'est à cause des objets SpatialLines avec le même osm_id ? Comment éviter ce problème ?


Pas sûr que ce soit ce que vous recherchez, mais voici un début avec cette solution de contournement (basée sur cette réponse):

library(osmar) osm_data <- get_osm(complete_file(), source = osmsource_file('extract.osm')) hw_ids <- find(osm_data, way(tags(k == "highway"))) hw_ids <- find_down(osm_data , way(hw_ids)) manières <- subset(osm_data, ids = hw_ids) way_ids <- unique(ways$ways$refs$id) way_lns <- vector("list", length(way_ids)) pour (i en 1 : length(way_lns)) { way_lns[[i]] <- Lines(osmar:::ways_nodes2Line(way_ids[i], way$ways, way$nodes), way_ids[i]) } way_lns <- osmar :::remove_emptyLines (way_lns) splns <- SpatialLines(way_lns, proj4string = osm_crs()) dat <- cbind(ways$ways$attrs, type = as.factor("way")) daf <- data.frame(id = unique(dat $id)) rownames(daf) <- daf$id # était auparavant data$id ret <- SpatialLinesDataFrame(splns, daf) > class(ret) [1] "SpatialLinesDataFrame" attr(,"package") [1] parcelle "sp" (ret)


Le moyen le plus simple que j'ai trouvé était de faire quelque chose du genre :

Cela peut avoir des problèmes d'exécution s'il y a un grand nombre d'options, mais pour nous, cela suffit.

De plus, ce code fonctionnera avec la sélection multiple

Ensuite, vous pouvez transformer le champ suivant

Erreurs de sélection multiples comme les suivantes :

Sera réparé avec un seul appel:

L'utilisation de cette approche est également le moyen le plus rapide. J'ai écrit fast_multiselect comme fonction analogue à multiselect_set_selections . Sur un test avec 4 appels à multiselect_set_selections sur des listes d'environ 20 éléments chacune, le temps d'exécution moyen est de 16,992 secondes, où fast_multiselect n'est que de 10,441 secondes. Aussi ce dernier est beaucoup moins compliqué.


Vous utilisez une variable de table, c'est-à-dire que vous devez déclarer la table. Ce n'est pas une table temporaire.

Vous créez une table temporaire comme ceci :

Vous déclarez une variable de table comme ceci :

Notez qu'une table temporaire est déclarée à l'aide de # et qu'une variable de table est déclarée à l'aide d'un @. Allez lire sur la différence entre les variables de table et les tables temporaires.

Sur la base de votre commentaire ci-dessous, vous essayez en fait de créer des tables dans une procédure stockée. Pour cela, vous devrez utiliser du SQL dynamique. Fondamentalement, le SQL dynamique vous permet de construire une instruction SQL sous la forme d'une chaîne, puis de l'exécuter. C'est la SEULE façon de créer une table dans une procédure stockée. Je vais vous montrer comment et ensuite expliquer pourquoi ce n'est généralement pas une bonne idée.

Maintenant pour un exemple simple (je n'ai pas testé ce code mais il devrait vous donner une bonne indication de la façon de le faire):

Cette procédure stockée peut être exécutée comme ceci :

sproc_BuildTable 'Clients','NomClient','VARCHAR(32)','NON NULL'

Il existe des problèmes majeurs avec ce type de procédure stockée.

Il va être difficile de répondre à des tables complexes. Imaginez la structure de table suivante :

Ce tableau est un peu plus complexe que le premier exemple, mais pas beaucoup. La procédure stockée sera beaucoup, beaucoup plus complexe à gérer. Ainsi, bien que cette approche puisse fonctionner pour les petites tables, elle deviendra rapidement ingérable.

La création de tableaux nécessite une planification. Lorsque vous créez des tables, elles doivent être placées stratégiquement sur différents groupes de fichiers. Cela permet de s'assurer que vous ne provoquez pas de conflit d'E/S de disque. Comment aborderez-vous l'évolutivité si tout est créé sur le groupe de fichiers principal ?

Pourriez-vous préciser pourquoi vous avez besoin que les tables soient créées dynamiquement ?

Mise à jour retardée en raison de la charge de travail. J'ai lu votre commentaire sur la nécessité de créer une table pour chaque magasin et je pense que vous devriez le faire comme l'exemple que je suis sur le point de vous donner.

Dans cet exemple, je fais les hypothèses suivantes :

  1. C'est un site e-commerce qui compte de nombreuses boutiques
  2. Un magasin peut avoir de nombreux articles (marchandises) à vendre.
  3. Un article particulier (bien) peut être vendu dans de nombreux magasins
  4. Un magasin facturera des prix différents pour différents articles (marchandises)
  5. Tous les prix sont en $ (USD)

Disons que ce site de commerce électronique vend des consoles de jeux (c'est-à-dire Wii, PS3, XBOX360).

En regardant mes hypothèses, je vois une relation classique plusieurs-à-plusieurs. Un magasin peut vendre de nombreux articles (marchandises) et des objets (marchandises) peuvent être vendus dans de nombreux magasins. Décomposons cela en tableaux.

J'aurais d'abord besoin d'une table de magasin pour stocker toutes les informations sur le magasin.

Une simple table de magasin pourrait ressembler à ceci :

Insérons trois boutiques dans la base de données à utiliser lors de notre exemple. Le code suivant insère trois boutiques :

Si vous exécutez une boutique SELECT * FROM, vous verrez probablement ce qui suit :

Bon, passons maintenant à la table Articles (marchandises). Étant donné que les articles/marchandises sont des produits de diverses sociétés, je vais appeler le produit de table. Vous pouvez exécuter le code suivant pour créer une table Product simple.

Remplissons la table des produits avec quelques produits. Exécutez le code suivant pour insérer certains produits :

Si vous exécutez SELECT * FROM Product, vous verrez probablement ce qui suit :

OK, à ce stade, vous avez à la fois des informations sur le produit et la boutique. Alors comment les réunir ? Eh bien, nous savons que nous pouvons identifier la boutique par sa colonne de clé primaire ShopID et nous savons que nous pouvons identifier un produit par sa colonne de clé primaire ProductID. De plus, étant donné que chaque magasin a un prix différent pour chaque produit, nous devons stocker le prix facturé par le magasin pour le produit.

Nous avons donc un tableau qui mappe la boutique au produit. Nous appellerons cette table ShopProduct. Une version simple de ce tableau pourrait ressembler à ceci :

Supposons donc que la boutique American Games R Us ne vend que des consoles américaines, l'Europe Gaming Experience vend toutes les consoles et l'Asian Games Emporium ne vend que des consoles asiatiques. Nous aurions besoin de mapper les clés primaires des tables shop et product dans la table ShopProduct.

Voici comment nous allons faire la cartographie. Dans mon exemple, l'American Games R Us a une valeur ShopID de 1 (il s'agit de la valeur de la clé primaire) et je peux voir que la XBOX360 a une valeur de 3 et que la boutique a répertorié la XBOX360 pour 159,99 $

En exécutant le code suivant, vous terminerez le mappage :

Maintenant, nous voulons ajouter tous les produits à la boutique Europe Gaming Experience. Dans cet exemple, nous savons que la boutique Europe Gaming Experience a un ShopID de 3 et comme elle vend toutes les consoles, nous devrons insérer les ProductID 1, 2 et 3 dans la table de mappage. Supposons que les prix des consoles (produits) dans la boutique Europe Gaming Experience soient les suivants : 1- La PS3 se vend 259,99 $ , 2- La Wii se vend 159,99 $ , 3- La XBOX360 se vend 199,99 $.

Pour effectuer ce mappage, vous devez exécuter le code suivant :

À ce stade, vous avez mappé deux magasins et leurs produits dans la table de mappage. OK, alors comment puis-je rassembler tout cela pour montrer un utilisateur naviguant sur le site Web ? Imaginons que vous souhaitiez afficher tous les produits de l'European Gaming Experience à un utilisateur sur une page Web. Vous devez exécuter la requête suivante :

Vous verrez probablement les résultats suivants :

Maintenant, pour un dernier exemple, supposons que votre site Web dispose d'une fonctionnalité qui trouve le prix le moins cher pour une console. Un utilisateur demande à trouver les prix les moins chers pour XBOX360.

Vous pouvez exécuter la requête suivante :

Cette requête renverra une liste de tous les magasins qui vendent la XBOX360 avec le magasin le moins cher en premier et ainsi de suite.

Vous remarquerez que je n'ai pas ajouté la boutique Asian Games. A titre d'exercice, ajoutez la boutique de jeux asiatiques à la table de mappage avec les produits suivants : l'Asian Games Emporium vend la console de jeux Wii à 99,99 $ et la console PS3 à 159,99 $. Si vous travaillez sur cet exemple, vous devez maintenant comprendre comment modéliser une relation plusieurs-à-plusieurs.


Hadley Wickham, l'auteur de dépliant explique :

  • Il n'extrait jamais de données dans R à moins que vous ne le demandiez explicitement.
  • Il retarde tout travail jusqu'au dernier moment possible - il rassemble tout ce que vous voulez faire, puis l'envoie à la base de données en une seule étape.

Lorsque vous construisez un dépliant requête, vous pouvez connecter plusieurs verbes dans un seul pipeline. Par exemple, nous avons combiné les verbes filter() et select() en utilisant le tube %>%.

Si nous le voulions, nous pourrions ajouter encore plus d'étapes, par ex. supprimez la colonne sexe dans un appel de sélection supplémentaire :

Tout comme le premier appel select(species_id, sex, weight), la commande select(-sex) n'est pas exécutée par R. Elle est plutôt envoyée à la base de données. Seulement le final résultat est récupéré et affiché pour vous.

Bien sûr, nous pourrions toujours ajouter plus d'étapes, par exemple, nous pourrions filtrer par species_id ou minimum weight . C'est pourquoi R ne récupère pas l'ensemble complet des résultats - à la place, il récupère uniquement les 10 premiers résultats de la base de données par défaut. (Après tout, vous voudrez peut-être ajouter une étape supplémentaire et faire en sorte que la base de données fasse plus de travail…)

Pour demander à R d'arrêter d'être paresseux, par ex. pour récupérer tous les résultats de la requête de la base de données, nous ajoutons la commande collect() à notre pipe. Il indique que notre requête de base de données est terminée : il est temps d'obtenir le final résultats et les charger dans la session R.

Maintenant, nous avons les 17 lignes qui correspondent à notre requête dans un data.frame et pouvons continuer à travailler avec elles exclusivement dans R, sans communiquer avec la base de données.


7 réponses 7

C'est un problème depuis longtemps, le téléchargement de plusieurs fichiers a le même problème en ce sens que vous ne pouvez pas appliquer de métadonnées aux éléments lors du téléchargement de plusieurs fichiers à la fois. La solution de contournement consiste à rendre les champs de métadonnées souhaités requis. Cela force les fichiers à rester extraits vers le téléchargeur jusqu'à ce que les champs requis soient renseignés et archivés.

Vous pouvez éventuellement utiliser jQuery UI pour vous connecter à l'événement de dépôt, puis regarder la page pour obtenir l'ID approprié, puis utiliser les mises à jour du service Web pour effectuer une mise à jour en masse des métadonnées des fichiers. Je n'ai vu aucun exemple de cela dans la nature, mais cela semble faisable en théorie.

Je suis tombé sur cela en cherchant et j'ai pensé que j'ajouterais mes pensées. J'ai également cherché un moyen de résoudre ce problème.

Le fichier DragDrop.js dans Layouts a une fonction appelée UploadProgressFunc qui n'est essentiellement qu'une instruction switch. L'une des options de ce commutateur est téléchargée. C'est la fonction à exploiter si vous devez gérer cela différemment.

J'ai créé un fichier js séparé appelé DragDrop.Extended.js , il contient une copie de la fonction UploadProgressFunc qui appelle simplement une nouvelle fonction après avoir défini le messageType sur le cas 4 .

Il s'agit d'utiliser le comportement Javascript d'écrasement des fonctions existantes par la nouvelle lorsqu'un doublon se charge. Cela signifie que je n'ai pas à éditer de fichiers OOTB. Je peux simplement exécuter cet extrait de js dans ma page maître.

Maintenant, comme c'est sur la page maître, il s'exécute pour toujours la page. J'espère finir par avoir une meilleure solution. Le code vérifie si le fichier dragdrop.js a été chargé en cherchant si la fonction n'est pas définie. S'il a été chargé, il se charge également dans mon fichier pour écraser cette fonction.

La nouvelle fonction utilisée actuellement ne gère qu'un fichier à la fois, je travaille actuellement à lui faire gérer plusieurs fichiers. La nouvelle fonction appelée utilise le JSOM pour obtenir des informations sur le fichier téléchargé. Il crée ensuite un appel à la liste pour récupérer l'ID du fichier téléchargé. Ceci est nécessaire car il ne ramène jamais cet ID au contexte lors du téléchargement.

Avec l'ID et les détails disponibles dans le contexte, je suis en mesure de construire l'URL EditForm pour cet élément. Je passe ensuite simplement cette URL EditForm dans une boîte de dialogue SP.

Avec tout cela en place, une fois qu'un utilisateur a fait glisser un élément vers la bibliothèque de documents, une boîte de dialogue apparaît alors pour qu'il l'ajoute dans les métadonnées. C'est un point de départ pour le moment. Je cherche actuellement à faire fonctionner cela pour plusieurs fichiers et à rechercher une solution plus élégante pour charger le script de fonction d'écrasement.

Pour obtenir le ou les identifiants des fichiers téléchargés, j'ai utilisé JSOM et interrogé la bibliothèque de documents avec une requête CAML. Vous pouvez obtenir le nom de la bibliothèque à partir du contexte et du nom d'utilisateur actuel de l'utilisateur. Avec ces détails, je recherche simplement les fichiers téléchargés par l'utilisateur au cours des dernières minutes. J'ai ensuite construit un tableau JS d'URL d'édition.

J'ai ensuite chargé des boutons personnalisés dans le modal à l'aide de javascript, ils ont parcouru le tableau d'URL d'édition construit avec les résultats de la requête. J'ai également dû remplacer la fonction de soumission, sinon la fenêtre s'est fermée après en avoir enregistré une. J'ai supprimé les URL d'édition du tableau après chaque sauvegarde.

Je ne travaille plus sur ce projet donc je m'excuse pour le manque d'exemple de code dans l'édition.


Autres messages serveur à client ^Haut

Message d'horloge rapide

La commande 'PFT' est utilisée pour synchroniser l'heure de l'horloge rapide. Il est envoyé depuis le serveur lorsque l'heure ou le taux changent, indiquant l'heure « maintenant » et le rapport horaire actuel (ou 0 lorsque l'horloge s'est arrêtée). Les exemples comprennent:

Le premier nombre est un nombre entier de secondes depuis minuit, le 1er janvier 1970, heure d'horloge rapide. Cette date zéro est très proche de l'époque Unix, qui est minuit le 1er janvier 1970 UTC, ne différant que par le décalage horaire, le cas échéant. En fait, cela facilite la conversion de cette valeur à l'aide des bibliothèques d'heure standard, tant que les conversions de fuseau horaire sont omises. JMRI envoie une valeur basée sur la date du système lorsque l'horloge rapide a été démarrée, il renverra donc une valeur proche de la date du calendrier. Étant donné que l'horloge rapide JMRI ne prend pas vraiment en charge les dates du calendrier, seules l'heure, la minute et la seconde sont utiles. Le Digitrax LNWI renvoie des valeurs comprises dans la plage 0-86400, ce qui se traduit par des heures au 1er janvier 1970, lorsque le jour, le mois et l'année sont calculés.
Pour donner un exemple : une instance JMRI démarrée le 13 décembre 2020 avec une heure d'horloge rapide réglée sur 10:23:45 renverra 1607855025, qui peut être reconverti en heures, minutes et secondes en "divisant modulo" par 86400 ( nombre de secondes dans une journée) et en calculant en outre comme suit :
1607855025 mod 86400 = 37425 secondes depuis minuit.
37425 secondes depuis minuit = 10 heures 1425 secondes depuis minuit = 10 heures 23 minutes 45 secondes depuis minuit = 10:23:45 am.
Le deuxième nombre est le rapport de temps rapide actuel. Il peut s'agir d'une valeur entière (4) ou d'une valeur à virgule flottante (4.0). Si cette valeur est 0 (ou 0,0), l'horloge est arrêtée.
Des mises à jour sont envoyées à chaque changement d'heure ou de fréquence, et lorsque l'horloge s'arrête ou démarre, alors attendez-vous à un message toutes les minutes d'horloge rapide.

Message d'alerte et d'information

Le serveur peut envoyer une chaîne de message que le client peut afficher. Ceux-ci ne peuvent pas avoir de nouvelles lignes dans le message. Deux types:
Message d'alerte : 'HM' + texte du message. Normalement utilisé pour renvoyer les erreurs à afficher à l'utilisateur.
Message d'information : 'Hm' + texte du message. Identique à HM, mais à titre informatif uniquement.

Exemple renvoyé après que le client demande une adresse non valide (disons M0+L23<>L23 ) la réponse est :

Message de type de serveur

Le serveur peut envoyer un "type" pour s'identifier aux clients, utile pour activer des comportements spécifiques. Deux types:
'HT' + type. Types connus : 'Digitrax', 'MRC', 'JMRI'
'Ht' + description. Chaîne de texte d'information plus longue, ne peut pas contenir de nouvelles lignes


2 réponses 2

Vraisemblablement, vous voulez voir une seule entrée pour chaque combinaison unique personne/adresse/e-mail/site Web. Si c'est le cas, essayez ceci :

La clause GROUP BY à la fin garantit qu'une seule ligne est renvoyée pour chaque combinaison unique de colonnes dans la clause GROUP BY. Cela devrait empêcher l'affichage de lignes en double dans vos résultats.

Quelques points à noter :

Utilisez toujours le qualificateur de schéma sur la clause FROM. FROM Person doit être FROM dbo.Person -> cela élimine toute confusion si vous introduisez de nouveaux schémas à l'avenir et évite à l'optimiseur de requêtes d'avoir à rechercher le schéma par défaut pour votre utilisateur.

Pour la maintenance à l'avenir, vous voudrez probablement nommer les colonnes de la même manière, quelle que soit la table dans laquelle elles se trouvent. Ainsi, par exemple, au lieu que la colonne ID de la table People soit nommée ID et qu'elle soit nommée Person dans la table Address, je Je l'appellerais PersonID dans tous les deux les tables. Cela évite toute confusion (bugs de lecture) dans les jointures telles que dbo.Person LEFT JOIN dbo.Address ON Person.ID = Address.Person .

Au lieu de nommer les tables comme Person , elles doivent être nommées d'après la collection d'éléments qu'elles contiennent, au pluriel. Ainsi, Person devient People , et Address devient Addresses . Cela élimine la confusion -> la table d'adresses contient-elle réellement une seule adresse ou plusieurs adresses ?

WITH (NOLOCK) doit être évité comme la peste, à moins que vous ne compreniez parfaitement les conséquences de la lecture de lignes qui ont été modifiées par d'autres transactions mais pas encore validées. Depuis MSDN :

Les transactions exécutées au niveau READ UNCOMMITTED n'émettent pas de verrous partagés pour empêcher d'autres transactions de modifier les données lues par la transaction en cours. Les transactions READ UNCOMMITTED ne sont pas non plus bloquées par des verrous exclusifs qui empêcheraient la transaction en cours de lire les lignes qui ont été modifiées mais non validées par d'autres transactions. Lorsque cette option est définie, il est possible de lire les modifications non validées, appelées lectures modifiées. Les valeurs des données peuvent être modifiées et des lignes peuvent apparaître ou disparaître dans l'ensemble de données avant la fin de la transaction. Cette option a le même effet que la définition de NOLOCK sur toutes les tables dans toutes les instructions SELECT d'une transaction. C'est le moins restrictif des niveaux d'isolement.

Dans SQL Server, vous pouvez également minimiser les conflits de verrouillage tout en protégeant les transactions des lectures modifiées des modifications de données non validées en utilisant soit :

Le niveau d'isolement READ COMMITTED avec l'option de base de données READ_COMMITTED_SNAPSHOT définie sur ON.

Le niveau d'isolement SNAPSHOT.


Comme le mentionnent les réponses à l'autre question (dont celle-ci est considérée comme un doublon), il existe (depuis la version 9.5) une fonctionnalité UPSERT native. Pour les anciennes versions, continuez à lire :)

J'ai mis en place un test pour vérifier les options. J'inclurai le code ci-dessous, qui peut être exécuté dans psql sur une machine linux/Unix (simplement parce que par souci de clarté dans les résultats, j'ai redirigé la sortie des commandes de configuration vers /dev/null - sur une machine Windows on pourrait choisir un fichier journal à la place).

J'ai essayé de rendre différents résultats comparables en utilisant plus d'un (c'est-à-dire 100) INSERT par type, exécutés à partir d'une boucle à l'intérieur d'une procédure stockée plpgsql. De plus, avant chaque exécution, la table est réinitialisée en tronquant et en réinsérant les données d'origine.

En vérifiant quelques tests, il semble que l'utilisation de la règle et l'ajout explicite de WHERE NOT EXISTS à l'instruction INSERT prennent le même temps, tandis que la détection d'une exception prend beaucoup plus de temps.

Astuce : Un bloc contenant une clause EXCEPTION est nettement plus coûteux à entrer et à sortir qu'un bloc sans clause. Par conséquent, n'utilisez pas EXCEPTION sans besoin.

Personnellement, en raison de la lisibilité et de la maintenabilité, je préfère ajouter le bit WHERE NOT EXISTS aux INSERT eux-mêmes. Tout comme avec les déclencheurs (qui pourraient également être testés ici), le débogage (ou simplement le traçage du comportement INSERT) est plus compliqué avec les règles présentes.

Et le code que j'ai utilisé (n'hésitez pas à signaler des idées fausses ou d'autres problèmes):


Contenu

Les systèmes d'identification des actifs médiatiques existent depuis des décennies. La motivation commune de leur création est de permettre la gestion des actifs multimédias grâce à l'attribution d'un identifiant unique à un ensemble de métadonnées représentant les caractéristiques principales de chaque actif. Au fil du temps, ces systèmes ont tendance à proliférer, chacun survenant pour traiter un ensemble spécifique de problèmes. En conséquence, il existe une variation considérable entre les systèmes en termes de catégories d'actifs, de métadonnées associées à chaque actif et de définition même d'un actif. Pour ne citer que quelques exemples, un "director's cut" d'un film devrait-il être distinct de la sortie en salle d'origine ? Comment tenir compte des variations régionales (par exemple, traduction du titre ou du dialogue en langues étrangères) ? D'autres complications incluent les procédures (et les informations d'identification requises) pour l'ajout de nouveaux actifs, la modification des actifs existants et la création d'actifs dérivés.

L'EIDR a été créé pour résoudre ces problèmes, ainsi que d'autres rencontrés dans les flux de travail des ressources vidéo, à la fois dans un contexte interentreprises et dans les activités de post-production intra-muros des producteurs de contenu. L'EIDR a les caractéristiques suivantes :

  • Un registre central accessible à tous les participants
  • Possibilité d'enregistrer facilement de nouveaux actifs
  • Un identifiant d'actif qui est immuable (et en particulier en ce qui concerne les changements de propriété de l'actif ou l'emplacement des métadonnées ou de l'actif lui-même)
  • Détection/prévention des doublons d'un même bien en cours de création
  • Possibilité de créer un ensemble d'éléments vidéo dérivés d'une œuvre abstraite (par exemple, sortie en salle originale, montage du réalisateur, variantes linguistiques)
  • Possibilité de regrouper les ressources vidéo par relations plus générales (par exemple, les épisodes d'une saison d'une série télévisée)
  • Un ensemble de métadonnées de base pour différencier les actifs, même lorsqu'ils sont étroitement liés
  • Évolutif, immuable, persistant

L'EIDR est destiné à compléter, et non à remplacer, les systèmes d'identification des actifs existants. Au contraire, une caractéristique clé est de permettre à un enregistrement EIDR d'inclure des références à l'ID de cet actif sous d'autres systèmes. Cette fonctionnalité est particulièrement utile pour les archives cinématographiques et télévisuelles, leur permettant de croiser facilement leurs fonds avec d'autres sources pour le travail et les métadonnées qui s'y rapportent. De par sa conception, EIDR ne reproduit pas les caractéristiques d'autres systèmes d'identification d'actifs, par ex. systèmes commerciaux qui cherchent à ajouter de la valeur grâce à des métadonnées améliorées (par exemple, des résumés de parcelles, des détails de production). Ce n'est pas non plus un objectif de suivre les informations sur la propriété et les droits, qui peuvent toutefois être implémentées en tant qu'applications utilisant l'ID EIDR.

L'EIDR est construit sur une collection d'enregistrements (qui sont ensuite subdivisés en champs) qui sont stockés dans un registre central. Ces enregistrements sont référencés en externe par des DOI, qui sont attribués lors de la création d'un enregistrement, et chaque identifiant est immuable par la suite. Le système de résolution d'identifiant sous-jacent aux DOI est le Handle System et donc chaque ID de contenu EIDR natif est un handle formaté, avec une spécificité croissante, pour gérer les normes DOI et EIDR.

Format d'ID de contenu Modifier

La forme canonique d'un ID de contenu EIDR est une instance d'un descripteur et a le format :

10.5240/XXXX-XXXX-XXXX-XXXX-XXXX-C

  • 10.5240 est le préfixe DOI pour un actif EIDR. Le « 10 » indique que la poignée est un DOI, d'autres préfixes sont attribués à d'autres types d'actifs (par exemple, des publications universitaires). Les chiffres entre le "." et "/" forment le sous-préfixe, qui indique quelle agence d'enregistrement au sein de la Fondation internationale DOI (IDF) a le droit de gérer ces poignées. "5240" est attribué à l'association EIDR.
  • XXXX-XXXX-XXXX-XXXX-XXXX-C est le suffixe DOI. Chaque "X" désigne un chiffre hexadécimal (A-F) et "C" est un chiffre de contrôle ISO 7064 Mod 37,36 [1].

Il existe également une forme binaire compacte de 96 bits destinée à être intégrée dans de petites charges utiles telles que des filigranes. Ce formulaire est généré à partir du format canonique comme suit :

  • Sous-préfixe 16 bits : généré en interprétant le sous-préfixe comme une valeur binaire, par ex. B'0001010001111000'
  • Suffixe de 80 bits : la partie sans somme de contrôle du suffixe, représentée par 10 octets

Le formulaire de nom de ressource uniforme pour un ID EIDR est spécifié dans la RFC 7302.

Pour une utilisation sur le Web, un ID de contenu EIDR peut être représenté sous la forme d'un URI sous l'une des formes suivantes :

  • https://doi.org/10.5240/XXXX-XXXX-XXXX-XXXX-XXXX-C: il s'agit d'un ID EIDR représenté comme une référence proxy DOI (il sera redirigé du DOI vers le registre EIDR)
  • info:doi:10.5240/XXXX-XXXX-XXXX-XXXX-XXXX-C [obsolète]: il s'agit d'un ID EIDR représenté comme un URI "info" conforme à la RFC 4452 (en rappelant que tous les ID EIDR sont également des ID DOI, mais pas l'inverse).

Types d'enregistrement Modifier

Il existe quatre types d'enregistrements de contenu, chacun associé à un préfixe réservé :

  • ID de contenu (10.5240/XXXX-XXXX-XXXX-XXXX-XXXX-C) : est associé à un élément de divertissement tel qu'un film ou une série télévisée. Les enregistrements de contenu sont hiérarchiques, ce qui permet d'exprimer des relations telles qu'une série, dont les enfants seraient des saisons, dont les enfants seraient à leur tour des épisodes individuels. De nombreuses autres relations sont prises en charge, comme décrit ci-dessous. Les enregistrements de contenu constituent la majeure partie des données du registre EIDR.
  • Identifiant du parti (10.5237/XXXX-XXXX) : identifie les entités telles que les titulaires de noms de domaine, les producteurs de contenu et les distributeurs.
  • ID de service vidéo (10.5239/XXXX-XXXX) : identifie un service vidéo, familièrement connu sous le nom de « chaîne » ou « réseau » : une séquence (généralement) linéaire de contenu programmé pour être diffusé à des heures spécifiées (par exemple, l'ID de service pour Cartoon Network est 10.5239/8BE5-E3F6). Les services vidéo sont hiérarchiques : par exemple, un parent peut avoir plusieurs enfants pour tenir compte des variations régionales ou linguistiques).
  • Identifiant d'utilisateur (10.5238/[0-9a-zA-Z_.#()]<2-32>) : identifie un utilisateur à l'aide d'une chaîne de 2 à 32 caractères alphanumériques et de caractères spéciaux sélectionnés (illustrés ici avec la syntaxe Perl). Un Utilisateur est avant tout un concept administratif qui est subordonné aux Parties (dont ils héritent des droits d'accès). Contrairement aux autres DOI EIDR, l'ID utilisateur ne peut être utilisé que dans EIDR (par exemple, les API de programmation).

Les sous-préfixes 5237, 5238, 5239 et 5240 sont tous attribués à l'association EIDR.

Enregistrements de contenu Modifier

Les enregistrements de contenu sont des objets classés selon leurs types et leurs relations. Chacun a trois types différents (orthogonaux) de type :

  • Type d'objet: il y en a 10 au total. Le premier est le type de base, qui possède les champs minimaux nécessaires pour décrire un enregistrement de contenu. Les 9 autres sont dérivés du type de base et contiennent des champs supplémentaires pour décrire des objets plus complexes.
  • Type de structure: celles-ci distinguent les représentations d'une œuvre et sont répertoriées par ordre croissant de spécificité :
    • Abstraction: Utilisé pour des objets n'ayant aucune réalité, comme un conteneur de série ou le concept le plus basique de l'œuvre originale. Cela correspond à l'International Standard Musical Work Code (ISWC) pour les œuvres musicales, à l'International Standard Text Code (ISTC) pour les œuvres textuelles ou à l'International Standard Audiovisual Number (ISAN) pour les œuvres audiovisuelles.
    • Performance: Utilisé pour les éléments qui sont des versions particulières d'une œuvre, telles que la sortie en salles originale ou la coupe du réalisateur d'un film ou une version censurée localement d'une émission de télévision. Cela correspond à peu près à l'International Standard Recording Code (ISRC) pour les œuvres musicales et à certaines utilisations de la version ISAN (V-ISAN) pour les œuvres audiovisuelles.
    • Numérique: représentation numérique particulière d'une œuvre, telle qu'un codage MPEG-2 d'un film. Cela correspond à certaines utilisations du V-ISAN.
    • Séries: une abstraction qui contient des éléments individuels ordonnés ou non.
    • Saison: Un deuxième niveau de regroupement en dessous d'une série, couvrant généralement un intervalle de temps
    • la télé: Contenu qui est apparu pour la première fois via la diffusion.
    • Film: contenu de longue durée apparu pour la première fois au cinéma ou au théâtre.
    • Court : défini de manière vague pour couvrir une œuvre de 40 minutes ou moins, telle que des vidéoclips, des films d'actualités pour le cinéma ou des courts métrages de dessins animés pour le cinéma ou la télévision numérique.
    • la toile: Contenu apparu pour la première fois sur le Web. Ceci est différent du contenu d'ailleurs qui a été rendu disponible sur le Web.
    • Matériel interactif: Contenu qui n'est pas strictement audiovisuel. Il couvre les menus de DVD, les superpositions de télévision interactives, les lecteurs personnalisés, etc.
    • Compilation: Contenu composé de plusieurs autres éléments qui ne peuvent être décrits plus précisément, comme un coffret d'une franchise de films.
    • Supplémentaire: ce type est destiné au contenu secondaire dont l'objectif principal est de soutenir, d'augmenter ou de promouvoir d'autres contenus. Les exemples incluent les bandes-annonces, les prises de vue et les documentaires promotionnels (pièces "making of").

    Métadonnées de base Modifier

    Les champs suivants (tirés d'un ensemble plus large) comprennent les données d'objet de base d'un enregistrement de contenu :

    • Type de structure: par exemple. Abstraction
    • Mode: par exemple. AudioVisuel (pour un film ou un programme TV) "Audio" pour un programme radio "Visuel" pour une œuvre muette.
    • Type de référent: par exemple. Film
    • Titre: le titre principal. Les titres et les titres alternatifs se distinguent en outre par :
      • Lang: la langue du titre exprimée en code ISO 639-1
      • Classer: version ou régional

      Enregistrements de contenu supprimés Modifier

      Un ID EIDR doit toujours pouvoir être résolu. Ainsi, dans des circonstances normales, l'enregistrement de contenu correspondant sera permanent. Il existe deux mécanismes pour traiter les erreurs ou d'autres circonstances inhabituelles. Le préféré est l'alias, par lequel un ID EIDR est redirigé de manière transparente vers un autre enregistrement de contenu. L'aliasing est couramment utilisé pour traiter un actif enregistré deux fois.

      L'autre mécanisme est l'utilisation d'enregistrements tombstone. Ceci est utilisé lorsque l'enregistrement de contenu est corrompu ou qu'un actif autrement invalide a été accidentellement enregistré. Dans ce cas, l'ID sera associé à un enregistrement de pierre tombale spécial. La pierre tombale peut être reconnue par les applications car son champ ID EIDR sera défini sur la valeur distinctive "10.5240/0000-0000-0000-0000-0000-X". Notez que "X" signifie la 24ème lettre de l'alphabet latin (ASCII 0x58 ou Unicode U+0058).

      Identifiant alternatif Modifier

      Disposer d'un riche ensemble d'identifiants alternatifs pour le contenu est l'un des principaux objectifs de l'EIDR. Cela permet aux ID EIDR d'être utilisés partout dans les flux de travail de contenu. Si un autre ID est nécessaire, il peut être trouvé dans les métadonnées de l'ID EIDR. L'EIDR prend en charge l'inclusion de références d'ID propriétaires et d'autres références d'ID standard (par exemple, ISAN). Des identifiants alternatifs supplémentaires peuvent être ajoutés si nécessaire (par exemple, par des parties souhaitant prendre en charge de nouveaux flux de travail). Vous trouverez ci-dessous un exemple d'ID alternatif pour l'élément EIDR 10.5240/EA73-79D7-1B2B-B378-3A73-M (le film Coureur de lame). Si un autre ID peut être résolu par un algorithme, par exemple en le plaçant de manière appropriée dans une URL de modèle, EIDR rend ce lien disponible.

      Identifiants alternatifs pour 10.5240/EA73-79D7-1B2B-B378-3A73-M
      Identifiant alternatif 0000-0000-14A9-0000-K-0000-0000-E
      Taper: EST UN
      Identifiant alternatif #2 89
      Taper: TVA
      Identifiant alternatif #3 B000SW4DLM
      Taper: Propriétaire Domaine: amazon.com
      Identifiant alternatif n°4 12886
      Taper: Propriétaire Domaine: flixster.com
      Identifiant alternatif n°5 15042
      Taper: Propriétaire Domaine: thecinemasource.com
      Identifiant alternatif #6 tt0083658
      Taper: BDIM Relation: IsMêmeAs
      Identifiant alternatif #7 E0087486000
      Taper: Propriétaire Domaine: spe.sony.com/MPM
      Identifiant alternatif #8 3929
      Taper: Propriétaire Domaine: spe.sony.com/ProductID
      Identifiant alternatif #9 2002029
      Taper: Propriétaire Domaine: warnerbros.com/MPM
      Identifiant alternatif #10 389785
      Taper: Propriétaire Domaine veronicamagazine.nl
      Identifiant alternatif #11 B001EC2J1G
      Taper: Propriétaire Domaine: amazon.com
      Identifiant alternatif n°12 150002645
      Taper: Propriétaire Domaine: bfi.org.uk

      Les identifiants alternatifs sont divisés en non propriétaires et propriétaires. The former have distinguished, predefined types (e.g. those issued by ISAN, IMDb, and IVA), whereas proprietary IDs are all of type "Proprietary", and are further distinguished by an associated DNS domain. As of July 2017, there are over 2 million alternate IDs directly available through EIDR.

      Relationships between objects Edit

      Content objects can be related to each other according to the following table. These relations are expressed as additional fields in the content record and are thus relative to that object. Note that the subject object is the child and the target is the parent (e.g. subject is<relation-type>Of parent). Additional constraints are noted in the table.

      Inheritance relationships: The object on which the relationship exists can inherit basic metadata fields from the object to which the relationship refers. Only one inheritance relationship may exist on an object. These relationships produce a tree structure rooted in the EIDR ID for an abstraction.
      isSeasonOf A group of series episodes released over a contiguous span of time (e.g. broadcast year) e.g. 10.5240/AB95-8734-5D98-A282-2DF0-C ("Season 9") is a season of 10.5240/C272-DA64-E2B5-0A78-2AC3-Z ("The X-Files")
      isEpisodeOf par exemple. 10.5240/E008-224D-0397-0560-6300-8 ("Sunshine Days") is an episode of 10.5240/AB95-8734-5D98-A282-2DF0-C ("Season 9").
      isEditOf An instance of a title with unique characteristics that differentiate it from any other version. For example, 10.5240/7290-C8AD-12BA-4F93-3B07-7 ("Blade Runner: The Director's Cut") is an edit of 10.5240/EA73-79D7-1B2B-B378-3A73-M.
      isManifestationOf A manifestation is a more specific instance of a work that can be sold, transmitted, transferred or played. The parent of a manifestation should be an edit. For example, 10.5240/9CE1-DE39-5F3E-073D-4307-7 is the Ultraviolet Standard CFF (standard definition, English audio and subtitles) for "Blade Runner: The Director's Cut". It is a manifestation of the abstract work 10.5240/EA73-79D7-1B2B-B378-3A73-M.
      isClipOf One (and only one) contiguous fragment of an asset.
      Dependence relationships: The objects to which the relationship refers have a strong bearing on the basic nature of the object on which the relationship exists. This means that the objects referred to in the relationship must be taken into account when checking for duplicates when an object is created or modified. These relationships produce directed graphs within and across trees.
      isCompositeOf A single work composed of parts of multiple other records.
      isCompilationOf A collection of multiple whole works that is not more precisely describable.
      Lightweight relationships: There is no inheritance the objects to which they refer do not influence the underlying nature of the object on which the relationship exists. These relationships are used primarily when moving around within the object tree and connecting object trees to each other, producing a directed graph across elements of those trees.
      isPackagingOf For creating a collection of assets that are released together e.g. 10.5240/F219-975E-5990-4570-BA75-2 ("Hannah Montana and Miley. ") is a packaging of 10.5240/9ABE-2BF1-ACE7-EBA2-8E57-N.
      isPromotionOf Promotional objects such as a trailer.
      isSupplementTo Ancillary material that might be found on a DVD, such as an outtake or behind-the-scenes feature.
      isAlternateContentFor Content that in synchronized to the main asset, such as audio or an alternate camera angle.

      EIDR has been incorporated into many standards. A few of the more significant ones are listed here:

      • SMPTE/AMWA: SMPTE Recommended Practice RP 2079 [3] standardizes use of EIDR in MXF media containers, at the heart of professional content workflows, including AMWA AS-03 [4] and AS-11 [5] specifications. SMTPE Recommended Practice 2021-5 [6] allows an EIDR Identifier to be carried wherever BXF is used for exchange of data among broadcast systems.
      • European Broadcasting Union (EBU): EBUCore [7] is a common core set of descriptive and technical metadata that describe media resources (audio, video, still images, subtitling, etc.). EBU and EIDR staff have produced a mapping of EBUCore for base records to EIDR root objects: .. EIDR and EBU are working together in the SMPTE Core working group to define descriptive metadata for SMPTE-based specifications and workflows. EIDR is one of the standards supported by the EBU Core.
      • DVB: EIDR is referenced in draft DVB specifications for companion screens [8] (tm-sm-css-0017r14).
      • MPEG: EIDR has been proposed as a content identifier in the Multimedia Preservation Application Format [9] that is being defined for archival use.
      • CableLabs (US): EIDR is part of the CableLabs Metadata [10] standard for the distribution of video on demand assets. EIDR is one program identifier that can be present in an SCTE-35 2013 [11] segmentation descriptor, a standard used in IP distribution over cable. EIDR is also used in Dynamic Ad Insertion (DAI) products using the SCTE 130 [12] standard architecture.
      • EIDR and Alternate IDs: In order to promote interoperability of EIDR with a wide variety of systems, EIDR includes an "AlternateID" field to cross-reference existing IDs systems. Alternate IDs may include, for example, CRID (RFC 4078), ISAN, ISRC, UPC, or URI, as well as commercial ID systems such as Ad-ID, Baseline, IMDb, etc. Currently about half of EIDR records carry an ID from at least one other system.
      • Mapping from other Standard Metadata and Identifiers to EIDR: Other metadata and identifier systems can be directly mapped into EIDR:
        • EN 15907 and EN 15744: These standards are under the auspices of the European Committee for Standardization CEN/TC 372 and filmstandards.org. [13] Best practices and mappings are available for EN 15907 and EN 15744 root objects. EIDR is also working with film archives to extend interoperability with these standards to a more granular level of detail, including a project with the British Film Institute (BFI) to register their EN 15907-based records with EIDR.
        • International Standard Audiovisual Number (ISAN): ISAN is widely used in rights management and collection systems. A complete mapping of an ISAN registration to an EIDR registration is available. The UK Audio-Visual Registration Agency, a joint venture between EIDR and ISAN-UK provides joint registration services for both identifiers. Precursors to this service have been used to obtain EIDR IDs and ISANs for broadcast content from ITV (a commercial TV network in the United Kingdom).

        EIDR identifiers have found their way into an increasing number of commercial applications. The following are illustrative of some of the advantages of using EIDR:

        • Warner Brothers-Xbox integration: EIDR was used to improve the implementation of an Electronic Sell Through (EST) system for delivering Warner Theatrical titles to Microsoft Xbox Live customers. The operation of an electronic storefront requires several groups within Warner Brothers to coordinate their activities with the Xbox team. The outbound side of the distribution chain included publishing "Avails" (titles available for sale) and tracking order fulfillment the inbound side included placing orders. Other functions such as reports spanned both sides of the distribution chain. The original system required manual intervention and supervision, particularly at boundaries between organizations. An example of the need for manual processing would be verifying that the correct version of an asset (which can vary depending on subtitles or content) was delivered. In the new system Warner Brothers created a new EIDR ID for each content variant, and these were used for all subsequent processing stages. This eliminated ambiguity and facilitated the automation of the inbound, outbound stages. Another advantage was the ability to create reports on the fly.
        • Swisscom EPG integration: Swisscom operates a Pay TV service in Switzerland. In 2014 it completed the rollout of an Electronic Programming Guide (EPG) for its customers based on EIDR. [14] This is an end-to-end system where EIDR IDs are used to represent the assets displayed in the EPG. A key element of the system was that EIDR IDs were also used in the guide metadata supplied to Swisscom by media-press.tv. This included setting up a system for assigning EIDR IDs to assets that were not already in the registry. A key advantage of using EIDR is not having to translate between different identifier systems.

        EIDR is administered by the non-profit EIDR Association, which was founded in October 2010 by MovieLabs, CableLabs, Comcast and Rovi. Membership has grown steadily since then: as of late-2014 it has 79 members divided between the Industry Promoters and Industry Contributor levels. The fastest growing category is non-US companies, which now accounts for about 20% of membership. The EIDR Association operates two EIDR registries: Production and Sandbox. The former is the official site, and the latter is reserved for test and development. Both systems are available publicly online, but the contents of the sandbox are not guaranteed to be correct, complete, or even to refer to assets that exist. Only members of the EIDR association may modify the registry.

        Registration Edit

        Registration of new assets can be done individually or in bulk (up to 100,000 assets at a time). In either case, the workflow comprises a combination of automated (to perform well-defined but tedious tasks) and manual (where human judgment is called for) processes. It is also iterative, as the initial matching process may identify a variety of gaps and errors that need to be dealt with.

        Registering new assets is a complex process that requires some preparation, particularly in the case of bulk submission. The automated processes will check syntax, make sure that the basic metadata is supplied, and that any dependencies (e.g. series records created before constituent episodes) are honored. Manual steps include making sure the correct Parties are associated with the asset. One of the most important steps is ensuring that a new asset does not already exist in the registry: this is covered in the next section.

        In order to register a new asset a user must be associated with a party that has been granted the "Registrant" role by the EIDR operator. A registrant may be a principal agent, such as a studio or an encoding house, but it may also be a Party doing bulk registration of back-catalogue items, or a Party acting on behalf of someone else. It is also a requirement that a registrant be an EIDR member. In general, content ownership, metadata authority, and registration capability are separate and unrelated concepts.

        Deduplication Edit

        This refers to flagging assets being submitted to the registry as falling into one of the following three categories:

        • Candidate asset is unique (with respect to existing registry assets).
        • Candidate asset is a duplicate of an existing record.
        • Candidate asset has a high probability of being a duplicate.

        This assessment is based on applying a (large) set of rules to the candidate asset, which results a numerical score. Bucketing occurs as the result of comparing the score to two thresholds:

        • Low Threshold: any asset with a score below this value is deemed not to be a duplicate. This is the only case when a proposed record addition or modification will succeed.
        • High Threshold: any asset with a score above this value is deemed to (almost certainly) be a duplicate. The proposed record addition/modification will not proceed, and an error status will be returned. Registrants will generally use the pre-existing ID for the item they tried to register, and can add missing information and Alternate IDs to the existing record.

        Assets falling between the low and high threshold are deemed to have a high possibility of being a duplicate: the proposed record addition/modification will not proceed until manually reviewed by EIDR operations staff.

        The components of the EIDR system are shown below.

        The principal functional blocks are as follows:

        • Core Registry: This module is a customization and configuration of the CNRI Digital Object Repository. It performs various functions including registration, generation of unique identifiers, indexing, object storage management, and access control.
        • Repository: This stores and provides access to registered objects for EIDR, these objects are collections of metadata, not the media assets themselves. The metadata includes standard object information, relationships, and access control settings.
        • REST API: A REST interface that provides access to the full set of non-administrative registry features. Services can make individual or batched calls, which can be dispatched synchronously or asynchronously. A general query syntax enables the retrieval (and in some cases modification) of registry records satisfying a set of criteria specified by the caller.
          • EIDR SDK: this is provided to developers to facilitate the creation of third party applications (usually in support of a B2B or intramural workflow). It comprises a Java SDK, a .NET SDK, and sample programs built upon the two SDKs. Using the SDK is recommended over direct calls to the REST API.
          • Command Line Tools: these are simple Java and .NET applications, built on the SDK, each of which provides a single function, such as resolve, query, match, and register.
          • Web UI: a Web-based user interface primarily for search, lookup, and browsing the object hierarchy. It also supports simple registrations.

          Relation to DOI and Handle System Edit

          An EIDR ID is a specialized example of a Digital Object Identifier (DOI), which in turn is built on top of the Handle System developed by the Corporation for National Research Initiatives (CNRI). The EIDR-specific aspects of the lower layers are described in more detail below.

          Digital Object Identifier (EIDR Aspects) Edit

          A Digital Object Identifier, standardized as ISO 26324, [15] seeks to uniquely identify a wide range of digital artifacts including books, recordings, research data, and other digital content. The goal is not just for the IDs to be unique, but persistent and immutable. As opposed to URLs, DOI identifiers stay the same even if the objects move to another location, or become owned by another organization. Here are some of the characteristics of DOI:

          • The International DOI Foundation (IDF) enforces previously agreed rules on the constituent Registration Agencies (e.g. EIDR) to ensure continuity. In particular, if an RA ceases operation, the names it hosts will be taken over by another RA.
          • The IDF defines rules to which all DOI names must adhere (what kinds of object may be named by a specific RA)
          • The DOI system provides a data model, based on a data dictionary, to enable a structured means of expressing metadata (and inter-object relationships).
          • The DOI system has its own highly redundant and distributed set of handle and proxy servers.
          • All DOI prefixes are of the form "10.NNNN" where 10 is a directory indicator and "NNNN" is a registrant code in the range 1-65535 (e.g. EIDR content records use is 10.5240)

          The DOI data model provides the means to associate metadata with each object, as well as policies governing its use. In the words of the DOI Handbook, metadata may include "names, identifiers, descriptions, types, classifications, locations, times, measurements, relationships and any other kind of information related to [an object]." Metadata flows between the following entities:

          • Resource Provider: usually the owner of media asset, which is responsible for inputting metadata to the system.
          • Registration Agency: the entities that serves as the repository of the assets (and associated metadata). As noted DOI supports a federation of independent RA's, each responsible for a set of assets. EIDR is one such RA. Others include CrossRef for scholarly articles, DataCite for research data, and OPOCE for official publications of the European Union.
          • Service User: the entities making queries to RA's retrieve metadata associated with assets. The DOI resolution framework is responsible for dispatching a query to the appropriate RA (the Service User doesn't need to know this).

          To foster interoperability between RAs, DOI has the concept of a metadata Kernel. This is a core set of metadata that all objects stored within the DOI framework should have. The full set may be found in the DOI handbook. Interoperability is a large topic extending beyond the scope of EIDR, but the following subset is particularly relevant to EIDR assets:

          • referent: an object maintained in the DOI system.
          • referentName: the name of the referent (e.g. the title of a movie)
          • primaryReferentType: For EIDR, this includes creation (e.g. entertainment assets) and party (e.g. the creator thereof).
          • structuralType: these are mutually exclusive categories that identify the form of an asset. Two particularly relevant to EIDR assets are an abstraction (an object such as a movie that may exist in multiple forms) and performance (a specific instance of an object such as Director's Cut).
          • principalAgent: for creations, the entity principally responsible for its existence.
          • registrationAuthorityCode: denotes the agency that issued the DOI. This would be the EIDR RA for EIDR assets.

          EIDR metadata is available in standard DOI kernel metadata format as well as EIDR-specific formats. The DOI for the DOI metadata schema is doi:10.1000/276 .

          Handle System (EIDR Aspects) Edit

          DOI is in turn implemented on top of the Handle System, a distributed, highly scalable, name resolution service. A handle is defined as:

          <Handle> ::= <Handle Naming Authority> "/" <Handle Local Name>

          The Naming Authority is globally unique and defines both an administrative space and the syntax of the Handle Local Name. For EIDR in the definition above, the "10.5240" is the EIDR Naming Authority, and is responsible for resolving the suffix (including that it conforms to the expected syntax for an EIDR asset). The range of allowable Naming Authorities is more general than is employed by DOI (or EIDR).

          The distributed nature of the Handle System allows each local namespace to be hosted on multiple geographically distributed service sites. This is a federated model where each local name space has complete control over the placement and operation of its service sites. Furthermore, each service site may contain multiple resolution servers: requests directed to a particular service site will be dispatched evenly across its constituent servers.

          The data model of the Handle System is simple but flexible. An arbitrary number of values may be associated with each handle. Over time, these values may be created, modified, and destroyed. Each such datum has the following attributes:

          • index: an unsigned integer that identifies a data value from the others that may exist for this handle.
          • type: a UTF-8 string identifying the type. The type system is extensible and common types are maintained as handles in the "0.TYPE" naming authority. There are no restrictions on the creation of new types, although using resolvable handles as type names is recommended best practice. Common types include URL for a single of indirection, "10320/loc" for a set of context-based resolution alternatives, and various administrative types for Handle System management, all of which are based on handle resolution.
          • Les données: the value itself, represented as a sequence of octets which are interpreted in the context of the associated type
          • permission: access rights to this particular value. Note that different data values of a handle may have different permissions
          • TTL: an integer that specifies how long a value may be cached
          • timestamp: an integer (expressed as milliseconds from the Unix epoch) that records the last time the value was updated
          • reference: a list of references to other handle values. These are usually used to add credentials (e.g. a digital signature).

          Accessing the Handle System is done via a wire protocol defined in RFC 3652 EIDR applications don't have to be concerned with this because of the layering of protocols.


          If you are using the Google Drive application on your PC you can copy and paste the folder in the Google Drive directory, and this would copy it. I do not believe it is possible to do this from the web application.

          Have written an App Script just to address this problem. You can copy any folder contents as well as the structure in it. Script will help eliminate the need of Google Drive desktop app. By adding triggers you can even automate the process.

          • this also adds suffix _copy to all subfolders
          • The folder_you_want_copied_copy is in the highest parent hierarchy of your Google Drive, so if you copied a subfolder of your drive, it will bubble up to the highest level when copied

          If you are in the Google Drive web interface.

          Create a new folder and name it what you want.

          Go into the Pre-existing folder, select all the files, right click and hit copy.

          Select all the copies, right click and hit move to. Select the New Folder.

          Note that this method will not work if the folder you wish to copy has subfolders.

          Very late answer for the OP, and I think not even possible at the time of asking, but this is what I do today :

          1. Select the folder I want to duplicate.
          2. Secondary click on it, and then choose "Download" from the pop-up menu
          3. Have my browser save the zipped archive to a temporary directory
          4. Extract the folder from the archive, and give it a new name
          5. Back in Drive click the big blue New button, and select "Folder upload" from the drop down menu.
          6. Back in my computer grab the newly named folder and drag it back into Drive.
          7. Flush the toilet

          Note : This is a solution when you have a lot of little files and sub-folders that together make for a smallish compressed file. It's usefulness decreases as the total compressed file size increases.

          I prefer to abstain from allowing third parties access to my Drive unless I have to so, like Lucky 711, I wrote my own script. I leave it here for future Google results adventurers. It will copy the folder and all its contents. For my use case, I wrote it to handle files with multiple parents by just adding the copied folder as a new parent. If you don't want that, drop the "Count the parents that aren't this parent" part.

          For reference, if you want to create new copies of files with multiple parents rather than just adding the new folder as another parent, the shorter code would look like this:

          You can use the "Copy Folder" add-on for Google Spreadsheets:

          1. create a Google Spreadsheet
          2. click on Add-ons > Get add-ons and add the 'Copy Folder' add-on`
          3. select the folder you want to copy
          4. done

          Or, this chrome web store Google App Script can be used to achieve this result. This one does not require the creation of a Google Spreadsheet.

          I use multiple machines and don't want to put the drive app on all of them so I have written the below script to copy on the site. It’s ugly and basic but it works. It only copies a folder and its files, not sub folders. I am sure there is room for improvement, so feel free to take this and improve it, but I hope it’s at least helpful from the start.

          Per a comment below, this is a Google Apps Script. The way to use it is to open the Google scripting app, then copy and past all of the code into a blank script. After that click the publish option on the Menu, then select deploy as web app. You can then click the Latest code link or copy and paste the URL into your browser. Then, you will find a box where you can type the folder that you want to copy, and the copy button. That should create a copy of the folder you have named, and a copy of all of the files within.

          Note: it will not copy sub-folders, just the files.

          To duplicate a folder drag & drop it on another folder holding CTRL button.