我有一个给定的本体论,我喜欢在其上推理。我使用ROWLEX API for .NET。
如何查找类的所有owlSubClasses?
答案 0 :(得分:0)
ROWLEX不是推理者。它具有一些推理器的功能 - 它对于C#类生成是非常必要的 - 但它的API不是为此而设计的。然而,仍然有希望,只是不是最优雅的解决方案。
我假设您有一个本体,并且您使用OwlGrinder.exe从中生成了.NET类。因此,默认情况下,为本体中的每个相应OWL类生成两个关联的.NET类:一个轻类和一个完整类。我们只会使用灯光类。我们只是遍历所有.NET类并过滤掉if是否为子类。就是这样。
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的轻类还是完整类。您可以根据这些属性过滤掉您感兴趣的类。