protegeproject/mapping-masterPublic

protegeproject/mapping-masterPublic

  • Watch 10

  • Fork 7Fork your own copy of protegeproject/mapping-master

  • Star 44

MappingMasterDSL

编辑新页面

马丁·奥康纳编辑了此页面 on Oct 29, 2020 · 85 修订

页面4

添加自定义边栏

在本地克隆此维基

MappingMaster 是一种域特定语言 (DSL),它定义了来自 电子表格内容到OWL本体。该语言基于曼彻斯特猫头鹰 语法,它本身就是一个用于描述OWL本体的DSL。

可以在此处找到曼彻斯特语法的介绍。 可以在该文档的“快速参考”部分找到一组示例曼彻斯特语法表达式。

曼彻斯特语法支持OWL公理的声明性规范。

例如,名为类 Gum 的 OWL 的曼彻斯特语法声明是名为 Product 的命名类的子类可以 使用类声明子句编写为:

Class: Gum SubClassOf: Product

MappingMaster DSL 扩展了曼彻斯特语法以支持对 这些声明中的电子表格内容。MappingMaster 引入了一个新的引用子句,用于引用电子表格内容。在此 DSL 中,任何 曼彻斯特语法表达式中的子句,指示 OWL 命名类, 可以替换 OWL 属性、OWL 单个、数据类型或文字 与此引用条款一起使用。任何包含此类引用的声明都是 预处理和这些指定的相关电子表格内容 导入引用。在处理每个声明时,适当的 为每个引用检索电子表格内容。然后,此内容可以是 主要以四种方式使用:

  • 它可用于直接命名按需创建的 OWL 实体。

  • 它可用于注释按需创建的 OWL 实体。

  • 内容可以直接作为URI引用现有的OWL实体,也可以通过注释属性引用。

  • 最后,内容可以用作文字。

因此,使用其中一种方法,表达式中的每个引用都是 在预处理期间解析为命名的 OWL 实体、数据类型或文本。然后,生成的表达式可以由标准曼彻斯特语法处理器执行。

目录

引用

MappingMaster DSL 中的引用以字符 @ 为前缀。这些是 通常后跟 Excel 样式的单元格引用。在标准 Excel 中 单元格表示法,单元格从工作表左上角的 A1 延伸 电子表格到连续更高的列和行,带有字母字符 指列,数值指行。

基本参考使用

例如,电子表格中对单元格 A5 的引用编写如下:

@A5

上述单元格规范表明引用是相对的,这意味着 如果将包含引用的公式复制到另一个单元格,则 引用的行和列组件将相应更新。

也可以通过将工作表的名称括在单引号中并使用 工作表名称和单元格规范之间的“!” 字符分隔符:

@'A sheet'!A3

例如,在下面的电子表格中,B 列的第 4 行到第 6 行包含 产品类别;第 2 行的 D 到 G 列包含状态标识符,并且 网格范围 D4 到 G6 包含销售额。

然后可以在MappingMaster的DSL中使用这些引用来定义OWL 使用电子表格内容进行构造。

例如,一个 MappingMaster 表达式,用于声明类 FlavoredGum 是由单元格内容命名的类的子类 B4可以写成:

Class: FlavouredGum SubClassOf: @B4

处理时,此表达式将使用 单元格B4(“口香糖”)的内容作为类名,并声明调味口香糖为其子类。如果类口香糖已经 存在,子类关系将简单地建立。

也就是说,引用既可用于定义新的 OWL 实体,也可用于引用 现有实体。

一个类似的表达式,用于声明类 SalesItem 是 等效于由单元格 B4 的内容命名的类可以写成:

Class: SalesItem

EquivalentTo: @B4

曼彻斯特语法还支持单独的声明子句 申报个人;属性值可以与声明的 使用事实子条款的个人,其中包含财产价值列表 声明。

例如,一个表达式,用于指定个人从 单元格 D2 (“CA”) 的内容对于数据属性的值为“加利福尼亚” 值 hasStateName 可以写成:

Individual: @D2

Facts: hasStateName "California"

在这里,如有必要并关联,将创建一个个人 CA 数据属性 hasStateName,它将被赋予字符串 值“加利福尼亚”。

使用标准曼彻斯特语法,注释属性也可以 与声明的实体相关联。

例如,名为 hasSource 的现有字符串数据类型注释属性可用于关联上述声明的加利福尼亚 个人与源文件如下:

Individual: @D2

Facts: hasStateName "California"

Annotations: hasSource "DMV Spreadsheet 12/12/2010"

类或属性可以用相同的方式进行批注。例如,一个类 可以使用 hasSource 注释属性进行注释,如下所示:

Class: @D2

Annotations: hasSource "DMV Spreadsheet 12/12/2010"

曼彻斯特语法还支持使用 OWL 类表达式。在 通常,类表达式可能出现在命名类可能出现的任何位置。

例如,用于定义 类 Sale 使用单元格 D4 的内容作为猫头鹰的填充物:具有属性 hasAmount 的 HasValue 公理可以是 写:

Class: Sale

SubClassOf: (hasAmount value @D4)

通常,在 MappingMaster 表达式中显式命名的 OWL 实体(如 反对通过引用解决)必须 目标本体中已经存在。在这些示例中,类 Sale、SalesItem 和 FlavoredGum 以及属性必须已经 存在。

指定引用的类型

在表达式中

Class: @A5

SubClassOf: Drug

参考@A5显然是指 OWL 类。 但是,不能始终明确地推断引用类型。

例如,在表达式中

Class: Sale

SubClassOf: (@A3 value @D4)

引用@A3可以引用对象、数据或注释属性,引用@D4可以是 OWL 个人或文本。

为了处理这种情况,映射主机支持显式实体类型规范。 具体而言,引用可以选择后跟括号括起来 实体类型规范,用于显式声明引用实体的类型。 此规范可以指示实体是 OWL 命名类、OWL 数据或注释属性, 名为“个人”的 OWL 或数据类型。这 用于指定类型的 MappingMaster 关键字是标准的曼彻斯特语法 关键字 Class、ObjectProperty、DataProperty、AnnotationProperty 和 Individual,以及任何 XSD 类型名称(例如 xsd:int)。

使用此规范,例如,以前的药物声明可以是 写:

Class: @A5(Class)

SubClassOf: Drug

单元格 B5 中具有关联属性值的个人声明 从单元格 C5 可以指定浮点类型,如下所示:

Individual: @B5

Facts: hasSalary @C5(xsd:float)

如果 hasSalary 数据属性已声明为 xsd:float 类型,则不需要显式类型限定。一个 在以下情况下,也可以为文本指定全局默认类型 关联的数据属性的类型未知或未指定,或者 如果引用中未提供显式类型。

对OWL属性和个人的引用可以用同样的方式进行限定。

参考分辨率

引用可以指定OWL实体(即类、属性、个人或数据类型)或文字。当引用指定OWL实体时,引用值可以解析为现有的OWL实体,也可以用于命名按需创建的OWL实体。

基本参考分辨率

创建或时支持各种名称解析策略 引用 OWL 实体。三个主要策略是:

  • 使用 rdf:IDs 创建或解析 OWL 实体。

  • 使用 rdfs:标签注释来创建或解析 OWL 实体

  • 根据忽略解析的参考值的单元格位置创建 OWL 实体

使用 rdf:ID 编码和从引用生成的 OWL 实体 直接从解析的引用值分配其 rdf:ID。明显地 此内容必须表示有效的标识符(例如,RDF:IDs 中不允许空格)。

使用 rdfs:label 编码,从 引用被赋予一个自动生成的URI,其rdfs:label注释值设置为解析的引用值。

使用位置编码,从引用生成的 OWL 实体也是 给定一个自动生成的 URI,但在这种情况下 解析的参考值未使用。

默认命名编码使用 rdfs:label 注释属性。 默认值也可以全局更改。

提供名称编码子句以显式指定所需的编码 用于特定参考。与实体类型规范一样,此子句是 用单元格引用后的括号括起来。要指定 三种类型的编码是mm:Location,rdf:ID和rdfs:label。

使用此子句,对 以前的药物示例可以写:

Class: @B4(rdf:ID)

SubClassOf: Drug

如前所述,MappingMaster 还支持实体创建,其中单元格值 被忽略。在这种情况下,关键字 mm:Location 可用于 引用后面的括号。

例如,用于在忽略单元格 D4 时为单元格 D<> 创建个体的表达式 单元格的内容可以写入:

Individual: @D4(mm:Location)

默认情况下,OWL实体名称使用命名空间解析或生成 当前活跃的本体。该语言包括 mm:前缀和 mm:namespace 子句来覆盖此默认行为。

例如,指示个人创建或解决的表达式 从单元格 A2 的内容(假设 RDFS:标签分辨率)应该 使用由前缀“clinical”标识的命名空间,可以写成:

Individual: @A2(mm:prefix="clinical")

同样,指示它必须使用命名空间的表达式 “ http://clinical.stanford.edu/Clinical.owl#”可以写成

Individual: @A2(mm:namespace="http://clinical.stanford.edu/Clinical.owl#")

引用中的显式命名空间或前缀限定允许消除歧义 本体中的重复标签。

使用注释值的参考分辨率

要支持对表达式中的批注值的直接引用, MappingMaster的DSL采用曼彻斯特语法机制来封装这些 单引号中的引用。

例如,如果OWL类产品具有rdfs:label注释值“可销售产品”,则可以按如下方式引用:

Class: @B4

SubClassOf: 'A sellable product'

处理此表达式时,将通过对类 Product 的注释值解析可售产品。

参考分辨率配置选项

记录以下选项:

mm:defaultPrefix, mm:defaultNamespace, mm:defaultLanguage, mm:ResolveIfOWLEntityExists, mm:SkipIfOWLEntityExists, mm:WarningIfOWLEntityExists, mm:ErrorIfOWLEntityExists, mm:CreateIfOWLEntityDoesNotExist, mm:SkipIfOWLEntityDoesNotExist, mm:WarningIfOWLEntityDoesNotExist, mm:ErrorIfOWLEntityDoesNotExist, mm:ProcessIfEmptyLabel, mm:ErrorIfEmptyLabel, mm:WarningIfEmptyLabel, mm:SkipIfEmptyLabel

处理单元格内容

默认行为是直接使用引用单元格的内容。 但是,可以使用可选的值规范子句覆盖此默认值。

此子句通常由“=”表示 紧跟在编码规范关键字之后的字符,紧跟在后面 通过括号括起来、逗号分隔的值规格列表, 它们相互附加。这些值规格可以是单元格 引用、引用值、包含捕获组的正则表达式, 或内置的文本处理功能。

基本单元格内容处理

例如,扩展引用以指定实体的表达式 从单元格 A5 创建的是使用 rdfs:标签名称编码,并且 name 是前面带有字符串“Sale:”的单元格的值,可以是 写法如下:

Class: @A5(rdfs:label=("Sale:", @A5))

值规范引用不限于引用的单元格 本身,并可能指示任意单元格。也可以有多个编码 为特定引用指定,例如,单独的标识符和 可以为特定实体生成标签注释值,使用 不同单元格的内容。

例如,我们可以扩展上面的例子来分配 rdf:ID 生成到单元格 B5 的类,如下所示:

Class: @A5(rdf:ID=@B5 rdfs:label=("Sale:", @A5))

如果分配列表仅包含单个值,则开始和 右括号可以省略:

Class: @A5(rdf:ID=@B5 rdfs:label=("Sale:", @A5))

该语言包括几种内置的文本处理方法,这些方法用于 值规格。目前,支持几种方法。其中包括 mm:replace、mm:replaceAll、mm:replaceFirst、mm:prepend、mm:append、mm:toLowerCase、mm:toUpperCase、mm:trim、mm:reverse和 mm:printf、mm:decimalFormat。 这些方法接受零个或多个参数并返回一个值。提供 参数可以是带引号的字符串或引用的任意组合。

用于在标签之前将单元格 A5 的内容转换为大写的表达式 作业可以写:

Class: @A5(mm:toUpperCase(@A5))

如果参数,方法也可以省略显式的第一个参数 指当前位置值。因此,前面的表达式也可以是 写:

Class: @A5(mm:toUpperCase)

值处理函数也可以在值规范之外使用 子句 - 但仅当这些子句未在引用中使用时,并且仅 可以使用单个功能。

decimalFormat and printf

decimalFormat 和 printf 支持文本和数字内容的格式设置。 它们的行为遵循 DecimalFormat 类和 String.format 方法的标准 Java 规范。

mm:decimalFormat 可以按如下方式使用:

Individual: Fred Facts: hasSalary @A1(mm:decimalFormat("###,###.00", @A1))

当单元格 A1 的值为“23000.2”时,这将呈现:

Individual: Fred Facts: hasSalary "23,000.20"

下面是一个 mm:printf 的例子:

Class: @A1(mm:printf("A_%s", @A1))

当单元格 A1 的值为“汽车”时,这将呈现:

Class: A_Car

任何参数都可以替换为引用子句。这些函数也可以与显式 rdf:ID 和 rdfs:label 赋值一起使用。

请注意,如果只提供一个参数,则假定第二个参数是封闭参考位置。

所以

Individual: Fred Facts: hasSalary @A1(mm:decimalFormat("###,###.00"))

相当于:

Individual: Fred Facts: hasSalary @A1(mm:decimalFormat("###,###.00", @A1))

Class: @A1(mm:printf("A_%s"))

相当于:

Class: @A1(mm:printf("A_%s", @A1))

这也相当于:

Class: @A1(rdf:ID=mm:printf("A_%s", @A1))

嵌套函数

请注意,函数不能直接嵌套在其他函数中。例如,我们不能使用 mm:toUpperCase 函数直接将值转换为大写,然后使用封闭的 mm:prepend 函数:

Class: @A1(mm:prepend("_", mm:toUpperCase)) # THIS IS NOT ALLOWED

但是,函数的参数可以包含引用,引用本身可以包含函数,因此我们可以间接嵌套。例如,可以使用此方法将前面的大写字母后跟一个前置运算编写如下:

Class: @A1(mm:prepend("_", @A1(mm:toUpperCase)))

mm:printf 函数在执行复杂的操作组合时也非常有用。例如,前面的大写字母后跟一个前置运算可以使用 mm:printf 编写如下:

Class: @A1(mm:printf("_%s", @A1(mm:toUpperCase)))

替换字符

mm:replace 和 mm:replaceAll 函数遵循 标准 Java 字符串类中的关联方法。

例如,要从单元格中删除前面的所有非字母数字字符 赋值时,mm:replaceAll 函数可以按如下方式使用:

Individual: @A5

Facts: hasItems @B5(mm:replaceAll("[^a-zA-Z0-9]",""))

同样,mm:replace 方法可用于将逗号替换为 处理文本时的句点:

Individual: @A2

Facts: hasSalary @A3(xsd:float mm:replace(",", "."))

前置和追加

mm:prepend 方法可以按如下方式使用,以简化 上面的例子:

Class: @A5(rdfs:label=mm:prepend("Sale:"))

如果表达式是默认值,则可以通过省略显式 rdfs:label 限定来进一步简化表达式:

Class: @A5(mm:prepend("Sale:"))

追加方法的工作方式类似。

例如,假设默认的 rdfs:label 编码,字符串“_MM” 可以使用 mm:append 函数追加到生成的标签,如下所示:

Individual: @A2(mm:append("_MM"))

使用正则表达式提取值

类似的方法可用于有选择地从引用中提取值 细胞。提供了捕获组的正则表达式子句,可以在 值规范条款。此子句包含在带引号的字符串中 用方括号括起来。例如,如果电子表格中的单元格 A5 包含字符串“辉瑞:Zyvox”,但仅包含“:”后面的文本 字符是在标签编码中使用,适当捕获 表达式可以写成:

Class: @A5(rdfs:label=[":(\S+)"])

请注意,正则表达式中的子表达式两边用括号括起来 子句指定捕获组并指示匹配的字符串是 提取。在某些情况下,一个像元值可能匹配多个组, 在这种情况下,将按其顺序提取匹配的字符串 匹配并相互追加。

捕获组还可用于生成文本。例如,如果 电子表格中的单元格 A2 包含人员的名字、中间名首字母和姓氏 由单个空格分隔,三个捕获表达式可用于 有选择地提取每个名称部分并分别将它们分配给不同的 属性如下:

Individual: @A2

Types: Person

Facts: hasForename @A2(["(\S+)"]),

hasInitial @A2(["\S+\s(\S+)"]),

hasSurname @A2(["\S+\s\S+\s(\S+)"])

一个类似的示例,分别从 单元格可以写成:

Individual: @A2

Types: Person

Facts: hasMin @A2(xsd:int ["(\d+)\s+"]),

hasMax @A2(xsd:int ["\s+(\d+)"])

如果 hasMan 和 hasMax 属性的类型为 xsd:int,则 此处不需要明确的限定。

捕获表达式也可以通过 mm:capture 函数调用:

Individual: @A2

Types: Person

Facts: hasForename @A2(mm:capturing("(\S+)")

捕获表达式的语法遵循 Java 模式类支持的语法。

文字

映射主机当前支持以下数据类型:

xsd:string, xsd:boolean, xsd:byte, xsd:short, xsd:int, xsd:long, xsd:float, xsd:double, xsd:integer, xsd:decimal, xsd:dateTime, xsd:date, xsd:time, xsd:Duration, rdf:PlainLiteral, rdf:XMLLiteral

虹膜

映射大师有几个指令来自定义 IRI 创建过程。

命令

解释

毫米:伊里

使用解析的参考值生成 IRI。 如果生成的值不表示有效的 IRI,则会引发错误。

毫米:骆驼案例编码

mm:snakeCaseEncode

mm:uuidEncode

mm:哈希编码

缺失值处理

要处理缺少的单元格值,也可以在 引用。提供了一个默认值子句来分配这些值。这 子句由关键字 mm:DefaultLocationValue、mm:DefaultLiteral、mm:DefaultLabel 和 mm:DefaultID 指示,后跟对字符串的赋值。为 例如,以下表达式使用此子句来指示值 如果单元格 A5 为空,则应使用“未知”作为创建的类标签:

Class: @A5(rdfs:label mm:DefaultLabel="Unknown")

还支持其他行为来处理缺少的单元格值。这 默认行为是跳过整个表达式(如果它包含任何引用) 带有空单元格。提供了四个关键字来修改此行为。这些 关键字表示:

  • 如果缺少单元格值并且应停止映射过程(mm:ErrorIfEmptyLocation)

  • 应跳过包含具有空单元格的引用的表达式(mm:SkipIfEmptyLocation)

  • 包含具有空单元格的引用的表达式除了应被跳过之外,还应生成警告 (mm:WarningIfEmptyLocation)

  • 应处理包含此类空单元格的表达式 (mm:ProcessIfEmptyLocation)。

最后一个选项允许处理可能包含大量 缺失值的数量。该选项指示语言处理器 如果可能,应保守地删除包含 空引用,而不是删除整个表达式。

例如,考虑以下表达式,该表达式声明个人来自 电子表格的单元格 A5 并与之关联属性已老化 使用单元格 A6 中的值:

Individual: @A5

Facts: hasAge @A6(mm:ProcessIfEmptyLocation)

在这里,使用默认的跳过行为操作,单元格 A5 中的缺失值将 导致跳过表达式。但是,过程指令为 单元格 A6 中的 hasAge 属性值将只删除子表达式 如果该单元格为空,则包含它。因此,如果单元格 A5 包含一个值和单元格 A6 为空,生成的表达式仍将声明个人。

使用类似的方法,更细粒度的空值处理也是 支持为 mm:Literal、rdf:ID 和 rdfs:label 值指定不同的空值处理行为。这里 标签指令是mm:ErrorIfEmptyLabel,mm:SkipIfEmptyLabel,mm:WarningIfEmptyLabel和mm:ProcessIfEmptyLabel,RDF标识符具有等效的关键字。 和字面处理。它们是 mm:ErrorIfEmptyID、mm:SkipIfEmptyID、mm:WarningIfEmptyID、mm:ProcessIfEmptyID 和 mm:ErrorIfEmptyLiteral、mm:SkipIfEmptyLiteral、mm:WarningIfEmptyLiteral、 mm:ProcessIfEmptyLiteral。

位置转移

提供了一个附加选项来处理空单元格值。此选项 针对特定单元格所在的许多电子表格中的常见情况 提供一个值,并且它下面的所有空单元格都暗示具有 相同的值。在这种情况下,当处理这些空单元格时,它们的 位置必须移动到其上方包含值的位置。为 例如,以下表达式使用此关键字来指示调用 A5 不包含声明类的名称的值,则包含行 数字必须向上移动,直到找到值:

Class: @A5(mm:ShiftUp)

如果未找到任何值,则应用正常的空值处理处理。 类似的指令提供了下移(mm:ShiftDown),以及 允许向左移动(mm:ShiftLeft)或向右移动 (毫米:右移)。

循环访问引用中的单元格区域

显然,大多数映射不仅会引用单个单元格,还会引用 而是迭代电子表格中的一系列列或行。通配符 然后可以在引用中使用字符“*”来引用当前列 和/或迭代中的行。MappingMaster 提供了一个图形界面来 指定这些范围。(它们将很快在DSL中得到支持。

使用此通配符表示法的示例引用包括:

  • AAR

  • AAK

  • @**

例如,一个表达式,它从网格 D4 迭代到 G6 以创建一个 每个单元格的类个人销售可以写:

Individual: @**

Types: Sale

可以扩展此表达式以将属性值分配给这些 个人:

Individual: @**

Types: Sale

Facts: hasAmount @**,

hasProduct @B*,

hasState @*2

曼彻斯特语法覆盖范围

DSL 不支持整个曼彻斯特语法。当前不支持以下子句:

  • OWL 对象属性声明

  • OWL数据属性声明

  • OWL 注释属性声明

  • OWL 数据类型声明

  • OWL文字类型限定

  • 猫头鹰不相交类

  • OWL等效和不相交性质

  • OWL 负属性断言

  • 猫头鹰有钥匙

配置选项

可以为引用指令指定一组全局默认值。 该语言有许多子句来指定这些默认值。

以下示例说明了如何将这些子句与 当前默认值。

  • mm:默认引用类型当前默认值为类。其他可能的值包括 NamedIndividual、ObjectProperty、DataProperty、AnnotationProperty 和任何 XSD 数据类型。

  • mm:默认属性类型当前默认值为 ObjectProperty。其他可能的值是 DataProperty 和 AnnotationProperty。

  • mm:默认属性值类型当前默认值为 xsd:string 如果我们需要一个(数据或注释)属性值,请使用 xsd:string

  • mm:默认数据属性值类型当前默认值为 xsd:string。其他可能的值包括任何 XSD 数据类型。

  • mm:默认值编码当前默认值为 rdf:ID。其他可能的值是rdfs:Label,mm:Literal和rdfs:Location。

  • mm:默认IRIE编码当前默认值为 mm:CamelCaseEncoding。其他可传递的值包括 mm:NoEncode、mm:NoSnakeCaseEncode、mm:UUIDEncode 和 mm:HashEncode。

  • mm:默认移位设置当前默认值为 mm:NoShift。其他可能的值包括 mm:ShiftUp、mm:ShiftDown、mm:ShiftLeft 和 mm:ShiftRight。

  • mm:默认空位置设置当前默认值为 mm:WarningIfEmptyLocation。

  • mm:默认空文本设置当前默认值为 mm:WarningIfEmptyLiteral。

  • mm:DefaultEmptyRDFIDSetting当前默认值为 mm:WarningIfEmptyRDFID。

  • mm:DefaultEmptyRDFSLabelSetting当前默认值为 mm:WarningIfEmptyRDFSLabel。

  • mm:DefaultIfOWLEntityExistsSetting当前默认值为 mm:ResolveIfOWLEntityExists。

  • mm:DefaultIfOWLEntityDoesNotExistSetting当前默认值为 mm:CreateIfOWLEntityDoesNotExist。

  • mm:默认位置值当前默认值为 “”。

  • mm:默认文本值当前默认值为 “”。

  • mm:DefaultRDFID当前默认值为 “”。

  • mm:DefaultRDFSLabel当前默认值为 “”。

  • mm:默认语言当前默认值为 “”。

  • mm:默认前缀当前默认值为 “”。

  • mm:默认命名空间当前默认值为 “”。

总结

MappingMaster DSL允许从电子表格内容创建OWL公理和实体。 曼彻斯特语法的使用允许这些OWL实体在复杂的中相互关联 方式。

以这种方式以声明方式指定映射有几个 优势。这些映射的写入不需要任何 编程或脚本专业知识。这些映射可以共享 轻松使用MappingMaster GUI,它可以保存和加载映射。这 映射也可以轻松地在不同的 具有相同结构的电子表格。

添加自定义页脚

页脚

© 2023 GitHub, Inc.

页脚导航

来自 <https://github.com/protegeproject/mapping-master/wiki/MappingMasterDSL>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值