模糊本体框架






4.92/5 (12投票s)
将模糊 OWL 本体建模与 .NET 集成
引言
该库有助于将模糊本体与用 .NET 编写的面向对象编程 (OOP) 类集成。这是一种混合集成,即一些 OWL 概念可以直接映射到 OOP 类,但大多数 OWL 概念仅从 OOP 实例属性派生,没有直接映射到 .NET 类。因此,OOP 实例-OWL 概念的映射可以随着时间的推移动态演变。目前的实现支持 FuzzyOWL2 本体 [2] 以及 FuzzyDL 推理机,以推断 OOP 实例与特定 OWL 概念的隶属关系。但是,它可以很容易地修改以支持任何模糊本体表示法以及任何模糊推理机。
背景
使用本体建模捕获知识
以结构化和机器可解释的方式捕获和存储知识的一种方法是使用本体工程。本体是特定领域社区知识概念化的具体形式。本体包括术语词汇表及其含义的规范。从明确声明的事实中,推理机制可以引出额外的隐性知识。这种机制是通过本体推理机实现的。
Web 本体语言 (OWL)
过去,已经设计了许多基于 HTML、XML 和框架的知识表示语言。OWL 2 是当今最流行的本体创作语言之一。它最初仅用于发布网页的语义内容,即构建语义网。但最终,它吸引了强烈的学术和商业兴趣。OWL 得到了万维网联盟 (W3C) 的认可。有许多支持 OWL 的本体编辑器可用,例如斯坦福大学开发的开源基于 Java 的 Protégé,以及各种推理机,如 FaCT++、HermiT 或 Pellet。OWL 2 的形式语义基于描述逻辑 (DL),它是 SROIQ(D) 类型的一阶逻辑的子集。OWL 提供了三种变体(子语言),按表达能力的递增顺序排列为 OWL Lite、OWL DL 和 OWL Full。
图 1 – OWL 2 的结构 [10]
图 1 揭示了 OWL 语法和语义层之间的边界。值得注意的是,存在各种具体的语法,可用于序列化和交换 OWL 本体。在本文的其余部分,我们将重点关注主要的语法 RDF/XML。RDF(资源描述框架)是一种概念建模方法,旨在以主谓宾表达式的形式构建关于资源的语句集合。资源由统一资源标识符 (URI) 标识。基于 RDF/XML 的本体建立在 RDF 和 RDF Schema (RDFS) 之上,RDFS 是一种基于 RDF 的词汇表,旨在结构化资源。结果是,该集合实际上描述了一个有向的、带标签的多重图。
OWL-OOP 集成
如表 1 所示,对本体和对象建模的比较揭示了一些相似之处。实际上,将本体与主流面向对象编程语言(OOPL),如 C# 或 Java,的集成是很自然的想法。
OWL 本体元素 |
C# OOP 元素 |
概念(TBox 层面) |
类 |
个体(ABox 层面) |
实例 |
对象属性(角色、槽)... 两个 OWL 个体之间的关系 |
成员(即字段或属性)类型为 object[] |
数据属性(数据槽),...个体和字面量之间的关系。 |
成员(即字段或属性)类型为 boolean[], int[], double[], string[]... |
数据类型(字面量) |
数据类型 boolean, int, double, string, ... |
表 1 – OWL 本体与 C# OOP 建模元素之间的类比
然而,也存在一些差异,例如
- 与所有主流 OOPL 不同,大多数知识表示系统允许类层次结构中的多重继承。同样,一个个体可以属于本体中的多个类,而在 OOPL 中则有严格的对象一致性。
- 本体只捕获静态状态,无法定义任何状态转换。因此,OOP 元素 方法 在本体世界中没有等价物。
- 与本体属性中宽松的类型一致性不同,OOPL 是类型安全的,
- 与 OOPL 不同,本体建模基于开放世界假设。
- 本体的属性特征,如可逆性、自反性、传递性等,OOPL 本身不处理,尽管可以在属性定义中模拟。
OOP 建模有两种类型。i) *直接(传统)模型*分别使用类和实例来表示现实世界的概念和个体。ii) *间接模型*将概念和个体都保存在实例中,而 OOP 类则表示现实世界的元类 [6]。与这些模型类似,我们可以讨论直接或间接的本体-OOP 集成,这取决于本体概念是映射到 OOP 类还是 OOP 实例 [4]。
- 直接本体-OOP集成 - 本体概念链接到 OOP 类,而本体个体对应于 OOP 实例。直接集成会自动编译一个强类型的特定领域类模型,因此便于后续的软件开发。然而,在处理本体中的多重继承以及 OOP 中的类型安全方面存在困难。此外,如果本体发生改变,OOP 模型也必须重新编译。在 OWL 中的本体与 .NET 中的对象结构之间进行直接集成的工具包示例有 Rowlex 和 Zhi#。
- 间接本体-OOP集成 – 毕竟,所有具有对本体进行读/写访问的低级 API 都可以被视为间接集成。在这里,OWL 概念仅由运行时对象表示。示例有 .NET 平台上的 SemWeb 或 Java 上的 OWL API。
- 混合本体-OOP集成是前两种方法的结合。一些基本的 OWL 概念由一个 OOP 类表示,而其他不太重要的概念仅由一个 OOP 对象表示。这种映射可以通过 C# 接口、C# 特性或 Java 注解来实现。基于 Java 的混合集成示例是 Moop [4]。
本体建模中的模糊逻辑
传统的本体语言不适合处理知识中的不精确性或模糊性。因此,用于语义网的描述逻辑已经通过各种方法得到了增强,以处理概率和可能性不确定性以及模糊性。
关于模糊性,最流行的是 *fuzzy SHOIN(D)*,它是 *SHOIN(D)* 的模糊泛化。这种方法允许具体域(数据类型)由模糊集表示。此外,它还引入了模糊修饰符、模糊公理、模糊 *RBoxes*、模糊 *TBoxes* 和模糊 *ABoxes*。关于其应用,*fuzzy SHOIN(D)* 最初是为文档管理系统中的基于逻辑的信息检索而提出的 [5]。
除了对理论框架的研究,还实现了一些模糊 DL 推理机,例如 fuzzyDL [8] 和 DeLorean (DEscription LOgic REasoner with vAgueNess)[3]。前者将查询表示为线性优化问题,后者则假设一个真值的有限链,从模糊源计算出一个大致等价的非模糊表示。
事实上,*SHOIN(D)* 等价于 OWL DL,因此 *fuzzy SHOIN(D)* 适合作为将模糊性引入 OWL 的形式化背景。有许多将模糊信息编码到 OWL 中的提议,例如使用 OWL 扩展、将模糊 DL 转换为经典 DL,以及最后但同样重要的是使用 OWL2 注解。
注解是 OWL 的标准部分。OWL DL 允许对类、属性、个体和本体头进行注解 [10]。在一种名为 *FuzzyOWL2* 的方法中,OWL 注解包含带有模糊相关信息的 XML 片段 [2]。我在这个项目中选择使用这种方法,因为它有很好的文档记录,并且只需要一个标准的 OWL 编辑器。也可以使用标准的推理机,前提是信息的模糊部分将被丢弃。目前,流行的 Protégé 本体编辑器有一个可用的模糊逻辑插件。
FuzzyOWL2 允许编码 i) 线性及三角模糊修饰符,ii) 左肩、右肩、三角及梯形模糊数据类型 iii) 模糊概念 iv) 模糊角色 v) 模糊公理。
为了我们项目的目的,表达以下两种模糊公理非常重要:
- 概念包含是 一种形式为 C ? D > a 的 TBox 类型的语句。 例如,一个语句声明 Cm ? Cc > 0.8,表示 inf x??I{Cm(x) ? Cc} > 0.8,其中 Cm 是一个代表经理的概念,Cc 代表教练,?I 是一个解释域,声明每个经理至少是 0.8 程度的教练。
- 实例-概念隶属是一个 ABox 类型的语句,形式为 C(a) > a,其中 C 表示一个模糊概念,a 是一个个体,而 a 是一个隶属度。C(a) 告诉我们个体 a 在多大程度上可以被看作是模糊概念 C 的一个元素。如果 Cc 代表教练的概念,那么员工 a 属于这个概念的程度至少为a,取值于区间 [0, 1] 内。
架构
图 2 – FuzzyOntologyFramework 及其周围的信息系统和链接组件
整体架构如图 2 所示。*FuzzyOntologyFramework* (FOF) 旨在被一个用 .NET 编写的信息系统使用。基本上,它从业务层获取一个 .NET 实例集合,并将它们作为个体存储在指定的 OWL 本体中。基于这些实例的成员值和指定的本体,推理机可以随后将这些个体(即实例)分配给一个或多个 OWL 概念。概念隶属关系会返回给业务层,业务层可以根据需要使用这些信息。这通常会用于决策过程。
事实上,并非所有实例都存储在本体中。一些实例(如代表国家的实例)可以存储在本体中,而另一些实例(如代表员工的实例)则只存储在 FOF 的内部结构中。原因是,数千个个体可能会妨碍对 XML 文件的操作。
为什么选择混合式 OWL-OOP 集成?嗯,我们假设:
- 一些 OWL 概念将 1:1 直接映射到特定的 .NET 类。这通过简单的声明来完成。例如,我们可以指定一个 .NET 对象属于 OWL 概念 *Employee*,当且仅当其 *Class.FullName = "AdventureWorks.Employee"*。
- 在其他情况下,关系可能更加微妙。可能会有多个 .NET 类映射到单个 OWL 概念,反之亦然。为了揭示这种关系,我们可以调用 *:OntologyIntegrator.FindIndividal(object ind).Concept* 来获取指定个体的 OWL 概念的模糊集合,或者类似地调用 *:OntologyIntegrator.Concepts(x).Members* 来获取指定概念的个体模糊集合。
链接组件
- 模糊框架 [7] 是一个 .NET 组件,用于处理模糊逻辑集和关系 [11]。它重载了 .NET 运算符,因此可以直接在 .NET 中轻松构建和评估模糊逻辑表达式。
- SemWeb 是一个低级 API,方便从 .NET 访问 RDF/XML OWL 本体。[9]。
- Fuzzy DL Reasoner是一个基于 Java 的推理机,允许处理模糊信息 [8]。在使用 OWL 本体之前,它需要启动一个 *FuzzyOwl2.jar* 转换器,将 OWL 文件转换为 FuzzyDL 本地定义语言。
- Gurobi 是一个专注于 MILP、MIQP、LP 和 QP 的数学规划库。它在 Fuzzy DL 推理机中用于 MILP 计算。该库可在 www.gurobi.com 获取,并可以获得免费试用版或学术许可证。
- Protégé 是一个开源的 OWL 本体编辑器和一个知识获取系统。可在 http://protege.stanford.edu/download/download.html 免费下载。
- FuzzyOWL 插件通过注解的方式,方便将模糊性编码到标准 OWL 本体中。可在 http://gaia.isti.cnr.it/~straccia/software/FuzzyOWL/FuzzyOWL2.1.1.zip 下载。
FOF 中的基本类和方法
图 3 – FOF 中重要类的 UML 图。模糊关系以蓝色显示。
OntologyIntegrator 是该库中的主类。它提供以下方法
方法 |
描述 |
public OntologyIntegrator()
|
初始化 OntologyIntegrator 的新实例。接下来的步骤是设置配置(如果未在 *App.config* 文件中指定),并调用 *UpdateIndividuals* 和 *UpdateOntology* 方法。 |
void UpdateIndividuals ( IEnumerable<object> individuals)
|
遍历集合,将所有对象注册为 OWL 个体,并将它们存储在 *Individuals* 属性中。个体是否会真正写入本体 RDF/XML 文件,还是仅为推理而存储在内存中,这取决于该个体类的定义。请参阅 [Individual(StoreInOntology=true/false)] 特性。除了初始调用外,每当个体的属性发生变化时,都应更新个体。这可以通过封装在特定对象中的事件来完成。 |
void UpdateOntology()
|
该方法应在代码开始时,创建 *:OntologyIntegrator* 之后调用。此外,每当源本体文件被外部世界修改时(例如,在本体编辑器中重新定义),也应调用此方法。该方法执行以下操作
|
public static readonly IDiscreteDimension CONCEPTS |
概念的域(维度) |
public static readonly IDiscreteDimension INDIVIDUALS |
个体的域(维度) |
public Concept[] Concepts |
在 RDF/XML 本体文件中找到的概念。 |
public Individual[] Individuals |
先前由 *UpdateIndividuals* 方法注册的个体。 |
public event EventHandler <UpdateOntologyProgress ChangedEventArgs> UpdateOntologyProgressChanged | 由于推理非常耗时,该事件在 *UpdateOntology* 方法内每次取得进展时触发,以便在进度条中报告。 |
表 2 - *:OntologyIntegrator* 方法
类 *Concept* 表示一个 OWL 概念。它提供以下模糊集
- 其后代概念的模糊集
- 其祖先概念的模糊集
- 其成员个体的模糊集
同样,类 *Individual* 提供了该个体所属概念的模糊集。
类 *IndividualClass* 返回 .NET 对象的 .NET 类型。此信息用于提供 .NET 类和 OWL 概念之间的直接映射。此外,.NET 类型指定了除 *Type.FullName* 之外,还有哪些其他属性和字段将用于推理。
与本体相关的特性
.NET 对象如果要被视为 OWL 个体,通常有许多字段和特性。然而,只有其中一些适合用于本体推理。这是我们引入一系列 .NET 特性的主要原因。它们用在个体的 .NET 类定义中。
特性名称 |
用法 |
描述 |
IndividualAttribute (StoreInOntology : Boolean) |
类 |
指定此类的实例将被视为本体个体。如果在类定义中省略,相应类的实例将被 *UpdateIndividuals* 方法忽略。 StoreInOntology - 如果为 true,个体将直接存储在源本体文件(通常是 RDF/XML 格式的 *.owl* 文件)中。如果为 false,个体的定义将在查询推理机时临时准备。将个体条目存储在 OWL 文件中,有助于在研究本体以及在本体编辑器中进行推理时理清思路。然而,将大量个体集合编码为 XML 会消耗时间和资源。因此,仅建议对较小的集合(如国家)使用此方法。 |
IndividualActiveAttribute |
字段、属性 |
此特性可以指定一个布尔类型的字段或属性,用于表示对象的状态。例如,属性 *Employee.Active*。如果发送到 *UpdateIndividuals* 方法的对象其 *Employee.Active* = *false*,则该对象将从个体集合中移除。 |
IndividualPropertyAttribute |
字段、属性 |
指定该成员将被导出到本体中进行推理。此类成员的可能类型有:*string、string[]、int、int[]、double、double[]、object*(也由 *UpdateIndividuals* 方法注册)、*object[]*、一维 *FuzzyRelation*。 |
表 3 – 用于指定 OOP-OWL 映射的特性
配置设置
有两种方式可以定义配置设置。第一种是通过 *App.Config* 文件,第二种是通过 *:OntologyIntegrator* 对象的属性。它们应该在对 *:OntologyIntegrator* 进行任何进一步操作之前指定。
属性 |
描述 |
默认值 |
bool BackupOntologyWhenModified
|
在将个体填充到 RDF/XML 本体文件的情况下,它指定源本体文件每次更改时是否应进行归档。 |
false |
string PathToOntology
|
本体文件的完整路径。例如 “C:\OntologyStore\Employees.owl”。 |
需要明确指定 |
string IndividualsUriBase
|
指定 *UpdateIndividuals* 方法生成的个体将使用哪个 IRI。 |
http://{机器名}/individuals.owl |
bool IgnoreStringAttributes
|
一些推理机在支持字符串值方面存在问题。如果为 *true*,则字符串类型的特性将不会在本体中被考虑。这也适用于 *isClass* 属性。 |
false |
string BackupFolder |
定义一个备份文件夹以归档旧版本的本体。 |
PathToOntology
|
string TemporaryFolder
|
指定一个临时文件夹,用于在与推理机通信时存储文本文件。 |
PathToOntology
|
表 4 – 配置设置
使用代码
必备组件
下载并安装以下应用程序
- Microsoft .NET Framework 4,来自 http://msdn.microsoft.com/en-us/netframework/aa569263。
- MS SQL 2005 Express Edition 或更高版本,来自 http://www.microsoft.com/sqlserver/en/us/editions/express.aspx。
- AdventureWorks 示例数据库,来自 [1]。
- Gurobi 优化工具,来自 http://www.gurobi.com/html/freetrial.html。
安装与配置
将 *FuzzyQueryWithOntology.zip* 和 *FuzzyQueryWithoutOntology.zip* 文件的内容解压到两个独立的文件夹中。
· 在两个项目的 *.exe.config 文件中,设置到 MS SQL 的连接字符串,数据库为 *AdventureWorks*。
· 此外,在 *.exe.config *FuzzyQueryWithOntology* 项目的文件中,进行如下设置:
- 备份文件夹的路径,
- 临时文件夹的路径,
- *salesPersons.owl* 文件的路径。该文件位于解压后的项目文件夹中。路径示例为 *"D:\Temp\FuzzyQueryWithOntology\salesperson.owl"*。
现在您可以通过执行项目文件夹中的 *.exe* 文件来学习以下两章。这些项目比较了在评估销售人员时,使用本体和不使用本体的方法。
示例项目“无本体的模糊查询”
在这个项目中,我们使用 *AdventureWorks* 示例数据库来寻找有能力且成本低的销售人员。 我们想使用模糊逻辑,因为像“有能力”或“成本低”这样的术语相当模糊。相关表的数据库图表如图 4所示。表 *Employee* 和 *SalesPerson* 之间存在 1:[0-1] 的关系,这意味着每个员工都可能是一个销售人员,拥有其销售额、销售配额、奖金或佣金。
图 4 – 示例项目中使用的数据库表
为了支持模糊集,我们使用 *FuzzyFramework* *[7]*。为了完成我们的任务,我们定义了术语 *highSales* 和 *lowCommission* 分别由左侧或右侧模糊数表示:
FuzzySet highSales = new LeftLinearSet(sales, "High Sales", 1000000, 2000000);
FuzzySet lowCommission = new RightLinearSet(commission, "Low Commission", 0.01m, 0.02m);
我们使用 Microsoft Entity Framework 作为 E-R 映射器,将数据库记录填充到 .NET 对象类 *SalesPerson* 中。到目前为止,这是一个普通的信息系统。但一旦我们想评估员工的能力或成本,就必须引入以下硬编码的属性
代码块应设置为“Formatted”样式,如下所示:
public double CheapSalesPerson
{
get
{
return lowCommission.IsMember(this.CommissionPct);
}
}
public double CapableSalesPerson
{
get
{
return highSales.IsMember(this.SalesLastYear);
}
}
public Nullable<double> CapableAndCheapSalesPerson
{
get
{
return Math.Min(this.CheapSalesPerson, this.CapableSalesPerson);
}
}
之后,生成带有 *CapableAndCheapSalesPerson* 列的以下表格就非常容易了
图 6 – 示例项目 *FuzzyQueryWithoutOntology* 的输出
然而,每当我们想引入新的搜索时,不修改代码是不可能的。为了克服这个问题,信息系统通常提供类似 SQL 的查询功能。用户可以命名一个自定义搜索,将其存储在数据库中,并在需要时调用。但最终,用户会得到大量目的和意义不明确的自定义搜索。
示例项目“带本体的模糊查询”
上一个项目中描述的解决方案是可行的,但我们希望有一种更灵活的方式来定义什么是低佣金或高销售额,以及这些属性如何相互作用。这正是通过模糊本体可以实现的。
使用带有 FuzzyOWL 插件的 Protégé 本体编辑器,我们首先定义了模糊语言术语 *lowCommision* 和 *highSales*。
图 7 - 在 Protégé 中定义模糊集 *lowCommission*
接下来,我们定义了谁是 *CheapSalesPerson*、*CapapableSalesPerson*,以及最终的 *CapableAndCheapSalesPerson*。
图 8 – OWL 本体中的概念层次结构
图 9 – 在 Protégé 中对 CapableAndCheapSalesPerson 的描述。
到目前为止,这是本体的定义。在我们信息系统这边,我们用 *IndividualAttribute(StoreInOntology=false)* 修饰了 .NET 类 *SalesPerson*,并用 *IndividualProperty* 修饰了对推理很重要的属性。
[Individual(StoreInOntology=false)]
public class SalesPerson
{
…
[IndividualProperty]
public double SalesLastYear
{
get { … }
}
[IndividualProperty]
public double CommissionPct
{
get { … }
}
}
最后一步只需调用 *UpdateIndividuals* 和 *UpdateOntology* 方法。之后,每个个体都有其 *Concepts* 集合;其中包含特定对象在多大程度上属于 *Employee、SalesPerson、CapableSalesPerson* 等概念的信息。
图 10 – FuzzyQueryWithOntology 项目的输出
结论与未来工作
我们已经证明,通过 OOP 与本体的集成,可以很容易地利用本体建模来定义模糊知识结构,而无需修改 .NET 代码。这些结构随后可以在代码中用于推断个体对某个概念的隶属度。例如,在为了做出决策而对个体进行排名时,这是非常可取的。
与基于 Java 的 FuzzyDL 推理机的集成相当缓慢。因此,示例项目异步执行推理,并显示总体进度。这种具体实现仅足以用于演示目的。然而,这个概念相当灵活,允许轻松扩展以支持其他模糊推理机,如 DeLorean。
资源
- SQL Server 示例数据库。见 *CodePlex 开源项目社区*。微软,2012年。可访问:http://msftdbprodsamples.codeprolex.com/
- BOBILLO F., STRACCIA U. Fuzzy Ontology Representation using OWL 2. 载于 *International Journal of Approximate Reasoning*, 第 52 卷, 第 7 期, 第 1073-1094 页, 2011 年 10 月。ISSN:0888-613X. 可访问: http://gaia.isti.cnr.it/~straccia/software/FuzzyOWL/IJAR11.pdf
- BOBILLO, F. *DeLorean*。萨拉戈萨大学,西班牙,2012 年。可访问:http://webdiis.unizar.es/~fbobillo/delorean
- FRENZEL, C. Mooop – *A Generic Integration of Object-Oriented and Ontological Models*. 奥格斯堡,德国,2010年。可访问:http://opus.bibliothek.uni-augsburg.de/volltexte/2011/1695/pdf/TR_2010_14.pdf
- LUKASIEWICZ, T., STRACCIA, U. Managing uncertainty and vagueness in description logics for the semantic web, 载于 *Journal of Web Semantics*. 第 6 卷第 4 期, 第 291–308 页, 2008 年, 291–308. ISSN: 1570-8268
- PULESTON, C., PARSIA, B., CONNINGHAM, J., RECTOR, A. Integrating Object-Oriented and Ontological Representations: A Case Study in Java and OWL. 载于 *The Semantic Web - ISWC 2008*, 第 140-153 页, Springer, 德国, 2008 年。可访问: http://owl.cs.manchester.ac.uk/papers/ppcr08_oo%2Bo_iswc.pdf
- SLAVÍCEK V. Fuzzy Framework. 载于 *CodeProject*, 2011 年 1 月。可访问:Fuzzy-Framework.aspx
- STRACIA, U. *The fuzzy DL System*. ISTI-CNR, 意大利。2012年。可访问: http://gaia.isti.cnr.it/~straccia/software/fuzzyDL/fuzzyDL.html
- TAUBERER, J. *SemWeb.NET: Semantic Web/RDF Library for C#/.NET*. 2010 年。可访问:http://razor.occams.info/code/semweb/
- W3C OWL 工作组。*OWL 2 Web 本体语言:文档概述*。W3C,2009 年。可访问:http://www.w3.org/2009/pdf/REC-owl2-overview-20091027.pdf
- ZADEH, L. A. Fuzzy Sets. 载于 *Information and Control*, 第 8 卷, 第 3 期, 第 338-353 页, 1965 年。ISSN 0019-9958。