如果我有两个具有两个不同属性但具有相同名称的类:
[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规范与具有相同命名属性的不同类具有相同的情况。
答案 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会根据当前上下文选择域和本地限制。