Как определить свойство с одинаковым именем для двух разных типов в ROWLEX?

StackOverflow https://stackoverflow.com/questions/1243410

Вопрос

Если у меня есть два класса с двумя разными свойствами, но с одинаковым именем:

[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; }
}

и попробуйте сериализовать их в RDF и проверить их с помощью http://www.w3.org/RDF/Validator/ услуга.Все в порядке, и они правы.Но после того, как я попытаюсь сгенерировать файлы OWL из этих классов с помощью инструмента OntologyExtractor.exe, я получаю следующее сообщение:«Извлечение онтологии не удалось. http://test.org/1.0#title назначается более чем одному типу. «Это странное сообщение, так как высшие классы правильны, и есть некоторые спецификации RDF, которые имеют одинаковую ситуацию с различными классами, которые имеют одинаковые названные свойства.

Это было полезно?

Решение

Я ожидаю, что это ошибка в ROWLEX.Ваш случай верен, но я предполагаю, что не готовился к нему, когда писал OntologyExtractor.Я постараюсь выпустить исправление как можно скорее.

РЕДАКТИРОВАТЬ:Выпущен ROWLEX2.1, его можно скачать с http://rowlex.nc3a.nato.int.Версия 2.1 (среди прочих) теперь поддерживает функциональность общих свойств.Точный код в вопросе все равно приведет к той же ошибке!Чтобы преодолеть это, вам следует изменить оформление вашего кода следующим образом:

[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; } 
} 

Используя OntologyExtractor.exe, этот код создаст свойство OWL с анонимным классом домена, который является ОБЪЕДИНЕНИЕМ типов Type1 и Type2.
Хотя это технически совершенно правильное решение, установка доменов на свойствах ограничивает их возможное повторное использование в будущем.В качестве решения вы можете заменить домен свойства локальными ограничениями.Вы можете добиться этого следующим образом:

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

Если вы оставите UseLocalRestrictionInsteadOfDomain не установленным, ROWLEX выбирает между доменным и локальным ограничением в соответствии с текущим контекстом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top