Как определить свойство с одинаковым именем для двух разных типов в ROWLEX? - PullRequest
1 голос
/ 07 августа 2009

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

[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, которые имеют одинаковую ситуацию с различными классами, имеющими одинаковые именованные свойства.

1 Ответ

1 голос
/ 07 августа 2009

Я ожидаю, что это ошибка в 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 с классом анонимного домена, который является СОЮЗОМ Типа 1 и Типа 2.
Хотя это технически совершенно правильное решение, установка доменов в свойствах ограничивает их возможное повторное использование в будущем. В качестве решения вы можете заменить домен свойства локальными ограничениями. Вы можете достичь этого следующим образом:

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

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

...