Come definire una proprietà con lo stesso nome su due tipi diversi in ROWLEX?
-
12-09-2019 - |
Domanda
Se ho queste due classi che hanno due proprietà diverse, ma con lo stesso nome:
[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; }
}
e cercare di loro serializzare per RDF e validare con http://www.w3.org / RDF / Validator / servizio . Tutto va bene e sono corrette. Ma dopo cerco di generare file OWL da quelle classi con lo strumento OntologyExtractor.exe ottengo quel messaggio: "Estrazione Ontologia fallito. http://test.org/1.0#title viene assegnato a più di un genere." Questo è strano messaggio, come le classi superiori sono corretti e ci sono alcune specifiche RDF che ha stessa situazione con diverse classi che hanno stesse proprietà denominate.
Soluzione
mi aspetto che è un bug in ROWLEX. Il tuo caso è uno valido, ma suppongo non mi preparo per questo quando ho scritto OntologyExtractor. Cercherò di rilasciare un fix al più presto possibile.
Modifica : ROWLEX2.1 viene rilasciato, è possibile scaricarlo da http: / /rowlex.nc3a.nato.int. Versione 2.1 (tra gli altri) ora supporta la funzionalità di proprietà condivisa. Il codice esatto nella questione sarebbe ancora causare lo stesso errore! Per ovviare a questo, si dovrebbe modificare la decorazione del vostro codice come segue:
[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; }
}
Uso della OntologyExtractor.exe, questo codice si tradurrà una proprietà OWL di dominio con una classe anonima che è l'unione di Type1 e Type2.
Anche se questo è tecnicamente perfetta soluzione corretta, impostando i domini sulle proprietà limitare la loro eventuale riutilizzo futuro. Come soluzione, si potrebbe desiderare di sostituire il dominio di proprietà con restrizioni locali. È possibile raggiungere questo obiettivo nel seguente modo:
[RdfSerializable]
public class Type2
{
[RdfProperty(true, Name = "title",
DomainAsType = new Type[]{typeof(Type1), typeof(Type2)},
UseLocalRestrictionInsteadOfDomain = true)]
public string Title { get; set; }
}
In caso di lasciare UseLocalRestrictionInsteadOfDomain non impostato, ROWLEX sceglie tra il dominio e la restrizione locale secondo il contesto attuale.