У меня есть заданная онтология, о которой я люблю рассуждать. Я использую ROWLEX API для .NET.
Как я могу найти все owlSubClasses класса?
У меня есть заданная онтология, о которой я люблю рассуждать. Я использую ROWLEX API для .NET.
Как я могу найти все owlSubClasses класса?
ROWLEX не рассуждает. В нем реализована некоторая функциональность ризонера — это очень нужно для генерации классов C# — но его API не предназначен для этого. Впрочем, надежда все же есть, просто не самое элегантное решение.
Я предполагаю, что у вас есть онтология, и вы создали классы .NET из нее с помощью OwlGrinder.exe. Поэтому по умолчанию у вас есть два связанных класса .NET, сгенерированных для каждого соответствующего класса OWL в онтологии: один легкий класс и один полный класс. Мы собираемся использовать только легкие классы. Мы просто перебираем ВСЕ классы .NET и отфильтровываем, являются ли они подклассами. Вот и все.
string baseClassUri = "http://myontology/2012/10#mybaseclass";
Assembly asm = GetMyAssemblyGeneratedByOwlGrinder();
Type[] subClasses = (from type in asm.GetTypes()
where type.IsSubclassOf(typeof(NC3A.SI.Rowlex.OwlThing))
// selecting subclasses only
let attributes = type.GetCustomAttributes(typeof(NC3A.SI.Rowlex.SubClassOfAttribute), false)
from attr in attributes
let subClassAttr = attr as NC3A.SI.Rowlex.SubClassOfAttribute
where subClassAttr.TypeUri == baseClassUri
// selecting light classes only
let lightAttributes = type.GetCustomAttributes(typeof(NC3A.SI.Rowlex.LightVersionAttribute), false)
from lightAttr in lightAttributes
let lightAttr_ = lightAttr as NC3A.SI.Rowlex.LightVersionAttribute
where lightAttr_.LightVersion == true
select type).ToArray();
Код не пробовал, может глючит. Но идею показывает. К каждому сгенерированному классу добавлено множество атрибутов. К ним относятся их базовые классы в SubClassOfAttribute и являются ли они облегченными классами или полными классами, использующими LightVersionAttribute. Вы можете отфильтровать интересующие вас классы на основе этих атрибутов.