Como definir uma propriedade com o mesmo nome em dois tipos diferentes em ROWLEX?
-
12-09-2019 - |
Pergunta
Se eu tiver essas duas classes que têm duas propriedades diferentes mas com o mesmo 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 tentar serializar-los a RDF e validá-los com http://www.w3.org / RDF / Validador / serviço. Tudo está bem e eles estão corretos. Mas depois que eu tentar gerar arquivos OWL dessas classes com ferramenta OntologyExtractor.exe eu recebo essa mensagem: "Extração Ontologia falhou. http://test.org/1.0#title é atribuído a mais de um tipo." Esta é a mensagem mais estranho que as classes mais altas estão corretas e há algumas especificações RDF que tem mesma situação com diferentes classes que têm mesmas propriedades nomeadas.
Solução
Espero que é um erro no ROWLEX. Seu caso é válida, mas presumo que não se preparar para ela quando eu escrevi OntologyExtractor. Vou tentar liberar uma correção o mais rápido possível.
Editar : ROWLEX2.1 é liberado, você pode baixá-lo http: / /rowlex.nc3a.nato.int . Versão 2.1 (entre outros) agora suporta a funcionalidade de propriedade compartilhada. O código são em questão ainda resultaria o mesmo erro! Para superar isso, você deve alterar a decoração de seu código da seguinte forma:
[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; }
}
Usando o OntologyExtractor.exe, este código irá resultar uma propriedade OWL de com uma classe de domínio anônima que é a união de Type1 e Type2.
Embora isso seja tecnicamente solução perfeitamente correto, domínios de configuração nas propriedades limitar a sua possível reutilização futuro. Como solução, você pode querer substituir o domínio da propriedade com restrições locais. Você pode conseguir isso da seguinte forma:
[RdfSerializable]
public class Type2
{
[RdfProperty(true, Name = "title",
DomainAsType = new Type[]{typeof(Type1), typeof(Type2)},
UseLocalRestrictionInsteadOfDomain = true)]
public string Title { get; set; }
}
Se você deixar UseLocalRestrictionInsteadOfDomain não definido, ROWLEX escolhe entre domínio e restrição de local de acordo com o contexto atual.