如何在ROWLEX中的两个不同类型上定义具有相同名称的属性?

时间:2009-08-07 07:23:09

标签: c# .net properties rdf rowlex

如果我有两个具有两个不同属性但具有相同名称的类:

[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/服务对其进行验证。一切都很好,他们是正确的。 但是在我尝试使用OntologyExtractor.exe工具从这些类生成OWL文件后,我收到了以下消息: “本体提取失败。http://test.org/1.0#title被分配给多个类型。” 这是一个奇怪的消息,因为上层类是正确的,并且有一些RDF规范与具有相同命名属性的不同类具有相同的情况。

1 个答案:

答案 0 :(得分:1)

我希望它是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的UNION。 虽然这在技术上是完全正确的解决方案,但在属性上设置域限制了它们未来可能的重用作为解决方案,您可能希望使用本地限制替换属性域。您可以按如下方式实现:

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

如果不设置UseLocalRestrictionInsteadOfDomain,ROWLEX会根据当前上下文选择域和本地限制。