没有合适的资源?快使用搜索试试~ 我知道了~
软件X 12(2020)100571原始软件出版物OWL2Go:为OWL本体自动生成Go数据模型,集成了序列化和非序列化功能Stefan Dählinga, Lukas Razikb,Antonello Montiaa复杂电力系统自动化研究所,位于亚琛工业大学的E.ON能源研究中心,Mathieustr. 10,52074 Aachen,Germanyb能源与气候研究所,能源系统工程研究中心,德国,52425,于利希ar t i cl e i nf o文章历史记录:收到2020年2020年7月10日收到修订版2020年7月10日接受关键词:本体OWL关于SAREFa b st ra ctWeb本体语言(OWL)是一种描述特定领域中术语及其关系的形式化语言。它支持以机器可读格式在异构应用程序和设备之间进行然而,在软件开发中,数据模型的使用是常见的。为了方便使用OWL编码的本体也在软件开发中,我们提出了OWL2Go。OWL 2Go是一个代码生成器,它解析OWL本体,并生成一个Go包,实现一个符合本体的数据模型,以及一个用于在Go数据模型和Turtle或JSON-LD文档之间转换的序列化器和我们演示了生成过程和使用所产生的Go包与智能家电参考(SAREF)本体。©2020作者(S)。由爱思唯尔公司出版这是CC BY许可下的开放获取文章(http://creativecommons.org/licenses/by/4.0/)中找到。代码元数据当前代码版本v1.1.0用于此代码版本的代码/存储库的永久链接https://github.com/ElsevierSoftwareX/SOFTX_2020_76Code Ocean compute capsuleApache许可证,版本2.0或MIT许可证使用git的代码版本控制系统使用的软件代码语言、工具和服务编译要求,操作环境依赖导入模块github.com/piprate/json-gold v0.3.0如果可用,链接到开发人员文档/手册https://git.rwth-aachen.de/acs/public/ontology/owl/owl2go问题支持电子邮件SDaehling@eonerc.rwth-aachen.de1. 动机和意义语义互操作对于分布式和异构应用的集成是非常重要的。本体使域、域中包含的对象及其关系的形式化描述成为可能。Web本体语言(OWL)是用于表达本体的最重要的语言[1,2]。本体的一个新兴应用领域是物联网(IoT)[3,4]。OWL基于资源描述框架(RDF)和RDF模式(RDFS)。RDF可用于以三元组的形式描述资源关系,三元组由主语、谓语和*通讯作者。电子邮件地址:sdaehling@eonerc.rwth-aachen.de(美国)Dähling)。https://doi.org/10.1016/j.softx.2020.100571object [5].资源由其唯一的国际资源标识符(IRI)标识。为了给RDF表达的知识提供进一步的结构,它由RDFS补充[5,6]。RDFS增加了类的概念OWL建立在RDFS的基础上,并增加了限制的概念[5]。限制可用于向类添加属性,限制可分配给该属性的值。在软件开发中,数据模型用于描述软件旨在解决的问题及其域。数据模型通常特定于特定的实现,并取决于所选择的编程语言或数据存储机制(数据库)。虽然OWL的许多建模特性也存在于面向对象的编程语言中,例如。例如,在一个实施例中,继承,由于特定编程语言的设计特点,有些构造不能直接映射,例如。例如,在一个实施例中,2352-7110/©2020作者。 由Elsevier B.V.出版。这是一篇开放获取的文章,使用CC BY许可证(http://creativecommons.org/licenses/by/4.0/)。可在ScienceDirect上获得目录列表SoftwareX期刊主页:www.elsevier.com/locate/softx2S. 代灵湖Razik和A.Monti/SoftwareX 12(2020)100571静态类型或缺乏对多重继承的支持[7]。为了实现同一领域内应用之间的互操作性和数据交换,必须克服两个挑战:一个给定的OWL本体和一个数据模型之间的映射是必要的。必须启用将包含个人的文档实例化为由映射定义的数据结构的实例。此外,还需要将一组实例序列化为文档在文献中已经提出了将OWL映射到编程语言的不同解决方案,通常用于基于类的编程语言,如JAVA [3,8广泛的概述和分类可以在[11]中找到。作者将OWL映射到面向对象编程语言的方法分为三类。应用这种分类,OWL 2Go属于第二类活动-静态映射。这类软件在编译之前将本体转换为代码语句随后,可以通过应用程序编程接口(API)访问和操作数据这一类别中的其他概念例如[3,9,10]。这些工具根据OWL本体中的类定义生成代理类。代理类提供了一个API来操作底层的RDF三元组或图结构。在[3]的情况下,其他第三方工具被重用。虽然这种方法最小化了要生成的代码,但它为代理类和基础三元组存储之间的交互引入了一个OWL2Go消除了这种额外的工作。在[8]中,给出了从OWL到JAVA的映射基于OWL本体,JAVA类和接口的代码是自动生成的.与前面分析的工具相比,不需要底层图或三元组存储。在OWL2Go中,数据也直接存储在生成的数据模型中。然而,OWL2Go的目标是Go编程语言。Go是一种现代的开源编程语言。它特别针对系统级和网络的高性能应用程序。这就是为什么它被广泛用于云计算和物联网领域。Go语言与其他面向对象编程语言的一个主要区别是Go语言没有类和继承模型[12]。OWL2Go提供了一种模仿类行为的方法,以实现从基于类的OWL到Go的映射。Go在Web应用程序领域的重要性以及将OWL类映射到Go的可能性,如本文所述,促使其作为目标编程语言使用。更详细地介绍Go语言及其相关性,以及它对基于本体的应用程序的适用性,将在2.1节中讨论。序列化和重复化使数据能够以标准化格式交换。因此,即使每个应用程序的特定数据模型不同,应用程序也可以相互交互并共享知识之前介绍的实现以不同的方式解决了这一挑战。在[8]中,根本没有讨论相应的特征在[3]中,实现依赖于第三方工具,这些工具实现了RDF三元组存储,并提供了序列化和非序列化。在OWL2Go中,这个功能直接由生成的Go包支持。因此,不需要第三方工具,这减少了依赖性,从而简化了生成的包的使用。关于前面提到的挑战,我们的贡献是:一种从基于类的OWL到非基于类的Go的映射方法,以及自动生成一个Go包,实现符合OWL本体的数据模型实现Turtle(ttl)/ JSON-LD文档格式的序列化/反序列化因此,OWL2Go是一个简化并进一步增加软件开发中本体的使用的工具OWL2Go使软件开发人员和研究人员能够促进本体的使用。为了做到这一点,它们不必与OWL的描述逻辑交互,即,三人组相反,他们使用的结构和方法,即,由OWL2Go生成的API因此,开发基于本体的应用程序的障碍大大减少。这被认为是开发基于本体的应用程序的重要技术要求[13]。促使OWL2Go开发的一个特定用例是智能家电引用(SAREF)本体[14,15],它在OWL中形式化SAREF旨在允许家庭区域中的异构IoT设备之间的互操作性欧洲电信标准协会(ETSI)已经发布了SAREF和进一步的扩展作为技术规范[16尽管SAREF具有新颖性,但在文献[4,20,21]中已经可以找到它的一些应用虽然本文中介绍的方法适用于任何OWL本体(受第2.4节中描述的限制),但我们使用SAREF本体解释和演示我们的概念。2. 软件描述2.1. go编程语言Go(不要与Go混淆用于知识表示任务的多范式语言[22])是特别为联网服务器开发的编译语言[12,23],因此也适用于IoT和云计算。语法类似于C,但它提供了许多其他语言的功能,例如,对并发或自动内存管理的本地支持在云计算领域,流行的工具如Kuber-netes [24]和Docker [25]都是用Go开发的。随着云计算和物联网成为本体应用的新兴领域,Go作为该领域流行的编程语言的相关性是显而易见的。将OWL映射到Go的主要挑战是Go中缺少类和继承,这是OWL和大多数其他面向对象编程语言的关键特性。Go语言提供了结构体来定义自定义类型。通过嵌入结构可以实现与基于类的继承一个结构体嵌入另一个结构体时,会自动继承嵌入结构体定义的字段。作为一个正交概念,Go语言提供了接口。接口由一组方法声明组成。每个隐式实现这些方法的结构(或本机类型)也实现接口。接口可以用来实现与其他编程语言(例如C++)中的多态性类似的行为。接口也可以嵌入.嵌入另一个接口的接口声明了嵌入接口的方法。基于类的OWL到Go语言的映射是本文的主要内容。下面我们将介绍如何使用Go结构、接口和嵌入的概念来实现OWL定义的类和继承。2.2. 软件构架图 1显示了给定OWL本体的代码生成过程的一般工作流程。在第一步中,必须提取OWL类本体编码·····S. 代灵湖Razik和A.Monti/SoftwareX 12(2020)1005713图1.一、 OWL2Go代码生成的工作流程。表1将OWL结构映射到Go。猫头鹰构建体类OWL公理(owl:,rdf(s):)Go构造A类接口A;structsA实现A接口A的子类B扩展接口BB和C的交叉点A接口延伸接口B和CB和C接口的延伸 接口AoneOf枚举:创建类和个体对B类财产的(AallValuesFrom C,DsomeValuesFromhasValue x基数C、D:允许的类型E:=C、DF:= C的常见类型,D A={... .B()[]ESetB([]E)错误AddB(. . . E)误差DelB(. . . (E)}sA ={. . .bmap[string]F}域B将属性A添加到B类,作为限制物业A范围B将B添加到允许的属性类型B的逆添加函数调用AddB()和DelB(),AddA()和DelA()函数,反之亦然对称性add函数调用AddA()和DelA()AddA()和DelA()函数独立类型创建模型本体进口获取导入的本体并执行OWL2Go为它在TTL中被用作该步骤的输入。随后,这些类和属性必须映射到Go。最后一步是根据之前执行的映射生成Go包的代码。生成的包的最终架构和应用程序工作流程可以在图中看到。二、在本节我们将描述单个应用程序部分,而第2.3节解释功能。第2.4节说明了我们在OWL的表现力方面的方法的局限性。用OWL表示的本体指定了三种对象:类、属性和个体。描述类和属性的本体T-box on- tology描述了用于描述域的术语OWL2Go将T-box本体定义的类和属性映射到Go数据模型中。个体是A-box本体的一部分。A-box on- tologies描述实例或个人及其关系。它们通常使用由T-box本体引入的概念。OWL2Go生成的Go包可以用来创建Go数据模型的实例。序列化将这些实例中的一个实例转换为ttl或JSON-LD产生与原始T-box本体兼容的A-box本体。不同OWL结构的映射总结在表1中。下文将更详细地介绍一些重要的结构。OWL的一个重要方面是现有本体的重用。OWL本体可以导入其他本体,并建立在它们的类和属性之上。这是由OWL2Go支持的对于每个本体,特定的前缀用于类和属性的命名。以SAREF本体为例,演示了映射和代码生成过程。OWL2Go自动为SAREF和导入的时间本体生成代码[26]。生成的Go包以开放的形式提供源头12.2.1. 本体模型为了描述一组对象以及它们之间的关系,首先需要引入Model数据类型Model类型的定义见清单1。它为每个定义的类保存如果一个对象的类型是派生类,则该对象可以存储在多个映射中。例如 , 类 型 为 SarefAppliance 的 对 象 将 是存 储在mSarefAppliance, mSarefFunctionRelated和mSaref设备。 此外,所有对象都存储在mThing中。 为Model数据类型定义了每个类的New函数。此函数创建类的新实例并添加此实例到对应于类和所有父类的映射(参见第2.2.4节)。此外,搜索特定对象和删除它们的功能是为Model类型实现的。本体论通常是指那些有用的标准个体能够给本体的用户。为了使用这些个体自动填充模型,Model类型提供了在导入本体的情况下,检索其ttl文档,还对导入的本体执行生成过程1https://git.rwth-aachen.de/acs/public/ontology/owl/saref。4S. 代灵湖Razik和A.Monti/SoftwareX 12(2020)100571方法Individuals来创建它们(清单1第9行)。1 typeModelstruct{2mTingmap[string]Ting3456(七)mSarefDevicemap[string]SarefDevicemSarefFunctionRelatedmap[string]SarefFunctionRelatedmSarefAppliancemp[string]SarefAppliance...89func( mod*Model)CreateIndividuals(){10mod。 新SarefTask(“https://w3id.org/saref#Washing“)十一...12}清单1:模型数据类型。所有类的基类都是Thing类,它是用下一节中描述的概念生成的。它被实现为一个接口,被每个生成的类嵌入。Thing类允许执行常见的函数,例如。例如,在一个实施例中,在所有对象上,无论其具体类型如何,都可以进行序列化和序列化。2.2.2. 类为了模拟Go语言中的继承,每个OWL类都被表示为一个Go接口和一个实现该接口的Go结构体这种组合现在被称为Go类。该接口声明用于操作类属性的方法。每个类都继承自Thing类。Go类的接口必须扩展它的父类的所有接口,即。例如,它必须声明相同的方法。这是通过嵌入父类的接口来实现的这样,Go类的实例I.例如,它的结构体可以用作父类的实例。清单2中提供了一个使用Go接口和结构进行继承的示例。类saref :FunctionRelated是saref:Device 的子类。saref :Device没有SAREF指定的父类,因此继承自Thing类。所有类都表示为一个接口(清单2第1、5行,11)。每个接口都嵌入其父类的接口(清单2的第6、12行)。清单2还显示了saref:FunctionRelated类的结构(清单2行15)。这个结构实现了相应接口声明的所有方法,从而自动实现了父类的接口(清单2第16-19行 作为一结果表明,*sSarefFunctionRelated可以被用作SarefFunctionRelated、SarefDevice和Thing。一个特殊情况是将类定义为个体的枚举(owl:oneOf)。在这种情况下,类的代码将按照前面所述的方式生成此外,枚举的个体是在第2.2.1节中解释的Cumulative Individuals方法中创建的。2.2.3. 性能Go类的结构体包含一个字段,用于OWL类的每个属性。类包含通过限制或属性的owl:domain公理分配给它的属性。类的接口声明方法来管理这些属性。对于基数为1的属性,仅声明Get和Set函数。对于具有更大的基数Add和Delete函数被声明为ad-bandwidth。对于基数大 于 1 的 owl : ObjectProperty , 所 属 结 构 中 的 字 段 类 型 为map[string]PropertyType 。映射中的键是存储对象的IRI。Owl:DatatypeProperty具有文字类型。这些类型被映射到基本的Go类型,如string或int。如果多重性大于使用这些类型的一个切片1 TypeThinginterface{2TingMethod()(3)45 泰培 SarefDeviceinterface{6田庆7SarefDevice Method()8IsSarefDevice()(9)1011泰培 SarefFunctionRelatedinterface{12SarefDevice13IsSarefFuntionRelated()14}15泰培sSarefFunctionRelatedstruct{/*FunctionRelatedpries*/}16 func(res*sSarefFunctionRelated)是SarefFunctionRelated(){/*.. .*/}17 func(res*sSarefFunctionRelated)IsSarefDevice(){/*... */ }18 func(res*sSarefFunctionRelated)SarefDeviceMethod(){/*...*/ }19 func(res*sSarefFunctionRelated)ThingMethod(){/*... */ }清单2:使用Go接口和结构的继承。1 泰培 SarefDeviceinterface{2SarefHasTypiclConsumption()[]SarefPropery3SetSarefHasTypicalConsum([]SarefProperty)误差4AddSarefHasTy piclConsumption(. .(Property)误差5DelSarefHasTy piclConsumpt ion(. .(Property)六......(七)89 泰培 sSarefDevicestruct{10SarefHasTypicalConsumptionmap[string]SarefPropery十一...12}1314 func(res*sSarefDevice)SarefHasTypicalConsumption()(out[]SarefProperty){15out=make([]SarefPropery,len(ress.SarefHasTypicalConsumption))16index:=017fori:=rangeress. 在一个简单的例子中,18outt[index]=res。SarefHasTypicalConsumption[i]19index++20}21返回22}2324 func(res*sSarefDevice)SetSarefHasTypicalConsumption(in[]SarefProperty)(errrror){25res。sarefHasTypicalConsumption=make( map[string[SarefProperty)26err=res。 AddSarefHasTypiclConsumption(in. )27返回28}2930 func(res*sSarefDevice)AddSarefHasTypicalConsumption(in. . SarefProperty)(errrror){31fori:=rangein{32ifv,ok:=in[i]. (SarefEnergy);ok{33res。SarefHasTy piclConsumpt ion[v. IRI()]= v34继续35}elseifv,ok:=in[i]. (SarefPower);ok{36res。SarefHasTy piclConsumpt ion[v. IRI()]= v37继续38}40[EnergyPower]“)41}42返回43}44S. 代灵湖Razik和A.Monti/SoftwareX 12(2020)100571545 func(res*sSarefDevice)DelSarefHasTypicalConsumption(in. . SarefProperty){46fori:=rangein{47delete(res.)如果HasTypicalConsumption,]中。IRI())48}49返回50}清单3:摘自Device类OWL属性可以有多种类型。然而,在大多数编程语言中,一个变量只能有一个特定的类型。此外,在OWL中,属性的类型可以与父类中相同属性的类型。为了解决这些问题,每个属性在映射过程中被分配了三种类型:基本类型,公共类型和(可能是多个)允许的类型。清单3提供了一个使用saref的示例saref:Device类的HasTypicalConsumption属性SAREF本体的相应摘录可以在清单4.1 saref:Devicerdf:typeowl:Clas;2 rdfs:subClassOf[rdf:typeowl:Restric t i ct ion;3第三,关于Pro perysaref:具有类型Consumption;4owl:所有ValuesFrom[rdf:类型owl:Clas;5owl:unionOf(saref:Energysaref:Power)]6]中。78 saref:Propertyrdf:typeowl:Clas.910 saref:Energyrdf:typeowl:Clas;11rdfs:subClassOfsaref:Property.1213 saref:Powerdf:ty peowl:Clas;14rdfs:subClassOfsaref:Property.清单4:Device类和hasTypicalConsumption属性的SAREF摘录。允许的类型是在限制中或OWL属性的owl:range语句中指定的所有类型对于示例属性,允许的类型是saref:Energy和saref:Power(清单4第5行)。公共类型是所有允许类型的公共父类saref:Energy和saref:Power的公共父类是saref:Property(清单4第11、14行)。它在相关结构中用于定义属性字段(清单3第10行)。类属性的基类型父类中的属性由于saref:Device类没有父类,因此示例中的基类型也是saref:Property。所有用于属性操作的接口函数(清单3第2家长班级。SarefProperty是Go类的接口,对应于saref:Property。SarefEnergy和SarefPower是它们的Go类的接口。由于这两个类都继承自saref:Property,因此它们的接口嵌入了SarefProperty。As sarefHasTypicalConsumption是的类 型SarefProperty也可以插入从SarefProperty继承的其他类型但是,在Add-函数中,类型断言用于确保仅允许为该属性存储类型(清单3第34和37行)。如果使用了错误的类型,则返回错误2.2.4. 个人OWL个体是类的实例。为了创造-ate实例每个Go类都有一个 New 函 数 ,IRI 并 创 建 该 类 的 新 对 象 。 清 单 5 显 示 了NewSarefDevice方法。它是为*Model数据类型定义的它确保不存在具有相同IRI的其他资源(清单5第2行),并创建一个新的*sSarefDevice(清单5第6行)。这个对象被添加到SarefDevice类及其所有父类(在本例中只有Thing)的*Model变量的映射中(清单5第7-8行)。最后,创建所有属性映射(清单5第91 func( mod*Model)NewSarefDevice(iristring)(retSarefDevice,errrrorr){2Ifmod. publicintfindDuplicate(i){3err=errorrs.新(“Resourcealredyxists“)4返回(五)6res:=sSarefDevice{iri:iri}7mod。 mSarefDevice[ress. IRI()]=res8mod。 mThing[res. IRI()]=res9res。sarefHasTypicalConsumption=make( map[string[Property)10//. . (makeallpropertymaps)11ret = res12返回13}清单5:Device的新方法。2.3. 软件功能生成的包的主要功能是提供一个本体兼容的数据模型和序列化,以及应用程序之间的互操作数据交换的规范化。两个过程的图形描述如图所示。 二、对于认证过程,包含个人描述的ttl或JSON-LD编码A盒本体是输入,并被解析为图结构。在这个图中,搜索关键字rdf:type的边。如果对应于边的三元组的对象是1,在由T-box本体定义的类中,三元组表示个体的创建所有可以找到的个体都在模型中创建,并填充文档中指定的属性对于序列化过程,执行的步骤相反。首先,为每个个体创建一个图形节点为此,使用了包含所有Thing的模型 一个名为rdf:type的边被添加到这些节点。对象是个体的类型此外 , 还 创 建 了 一 个 名 为 rdf : type 和 对 象 owl :NamedIndividual的边在此之后,每个属性的一个边缘,将ual添加到图表中。最后,从结果图中创建ttl / JSON-LD文档。2.4. OWL2Go的限制OWL 2Go针对OWL-DL本体。OWL-DL是OWL-Lite的扩展,并添加了更多的结构,例如,枚举类或属性值。OWL-DL的另一个扩展是OWL-Full,它允许类也可以是个体或属性。不同OWL口味的详细描述可以在[27]中找到。声 明 相 等 、 不 相 等 或 唯 一 性 的 公 理 ( equivalent- Class 、equivalentProperty 、 sameAs 、 differentFrom 、 AllDifferent 、disjointWith)不被OWL 2Go处理。这样做的原因是,这种等价语句不能直接在面向对象语言中处理,因为不同的类或结构在设计上是不相交的[11]。 因此,这不是OWL2Go的特定限制,而是OWL和面向对象编程语言之间的等价性限制。然而,在本体中使用这样的公理如果应用于OWL2Go不会导致错误。相反,这些公理被简单地忽略了6S. 代灵湖Razik和A.Monti/SoftwareX 12(2020)100571图二、 使用生成的Go包进行序列化和重复化。关于OWL2Go例如,如果两个类通过一个owl:equivalent公理相关,那么两个类都将被独立地翻译为Go语言。所提出的映射的另一个限制是开放世界假设的解释,这通常与OWL本体相关联。开放世界假设认为,假设不能建立在缺乏知识的基础上。这与编程语言中的数据建模不同。如果一个实体(实例)在数据模型中不存在,则假定它一般不存在关于OWL2Go,在属性缺少猫头鹰的情况下,这一点很重要:范围公理。虽然这符合开放世界的假设,但它不是与Go语言的映射是一个特定类型的事实相一致,这是财产所必需的。在这种情况下,OWL2Go将使用Thing类作为此属性的类型。因此,可以将由本体定义的任何类的实例分配给该属性。另一个开放世界假设不能直接映射到Go的情况是缺少owl:domain公理,一种财产。OWL2Go只会将相应的属性添加到通过限制与该属性相关的类中。如果没有类包含关于此属性的限制,则该属性将被OWL2Go忽略,因为它不能链接到任何已定义的类。由于给定的限制,生成的Go模型和用于生成的OWL本体通常在语义上不等价。OWL本体可以比其对应的Go数据模型更具表达力。然而,Go数据模型与本体并不矛盾。因此,与OWL本体相比,它代表了一个可表示知识的子集。还应注意,上述限制可能不与特定本体相关。例如,SAREF本体不使用OWL 2Go未处理的公理,并且所有属性都通过范围、域公理和/或限制明确地链接到类。除了SAREF之外,我们还使用NASA空中交通管理本体(atmonto)[28]对OWL 2Go进行了全面测试,该本体由五个T-box本体组成3. 说明性实例以下使用SAREF本体的示例包括上面解释的映射和代码生成过程的所有相关特征。该示例演示了使用OWL2Go生成的Go包的整个过程。第一步是从一个ttl文档中进行实体化,该文档包含一个符合SAREF的A-box本体。可以从另一个应用程序检索此文档。然后,使用OWL2Go生成的API操作反序列化过程创建的实例。在最后一步中,实例被序列化为JSON-LD文档。在第一步中,对ttl编码的SAREF文档进行格式化。清单6:输入ttl文件清 单 6 显 示 了 输 入 TTL 文 档 , 其 中 定 义 了 saref :Appliance、saref:Device的子类和saref:权力,是saref:财产的子类。 设备和属性通过saref:measuresProperty和saref:hasTypicalConsumption关联。这些关系由saref:Device类定义。因此,该示例表明,继承的属性可由派生类正确使用。 还有saref:hasTypicalConsumption的正确用法,它可以是两种不同的类型(即。e. saref:功率和saref:能量)。此外,该示例还包含一个saref:任务对象,任务。这是与开发由双方,saref:完成并的逆saref:isAccollishedBy财产模型化后对应的模型状态为示于图3.第三章。该模型通过添加saref:Measurement进行扩展。对象之间的关系是按照规范添加的。测量与功率特性有关,具有值和单位。此外,从模型中删除任务对象,以证明正确删除与dev的两个关系。清单7提供了给定过程的代码。 图 4突出显示新模型状态。1 PACKAGEMAIN23 import(4“GIT。rwth-aachen.de/acs/public/ontoology/owl/saref/pkg/ontology“5“操作系统“六、78 publicintfindDuplicate(){9101112131415161718我会把它写下来。Modelvarfile*os. File//编译文 件,_=os。 Open(“input。ttl“)在我的日志上。 新的模块化框架TL(文件)文件。Close()//manipulationmeas,_:=mod.新SarefMeasurement(“http://examplele.com/)。com#meas“)我也是。 SetSarefHasValue(3. 十四、dev:=mod. SarefDevice(“http://example. c om#d ev“)1@prefixsaref:。2 asaref:Appliance;3saref:accomplishes;4saref:hasaTypiclConsumpt ion;5saref:measuresPropery.6 asaref:Powerr.7 asaref:Task;8请注意:这是一个由我提供的CCOMPLEDY.S. 代灵湖Razik和A.Monti/SoftwareX 12(2020)10057171[{234567891011},{12131415},{16171819202122232425},{262728“@id“:“http://example. c o m#d ev“,“@type“:[“https://w3id. 或g/saref#Appliance“,“http://www. w.w. cn/w . cn/w.cn/w. cn/w. cn/w. cn/w. cn/w. cn/w. cn/w. cn/w. cn/w. cn/w. cn/w. cn/w.cn/w. cn/w. cn/w. cn/w. cn/w. cn/w. cn/w. cn/w. cn/w. cn/w. cn/w. cn/w.cn/w. cn/w. cn/w. cn/w/w. cn/w/w. cn/w/w. cn/w/w. cn/w/w. cn/w/w.cn/w/w. cn/w/w. cn/w/w/w. cn/w/w/w/w3. o rg/2002/07/owl#NamedIndividual“]、“https://w3id.org/saref#hasTypicalConsumption“:“@id“:“http://example. c o m#kilowat tt“,“@type“:[“https://w3id.org/saref#PowerUnit“,“http://wwww.w3. org/2002/07/o wl#NamedIndividual“]293031}]“@id“:“http://example. c o m#meas“,“@type“:[“https://w3id. 或g/sareref#Measurement“,“http://www.ww.cn/。 w3. o rg/2002/07/owl#NamedIndividual“]、“https://w3id. org/saref#hasValue“:[{“@type“:“http://www w.w3. org/2001/ XMLSchema#doubl e“,“@valu e“:“3.14“}],“https://w3id.org/saref#isMeasurdIn“:[{“@id“:“http://example. c om#kilowatt“}],“https://w3id.org/saref“#relatesToProperty“:[{“@id“:“http://example. c o m#po w“}]“@id“:“http://example. c o m#po w“,“@type“:[“https://w3id. org/saref#Power“,、图三. 模型化后的状态。3.1. 绩效评价性能评估是必要的,以确保使用OWL2Go不会造成瓶颈。这分两步完成首先对OWL2Go本身的性能进行评估。虽然OWL2Go只需要执行一次就可以为给定的本体生成包,但它的执行时间应该保持在合理的范围内。在第二步中,评估所生成的包我们再次将该包用于SAREF本体这个包在本体应用程序运行时使用因此,常见任务(如序列化和重命名)的执行时间非常重要。以下评估确定了影响清单7:示例应用程序的代码。最后一步是新模型的序列化。清单8提供了生成的JSON-LD文档。清单8:输出JSON-LD文件。两个步骤的执行时间。对于OWL2Go的性能评估,创建了四个不同的输入T盒本体。这些本体定义了越来越多的类。在每个本体中,每个类都使用属性与另一个类相关。OWL2Go对所有四个本体都执行。所得到的执行时间如图所示。五、OWL2Go将每个OWL类映射到Go类,并生成相应的接口和结构体以及为接口定义的方法,如第2节所述。 因此,对问题复杂性的主要影响是数量的阶级。由于必须对每个类执行相同的过程,因此执行时间会线性增加。对于所生成的SAREF包的性能评估,使用了包含不同数量的个体所有个体均为SAREF型:设备,并通过SAREF与另一个设备关联:由财产组成。实现了一个简单的Go程序,该程序将输入的A-box本体化,然后将其序列化回TTL文档。所有人的执行时间图5中示出了四个本体。在实体化过程中,创建了Go结构的实例,并添加了属性,即与其他个体的关系。对于序列化过程,遍历每个Go实例,并创建对应于单个创建及其与其他个体的关系的三元组。结果,这两个过程都线性依赖于个
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功