2.1 数据描述方法
良好的数据模型与数据标准是实现信息共享,保证信息一致性、完整性与准确性的基础。跨领域数据来源于各个业务领域,只有将这些信息按照统一的标准进行描述,才能实现信息交换双方对信息的一致理解,更好地发现和明确信息交换的需求。数据模型必须具有机器可读性、平台无关性和灵活性。
机器可读性是指在信息交换过程中,通过数据模型对交换数据进行解析时,不需要对信息交换模型进行翻译或者转换,而能够直接使用,能够保证机器的理解,实现机器对机器的交换。
平台无关性是指数据模型的描述不应该依赖具体的系统平台、设计语言与技术,而要采用独立于平台、语言与技术的描述方式。
灵活性是指数据模型必须具有可扩展、可屏蔽和可重用等特性。可扩展是指当某个数据模式与交换数据相比,不足以表达交换数据的全貌时,能够适当增加模式属性,形成完整的信息交换模式。可屏蔽是指当数据模式与信息交换需求相比,有部分冗余时,可以将不需要的部分属性进行隐藏,形成满足需求的信息交换模式。可重用是指可以将两个或者更多个数据模式组合在一起,形成新的数据模式,达到数据模式重用的目的。
数据参考模型为信息交换双方不一致的信息资源提供了统一的建模方法和技术路线,确保为业务需求提供全面、一致、完整的高质量共享数据,并且为明确数据引用关系、定义交换需求提供依据。XML Schema、JSON具有很强的信息描述和表达能力,为数据模型的表示提供了有效的手段。
2.1.1 数据参考模型
美国政府联邦企业架构(Federal Enterprise Architecture,FEA)中的数据参考模型(Data Reference Model,DRM)提供了有效的数据描述方法。美国预算管理办公室(Office of Management and Budget,OMB)提出的数据参考模型是美国政府联邦企业架构中5个参考模型之一,旨在促进横向(美国联邦政府业务领域之间)和纵向(美国联邦政府与州政府和地方政府之间)的信息交换与共享。
数据参考模型提供了描述各业务领域数据,以及信息共享方法的标准化模型,包括数据模式描述模型、数据环境描述模型和数据共享描述模型3个部分,其关系及作用如图2-1所示。
图2-1 数据参考模型3个组成部分的关系及作用
数据模式描述模型主要描述各个业务领域数据的语义和语法,解决数据使用者如何理解数据的问题,描述的主要概念包括实体、数据类型、属性、关系等。
数据环境描述模型主要解决对数据集的查询定位问题,描述概念包括分类方法、数据集、数据管理者等。数据集是一个容器,包含数据、文件知识库、相关数据库或网络资源等。数据管理者指的是负责管理数据集的人或者组织。
数据共享描述模型主要描述实现数据共享的方法,包括查询点和信息交换包。查询点指的是访问或者查询数据集的工具或手段,信息交换包是按照交换双方协商的格式封装的交换数据。
数据参考模型为各领域进行信息集成、互操作、发现和共享数据提供了一套描述方法。为了达到这个目标,数据参考模型对数据架构概念元素及它们之间的关系进行了明确定义,并且针对每个概念元素分别定义了一系列通用属性。数据参考模型按照数据模式描述、数据环境描述、数据共享描述3个部分,描述了各个部分相关的概念元素及其关系。需要注意的是,为了表述清晰,图2-2所示的一些概念元素会出现多次,实线边框中的概念元素才是真正的定义,虚线边框中的概念元素只是从其他部分“借用”来的。
图2-2 数据参考模型
1.数据模式描述模型
数据模式描述的目标是提供关于信息资源数据结构(语法)和意义(语义)的描述。存储在计算机中的数据资源,可分为结构化数据、半结构化数据和非结构化数据,如图2-3所示。结构化数据通过数据模式(Data Schema)来描述。数据模式定义了结构化数据资源的语法和语义,可以说是结构化数据的元数据(Meta Data)。数据模式通过实体(Entity)、属性(Attribute)、关系(Relationship)和数据类型(Data Type)这4个概念及它们之间的关系来定义。
● 实体(Entity):现实世界中客观事物的抽象。实体包含若干属性,实体通过“关系”与其他实体建立关联。
● 属性(Attribute):实体某一特性的抽象。一个属性的取值被约束于一个数据类型。
● 数据类型(Data Type):对于一个属性的物理表述的类型约束。
● 关系(Relationship):用于描述实体间的关系。
图2-3 数据模式描述模型
除结构化数据之外,其他如视频数据、音频数据等非结构化数据,与结构化数据的最大区别在于,非结构化数据的语义和语法与实例数据本身紧密结合在一起,因此,其组织结构和意义对外界并不具备很强的公开性和交互性;而结构化数据与之相反,定义其数据结构和意义的数据模式信息可以独立于实例数据之外,用于不同系统之间进行针对语义和语法的交流。数据模式描述的内容如表2-1所示。
表2-1 数据模式描述的内容
(续表)
2.数据环境描述模型
数据环境描述用于为数据添加与其使用和创建的目标相关的信息,从而便于不同视角的数据使用者发现和使用数据。经过数据模式描述模型的定义,利益共同体内成员对于数据的描述将会产生共识,但是这并不意味着具有不同视角的数据使用者就关心所有的数据实体或数据实体的所有属性,甚至即便是针对某个数据实体的实例数据,不同的数据使用者由于视角不同也可能只对其中部分实例数据感兴趣。举例来说,假设一个“人”的实体,它对人进行了抽象,并在利益共同体内根据所有参与者的共识,定义了符合所有数据使用者要求的属性,但是在使用过程中,从商业的角度来看待人,可能更关注商业行为方面的数据,因而对他来说并不一定关注如头发颜色之类的信息,而对于执法机构的信息使用者却不然。由此可以看出,数据可以根据不同的方式进行分类,而针对分类方式的描述和定义就构成了“数据环境”。除了关于数据的分类划分这个核心概念,数据环境还描述数据集的主题、数据集维护管理机构及访问数据集的服务方式,如图2-4所示。
数据环境的定义实际上就是针对数据使用背景的分类法的定义。虽然用来分类的角度纷繁复杂,但本质上来讲不论何种分类法都可以通过结构化方式进行表述,这也为不同业务领域之间对于分类法的语义和语法达成共识提供了基础。经过结构化表述的分类法定义,数据使用者可以识别符合自己要求的数据集是否存在,并检测其包含的数据是否符合他对信息的要求。数据环境的主要概念之间的关系如下。
图2-4 数据环境描述模型
● 数据环境的分类法(Taxonomy)包含若干主题(Topic),而且主题之间是相互联系的。分类法被描述为结构化数据,并存放于结构化数据资源中。
● 每个分类法的主题用于对数据集进行分类,同时也可以对各种数据集、查询点和信息交换包进行分类。
● 可以为数据集指定一个管理数据的负责人或机构。
数据环境描述内容如表2-2所示。
表2-2 数据环境描述内容
(续表)
3.数据共享描述模型
数据模式描述模型和数据环境描述模型为规划和实现信息访问、交换提供了基础,数据共享描述模型用来描述信息访问和交换的方法,如图2-5所示。信息交换通常是指在信息生产者和信息使用者之间所存在的相对固定且时常发生的信息交互过程。针对信息的使用除这种交换的方式外,作为信息源的信息提供者往往还需要对外提供各种信息访问接口,从而为各种不确定的外界信息使用者提供信息访问的能力。
图2-5 数据共享描述模型
信息交换包(Exchange Package)用于表述产生于信息提供者和信息使用者之间的经常性的信息交换。信息交换包中包含了与交换过程相关的各种信息(如信息提供者ID、信息使用者ID、信息有效期等),以及数据载荷的引用。信息交换包还可以用来定义在一次信息交换中某个查询点(Query Point)接收与处理的查询结果的格式。信息交换包与其他概念元素之间有如下关系:
● 信息交换包引用了业务领域的实体;
● 信息交换包被传播给信息使用者;
● 信息交换包通过查询点查询获取数据;
● 信息交换包引用了针对交换数据载荷的定义。
信息提供者与其他概念元素之间具有如下关系:信息提供者生成信息交换包;信息使用者(Consumer)是使用数据的实体;数据载荷定义(Payload Definition)表示针对数据交换需求而制定的格式化定义;查询点(Query Point)是为了访问和查询数据集而提供接口的端点,一个查询点的具体表达可以是Web服务的URL。
数据共享描述内容如表2-3所示。
表2-3 数据共享描述内容
2.1.2 基于XML Schema的数据描述方法
XML Schema作为一种具有数据描述功能、高度结构性、可验证的标记语言,其易于扩展、结构性强、语义性强、可格式化、易于处理、与平台无关等特性使之成为信息交换数据模型表示的常用语言。在对客观世界的分析、归纳和抽象的基础上,运用XML Schema,用类与类之间的关系及类的属性等对数据模型进行描述。
1.XML Schema
XML Schema是万维网联盟(World Wide Web Consortium,W3C)制定的XML文档结构描述标准,它可以定义出现在文档中的元素、属性、子元素的次序、数目、默认值(固定值或值范围)、值列表,以及元素和属性的数据类型。作为一种文档描述语言,通常将其简写为XSD(XML Schema Define)。
XML Schema本身就是一个结构良好的XML文档,它的基本结构是树形的。树的根节点是Schema元素,用于表示该XML文档是一个XML Schema文档,下面的子节点就是需要声明的元素、属性、简单数据类型和复杂数据类型等。XML Schema文档的基本结构如图2-6所示:
图2-6 XML Schema文档的基本结构
常用的XML Schema元素如表2-4所示。
表2-4 常用的XML Schema元素
(1)attribute。
attribute 定义一个属性,只能用于表示简单的内容,如表示一个值。attribute在XML中不能独立存在,必须由元素携带;其属性不能扩展、替换、扩充或多次出现。attribute的基本语法如图2-7所示。
图2-7 attribute基本语法
attribute的属性说明如下。
① default:可选,规定属性的默认值。default和fixed属性不能同时出现。
② fixed:可选,规定属性的固定值。default和fixed属性不能同时出现。
③ form:可选,规定属性的格式。默认值是包含该属性的schema元素的attributeFormDefault属性的值,可以设置为下列值。
● "qualified":指示必须通过命名空间前缀和该属性的无冒号名称 (NCName)来限定此属性。
● "unqualified":指示此属性无须由命名空间前缀限定,且无须匹配此属性的无冒号名称(NCName),即本地名称。
④ id:可选,规定该元素唯一的ID。
⑤ name:可选,规定属性的名称。name和ref属性不能同时出现。
⑥ ref:可选,规定对指定的属性的引用,若需要使用在复杂类型中一个已有的属性定义来声明一个属性,使用ref属性。name和ref属性不能同时出现。如果ref出现,则simpleType元素、form和type不能出现。
⑦ type:可选,规定内建的数据类型或简单类型。type属性只能在内容不包含simpleType元素时出现。
⑧ use:可选,规定如何使用该属性。在默认情况下,属性是可选的。若需要规定属性为必选,使用 "use" 属性,可设置为下面的值。
● optional:属性是可选的,并且可以具有任何值(默认)。
● prohibited:不能使用属性。
● required:属性是必需的。
⑨ any attributes:可选,规定带有non-schema命名空间的任何其他属性。
若一个属性名称为“lang”的定义如下。
带有“lang”属性的“lastname”元素XML元素如下:
(2)element。
element定义一个元素,用于表示简单内容(值)或复杂内容(对象),元素都可以带有属性。element的基本语法如图2-8所示。
属性说明如下。
① id:可选,规定该元素唯一的ID。
② name:可选,规定元素的名称。如果父元素是 schema 元素,则此属性是必需的。
③ ref:可选,对另一个元素的引用。ref属性可包含一个命名空间前缀。如果父元素是schema元素,则不使用该属性。
图2-8 element的基本语法
④ type:可选,规定数据类型的名称,或者规定simpleType元素或complexType元素的名称。
⑤ substitutionGroup:可选,规定可用来替代该元素的元素名称。该元素必须具有相同的类型或从指定元素类型派生的类型。如果父元素不是 schema 元素,则不可以使用该属性。
⑥ default:可选,为元素规定默认值(仅当元素内容是简单类型或 textOnly 时使用)。
⑦ fixed:可选,为元素规定固定值(仅当元素内容是简单类型或 textOnly 时使用)。
⑧ form:可选,该元素的形式。默认值是包含该属性的 schema 元素的 elementFormDefault 属性的值。该值必须是下列字符串之一:"qualified" 或 "unqualified"。如果父元素是 schema 元素,则不能使用该属性。
● 如果该值是 "unqualified",则无须通过命名空间前缀限定该元素。
● 如果该值是 "qualified",则必须通过命名空间前缀限定该元素。
⑨ maxOccurs:可选,规定 element 元素在父元素中可以出现的最大次数。该值可以是大于或等于零的整数。若不想对最大次数设置任何限制,请使用字符串 "unbounded",默认值为 1。如果父元素是 schema 元素,则不能使用该属性。
⑩ minOccurs:可选,规定 element 元素在父元素中可以出现的最小次数。该值可以是大于或等于零的整数,默认值为 1。如果父元素是 schema 元素,则不能使用该属性。
nillable:可选,标识是否可以将显式的零值分配给该元素,此项应用于元素内容且不是该元素的属性,默认值为 false。
abstract:可选,指示元素是否可以在实例文档中使用。如果该值为 true,则元素不能出现在实例文档中;相反,substitutionGroup 属性包含该元素的限定名(QName)的其他元素必须出现在该元素的位置。多个元素可以在其substitutionGroup属性中引用该元素,默认值为false。
block:可选,派生的类型。block 属性防止具有指定派生类型的元素被用于替代该元素。该值可以包含 #all 或者一个列表,该列表是 extension、restriction 或 substitution 的子集。
● extension:防止通过扩展派生的元素被用来替代该元素。
● restriction:防止通过限制派生的元素被用来替代该元素。
● substitution:防止通过替换派生的元素被用来替代该元素。
● #all:防止所有派生的元素被用来替代该元素。
final:可选,设置 element 元素上 final 属性的默认值。如果父元素不是 schema 元素,则不能使用该属性。该值可以包含 #all 或者一个列表,该列表是 extension 或 restriction 的子集。
● extension:防止通过扩展派生的元素被用来替代该元素。
● restriction:防止通过限制派生的元素被用来替代该元素。
● #all:防止所有派生的元素被用来替代该元素。
any attributes:可选,规定带有non-schema命名空间的任何其他属性。
如图2-9所示的XML中,包含了5个元素和2个属性(structures:id 和 nc:personNameInitialIndicator)。
图2-9 元素和属性用法举例
(3)简单类型元素。
简单类型元素是指其使用的只有基本数据类型,不会包括任何子元素和属性。图2-10是一个schema,其中带有4个简单元素:"fname","lname","age","dateborn",类型是string、string、nonNegativeInteger、date。
(4)复合类型元素。
复合类型元素是指包含子元素的元素,它包括4种类型,分别是空元素、只包含子元素的元素、只包含文本的元素、同时包含子元素和文本的元素。复合类型元素声明的表示方法有两种。一种是对此元素直接进行声明,具体表示方法如图2-11所示。
图2-10 简单类型元素举例
图2-11 复合类型元素的一种表示方法
另一种是使用type属性,这个属性的作用是引用要使用的复合类型的名称,具体表示方法如图2-12所示。
图2-12 复合类型元素的另一种表示方法
图2-13分别是以两种方式定义复合类型的例子。
(5)指示器。
在复合类型中,通过指示器可以控制在文档中使用元素的方式。复合类型中有3类、7种指示器:Order指示器(〈all〉、〈choice〉和〈sequence〉),Occurrence指示器(〈maxOccurs〉和〈minOccurs〉),Group指示器(〈Group〉、〈attributeGroup〉)。
① Order指示器。
〈all〉指示器规定子元素可以按照任意顺序出现,并且每个子元素必须出现一次,如图2-14所示。
图2-13 复合类型元素表示方法举例
图2-14 〈all〉指示器用法举例
<choice>指示器规定可出现某个子元素,或者可出现另一个子元素(非此即彼)。
<sequence>指示器规定子元素必须按照特定的顺序出现。
② Occurrence指示器。
<maxOccurs>指示器规定某个元素可出现的最大次数。
<minOccurs>指示器规定某个元素可出现的最小次数。
③ Group指示器。
元素组通过<group>指示器声明进行定义,属性组通过<attributeGroup>指示器声明进行定义。
(6)类型扩展。
XSD使用<xs:extension>扩展一个基本类型、简单类型或复合类型。基本类型扩展可以增加属性,简单类型扩展主要增加附加的一些约束,复合类型扩展则可以增加新的组成元素或属性。对基本类型进行扩展可使用<xs:simpleContent>,对复合类型进行扩展可使用<xs:complexContent>。
① 基本类型扩展,如图2-15所示,在基本类型的基础上增加了属性。
图2-15 基本类型扩展举例
② 简单类型扩展,如图2-16所示。
图2-16 简单类型扩展举例
③ 复合类型扩展,如图2-17所示。
图2-17 复合类型扩展举例
2.实体描述
一个实体代表一组拥有共同特征的事物。一个实体对应于客观世界中的一个物体,或者一个抽象的概念。一个实体可以是独立的,也可以存在依赖关系。独立的实体可以独立确定,而不需要决定与其他实体的关系;具有依赖性的实体需要确定与其他实体的关系。
特征代表实体的一个特性。通常一个实体包含多个特征,一个特征实例包括特征类型和特征值。例如,“机动车(Vehicle)”这个实体包含了“生产时间(VehicleMake)”“内部颜色(VehicleColorInteriorText)”“门的数量(VehicleDoorQuantity)”等多个特征。在一个实体中,特征必须有唯一的名称,同样的特征名称代表同样的特征;反过来,同样的特征就需要相同的特征名称。
实体通常表示为类,在XML中通常用simpleType、complexType数据类型和element数据元素来定义。特征通常表现为类成员,在XML中用数据元素element来定义。如图2-18所示的代码,定义了实体“机动车”和它的3个特征——“生产时间”“内部颜色”“门的数量”。
图2-18 实体描述举例
图2-18 实体描述举例(续)
3.实体间关系描述
实体间的关系在XML中可以通过“is-a”和“has-a”来描述。“is-a”代表实体之间的继承关系,“has-a”代表实体之间的包含关系。
“is-a”表示若干数据实体继承自某个数据实体,并因此具有该实体的部分属性,“is-a”关系在XML中可以通过使用extension元素,并指定其属性base=" 被继承实体"来描述。“has-a”代表包含关系,表示实体包含其他的实体,被包含的实体是前者的组成部分,通过在<xs:sequence> </xs:sequence>中增加被包含的元素。
如图2-19的代码所示,节点<xs:extension base="mda:DocumentType">表示LOAReportType实体继承了实体DocumentType的属性,或者说,LOAReportType is-a DocumentType;而节点<xs:sequence>下的内容则表示了包含关系,LOAReportType包含船舶(Vessel)、位置(Position)和船员列表(CrewNationalityList)等信息。
图2-19 实体间关系描述举例
图2-19 实体间关系描述举例(续)
包含关系及其子实体的数量表示方法如表2-5所示。
表2-5 包含关系及其子实体的数量表示方法
2.1.3 基于JSON Schema的数据描述方法
1.JSON基本语法
JSON(JavaScript Object Notation)是基于JavaScript编程语言ECMA-262 3rd Edition-December 1999标准的一种轻量级的数据交换格式。JSON独立于编程语言,能够把针对编程语言的数据结构(如数字、数组等)格式化为字符串的文档,便于机器解析和生成。与XML相比,JSON结构简单、标记少、解析方便。JSON数据描述方法主要如下。
(1)对象(object):一个对象以“{”开始,以“}”结束。一个对象包含一系列非排序的名称/值对,每个名称/值对之间使用“,”分隔。
(2)键—值对(collection):键名称和值之间使用“:”隔开,一般的形式是{name:value}。一个键名称是一个字符串;一个值可以是一个字符串、数值、对象、布尔值、串行表或null值。
(3)数组(array):一个或多个值用“,”分隔后,使用“[”“]”括起来就形成列表[collection, collection],这种列表即数组。
(4)字符串:以" "括起来的一串字符。
(5)数值:一系列0~9的数字组合,可以为负数或小数,还可以用“e”或者“E”表示为指数形式。
(6)布尔值:表示为 true 或 false。
如图2-20所示为JSON的一个例子,包含3个程序员、3个作者和2个音乐家,每个类别又分别放在一个数组中。
图2-20 JSON描述举例
2.JSON Schema基本语法
JSON Schema是用来定义JSON数据约束的模式文件,其作用类似于XML Schema的作用。根据这个约定模式,交换数据的双方可以理解JSON数据的要求和约束,也可以据此对JSON实例数据进行验证,保证交换数据的正确性。
JSON Schema文件中包括一个或多个键—值对,如图2-21所示为JSON Schema描述模板。其中,“$schema”的属性指定该JSON应遵循的JSON Schema规范;“additionalProperties”指定在实例中是否允许使用除此模式中定义的属性以外的其他属性;“properties”定义元素;“definitions”定义数据类型。
其中,“definitions”中的“type”键的值包括“string”“number”“integer”“boolean”“object”“array”“array(属性“uniqueitems”:true)”“null”“any” 等,相关的语法如下。
图2-21 JSON Schema描述通用模板
① 当“type”的值为数值或整数时,包括的键:multipleOf将值设置为给定数字的倍数,minimum、exclusiveMinimum、maximum、exclusiveMaximum设定键值的范围。
② 当“type”的值为字符串时,包括的键:minLength和maxLength设置字符串的长度;Pattern设置该值需要满足的正则表达式;format设置该值的格式(如date-time、email、ipv4、uri等类型的格式)。
③ 当“type”的值为数组时,相关的键包括:type设置每个项的数据类型;enum设置数组中项的允许值;minItems和maxItems设置数组中项的数量;uniqueItems指定数组中每个项都是唯一的。
④ 当“type”的值为对象时,相关的键包括:properties列出可能包含在对象中的属性;required列出必须包含在对象中的属性;additionalProperties表示该模式文件是否允许properties和patternProperties下未列出的其他属性存在;minProperties和maxProperties设置对象出现的最小数量和最大数量;patternProperties定义具有正则表达式的属性;Dependencies表示该对象依赖的其他对象。
此外,模式可以与以下键结合使用:allOf表示如果实例针对此键值定义的所有模式成功验证,则实例将针对此键成功验证;anyOf表示如果实例针对此键值定义的至少一个成功验证,则实例将针对此键成功验证;one of表示如果实例针对此键值定义的一个成功验证,则实例将针对此键成功验证。在如图2-22所示模式文件中,anyOf关键字表示给定值可能对任何给定子模式均有效。第一个子模式需要一个最大长度为5的字符串;第二个子模式需要一个最小值为0的数字。只要某个值针对任何一个子模式验证通过,就被视为对整个模式都有效。若键值为“short”或“12”,则验证可通过;若键值为“too long”或“-5”则验证不通过。
图2-22 anyOf关键字举例
如图2-23所示为一个请求法庭听证的JSON Schema示例。
图2-23 一个请求法庭听证的JSON Schema举例
图2-23 一个请求法庭听证的JSON Schema举例(续)
图2-24为如图2-23所示XML Schema对应的JSON实例数据。
图2-24 JSON实例数据
3.JSON-LD
JSON是一种轻量级的、与语言无关的数据交换格式,易于解析且易于生成。但是,很难集成不同来源的JSON文件,因为一个JSON文件中可能包含其他数据来源的键。此外,JSON没有对超链接的内置支持,而超链接是Web的基本组成。JSON-LD是JavaScript Object Notation for Linked Data的首字母缩写,是一种基于JSON表示和传输关联数据(Linked Data)的方法,允许跨网站链接数据,易于人类阅读,也易于机器解析和生成。
如图2-25所示的数据,人类可以理解,它是一个包含名称“Manu Sporny”、主页地址“http://manu.sporny.org/”、图片地址“http://manu.sporny.org/images/ manu.png” 相关的数据,但是机器不能如此直观理解。有时,对于复杂的数据,即使人类,也很难解决此类表示形式的含义。因此,通过使用明确的标识符表示不同的概念,而不是如“name”“homepage”之类的标记,可以解决此问题。
图2-25 JSON举例
对于链接数据,通常使用国际资源标识符(Internationalized Resource Identifier,IRI)进行明确标识。为数据指定一个明确的IRI,彼此之间就不会产生冲突,开发人员和机器也能够使用此IRI(例如,通过使用Web浏览器访问某个地址)来查找类似“name”“homepage”这样的术语,并获得对该术语含义的定义,如图2-26所示。
图2-26 使用IRI代替术语
图2-27中每个属性均由IRI明确标识,所有表示IRI的值均由@id关键字明确标记。尽管这是一个有效的JSON-LD文档,但该文档过于冗长,不便于使用。为了解决此问题,JSON-LD引入了上下文“context”的概念。
图2-27 使用上下文描述方法
图2-28中定义了一个对象模型,对应的JSON-LD数据文件如图2-29所示。
图2-28 对象模型举例
图2-29 JSON-LD数据文件举例