Как определить свойство с одинаковым именем для двух разных типов в ROWLEX?
-
12-09-2019 - |
Вопрос
Если у меня есть два класса с двумя разными свойствами, но с одинаковым именем:
[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 выбирает между доменным и локальным ограничением в соответствии с текущим контекстом.