现在这篇文章是记录我重新修改本体后,再次构建本体,遇到了问题以及好的一些小tips记录。
持续更新中………………
1.中英文创建本体(4.13)
为了使得本体模型更加通用灵活,采用中英文构建本体模型,而且更加清晰,不限制使用人员的英文水平哈哈哈。
(1)首先在创建类、对象属性、数值属性时候,先选择一种命名方式,定义好一个类。
(2)选中类/对象属性/数值属性,在Annotations处,点击添加。
(3)选择rdfs:lable,输入中文名称,例如“壳类零件”,并且在Language Tag处写上zh,选择Chinese,如下图1-1所示,点击确定。同时重复该步骤,输入英文名称“ShellPart”,输入en语言,选择English,如下图1-2所示,点击确定。
图1-1中文设置
图1-2 英文设置
注:大家可以会有疑问,最开始创建的时候不是已经命名了一次了吗?为什么这里还需要中英文都定义呢?这是因为最开始我们创建类输入的名称只是为了创建出IRI,但是并不是其标签。
(4)同样的,为了增强可读性,你还可以在这里增加comment,也就是一个注释,为了更加清楚。
(5)这个时候,我们可以发现Class hierarchy这里的名称变化了。如果我们最开始创建的是英文的IRI名称,但是我们创建好Lable后,他就会显示为中文。这是因为在Protege里面的语言设置中,其优先顺序是中文、然后才是英文。如果想要显示英文,那就将英文的顺序调整到前面即可。具体设置为点击File—Preferences—Render—Configure—Set Language,将en调整到zh前面就行,如下图1-3所示,这样就会优先显示英文了。即想要显示谁,就设置谁优先。谁优先Anotation这里就会先显示谁,如下图1-4所示(我的是英文)。
图1-3 优先级设置
图1-4 优先级设置
2.创建对象属性约束(4.14)
当你设置完成对象属性后,其Domains和Ranges通常是父类之间,子类之间会自动集成该关系。但是子类又有一定的限制,例如酒由工厂制作,即Domains 为酒,Ranges 为 工厂,对象属性为被制作。但是酒下面又有很多子类,例如白酒、红酒等,工厂也有很多例如A类工厂、B类工厂,但是存在一些限制,例如白酒只能由A类工厂制作,所以就需要添加对象属性约束,使得所有 白酒 的 被制作 属性指向的个体都必须是 A类工厂。这就需要我们创建Restricted preperty,在里面选择约束的对象属性、约束类型、以及约束值域(填充)。
选择好要设置的Domains的子类,然后再点击SubClassof,点击右上角的 +
添加一个子类约束,选择里面的obejct restriction creator。
如下图案例所示,特征具有加工计划,孔只有孔加工计划,故需要设置 Hole hasFeatureMachiningPlan only HoleFeatureMachiningPlan。如下图所示:
图1-5 约束设置
3.Pellet推理数值属性类型错误(4.15)
构建完成本体后,包括类、对象属性、数值属性以及部分实例后,想用一下推理查看是否本体存在语义不一致的问题,检查一下。结果发现使用Pellet推理机推理后,实例部分的数值属性里面出现了错误的推理,即对原有的实例数值属性,重新推理出来,但是数据类型变化了。
即 你设置了Tool1 :minAchievableFeatureSize 30 ,在protege里面是默认是decimal的,但是pellet估计是有点问题,他理解的是int,所以就会有冲突,就会再次推理出一次Tool1 :minAchievableFeatureSize "30"^^xsd:int .,但是实际上我们设置的没问题,size的值类型的确需要是decimal,只不过这里刚好是整数而已。
为了避免这种情况发生,我们就需要多设置个小数点,即如果出现decimal类型的值是整数的,例如30^^xsd:decimal,我们就需要改成30.0^^xsd:decimal.
我这样更改后就不会出现推理重复以及类型错误了。
Pellet 和 Protege 在数值类型处理上的一个“微妙的不一致”问题。
图1-6 修改方式
我这样改的原因是因为我的确没有在protege里面发现我定义错误的问题,以及SWRL里面定义错误的问题,因此只能是推理机的问题了,而且用hemit就不会出现刚刚我说的问题。所以我才这样解决的,如果你也出现了,建议按一下顺序来调整:
(1)检查本体中出现这个数值属性的地方是否有定义冲突,即数值属性那边定义的和实例处引用定义的数值类型不一样;
(2)检查是否在SWRL规则里面引用更改了这个数值类型;
(3)如果都没有则按上面的解决吧,加个小数点吧!
4.定义类和基本类(6.16)
创建第二个本体的时候,遇见了一些问题,发现对象属性是顶层与顶层之间的,例如软件具有操作,但是软件的子类具有不同的操作子类,因此就需要对类进行限制,也就是2中提到的对象属性的约束。在这过程中,发现了可以去定义类,即告诉本体满足什么条件的就是这个类。
例如具有A参数B参数(类)的操作就是型腔铣操作,这样可以根据定义去实现推理,想必这就是DL逻辑给出的推理,不仅仅用SWRL能推理,通过本体自身的定义也会实现推理。
定义类是需要设置 EquivalentTo
的,设置完成后类名前面的图标就会多三道横线。
这种“定义类”会被推理器动态分类,不再只是静态归在某个上层类下面。
但是不是所有的类都需要进行定义,例如“软件名称”并不是靠逻辑属性来推理归类的,他就是个标签,而操作根据选择的参数不同操作也不同,所以可以进行一个定义用来自动归类。
且定义的时候如下所示:
图1-7 类定义方式
这个就表示具有这些参数的二轴加工才是2D等距操作。
图1-8 定义类显示图标