2009-08-07 18 views
1

Si j'ai ces deux classes qui ont deux propriétés différentes mais avec le même nom:Comment définir une propriété avec le même nom sur deux types différents dans ROWLEX?

[RdfSerializable] 
public class Type1 
{ 
    [RdfProperty(true), Name = "title"] 
    public string Title { get; set; } 
} 

[RdfSerializable] 
public class Type2 
{ 
    [RdfProperty(true), Name = "title"] 
    public string Title { get; set; } 
} 

et tentent de les sérialiser à RDF et les valider avec le service http://www.w3.org/RDF/Validator/. Tout est OK et ils sont corrects. Mais après avoir essayé de générer des fichiers OWL à partir de ces classes avec l'outil OntologyExtractor.exe, j'obtiens le message suivant: "Échec de l'extraction de l'ontologie. http://test.org/1.0#title est affecté à plusieurs types." C'est un message étrange car les classes supérieures sont correctes et il y a des spécifications RDF qui ont la même situation avec différentes classes qui ont les mêmes propriétés nommées.

Répondre

1

Je suppose que c'est un bug dans ROWLEX. Votre cas est valide, mais je suppose que je ne me suis pas préparé quand j'ai écrit OntologyExtractor. Je vais essayer de libérer une solution dès que possible.

EDIT: ROWLEX2.1 est libéré, vous pouvez le télécharger à partir de http://rowlex.nc3a.nato.int. La version 2.1 (entre autres) supporte maintenant la fonctionnalité de propriété partagée. Le code exact dans la question résulterait toujours la même erreur! Pour remédier à cela, vous devez modifier la décoration de votre code comme suit:

[RdfSerializable] 
public class Type1 
{ 
    [RdfProperty(true, Name = "title", ExcludeFromOntology=true)] 
    public string Title { get; set; } 
} 

[RdfSerializable] 
public class Type2 
{ 
    [RdfProperty(true, Name = "title", 
       DomainAsType = new Type[]{typeof(Type1), typeof(Type2)})] 
    public string Title { get; set; } 
} 

Utilisation du OntologyExtractor.exe, ce code entraînera une propriété OWL de avec une classe de domaine anonyme qui est l'Union des Type1 et Type2.
Bien que cette solution soit techniquement parfaitement correcte, la définition de domaines sur des propriétés limite leur éventuelle réutilisation. En tant que solution, vous pouvez remplacer le domaine de propriété par des restrictions locales. Vous pouvez y parvenir comme suit:

[RdfSerializable] 
public class Type2 
{ 
    [RdfProperty(true, Name = "title", 
       DomainAsType = new Type[]{typeof(Type1), typeof(Type2)}, 
       UseLocalRestrictionInsteadOfDomain = true)] 
    public string Title { get; set; } 
} 

Si vous quittez UseLocalRestrictionInsteadOfDomain pas définie, ROWLEX choisit entre le domaine et la restriction locale en fonction du contexte actuel.

+0

Parfait! Merci! Je vais le valider après ça. –