Page 270 - 《软件学报》2025年第12期
P. 270

杨建喜 等: 多语义视图驱动的        OWL  知识图谱表示学习方法                                          5651



                                             Range(helis : hasNutrient) = helis : Nutrient            (2)
                    例如公式    (1)、(2) 所示, HeLis 本体中对象属性   helis : hasNutrient 同时存在复杂定义域声明:  helis : Food ∪helis :
                 Meal, 以及简单值域声明:     helis : Nutrient. 当算法  1  中第  2  行循环到该对象属性后, 首先通过复杂定义域      SPARQL
                 查询  (如代码  1  所示) 和复杂值域    SPARQL  查询获取定义域概念集合以及值域概念集合, 复杂值域                 SPARQL  只需
                 将   rdfs : domain 替换为  rdfs : range 即可. 其次, 由于复杂定义域或值域  SPARQL  查询无法查询到简单值域或定义
                                                                               len(C range ) = 0, 那么将满足算法  1
                 域概念声明, 因此当前对象属性无法查询到              helis : Nutrient, 即  len(C domain ) , 0 但
                 中第  4  行判断语句, 不满足第     7  行判断语句, 则在第    5  行通过简单值域    SPARQL  查询  (如代码  2  所示) 重新获取简
                 单值域概念集合, 简单定义域          SPARQL  查询只需替换     rdfs : range  为  rdfs : domain  即可. 最后则需通过算法  1  第
                 10–14  行循环定义域、值域集合生成映射结果, 具体三元组如公式                 (3) 和公式  (4) 所示.

                                           ⟨helis : Food,helis : hasNutrient,helis : Nutrient⟩        (3)

                                           ⟨helis : Meal,helis : hasNutrient,helis : Nutrient⟩        (4)
                    OWL2Vec*方法为了能够综合利用本体中的公理信息、词汇信息以及图结构信息等, 同时使用                           Word2Vec 词嵌
                 入模型, 采用本体映射的方法将本体中的上述信息抽取出来成为一个语料库, 然后使用                          Word2Vec 进行训练获取实
                 体和关系嵌入. 当     OWL2Vec*本体映射方法在使用代码          1  复杂  SPARQL  查询某一对象属性的     domain  或  range 时,
                 若其是由原子概念构成, 则会无法获取当前             domain  或  range, 造成当前三元组信息抽取失败, 导致语义信息的丢失.
                 然而, 通过改进后的算法       1  可以有效避免该情况, 当无法通过代码          1  获取到查询结果时, 则会触发判断语句重新获取
                 由原子概念构成的      domain  或  range, 最后将新生成的三元组信息添加至三元组集合           P, 补充原来丢失的语义信息.
                    算法  2  描述了数据属性值域字面量数据类型语义映射算法.

                 算法  2. 数据属性值域字面量数据类型语义映射算法.

                 输入: 本体  O 中数据属性集合      R d ⊏ R;
                 输出: 映射后的三元组集合        Q.

                 1.  Q ← Initialize(·); //初始化一个空集合
                 2. for  r d ∈ R d  do //循环处理数据属性
                 3.   C domain_s ,C range_s ← 分别执行  SPARQL  查询语句获取  r d  的简单定义域和简单值域语义声明
                 4.   C domain_c ← 执行  SPARQL  查询语句获取  r d  的复杂定义域语义声明
                 5.   C domain ← C domain_s ∪C domain_c  //同时获取  r d  的简单定义域和复杂定义域语义声明
                 6.  for  c domain ∈ C domain  do
                 7.   for  c range ∈ C range_s  do
                 8.     Q.add((c domain ,r d ,c range )); //循环添加结果至三元组集合
                 9.   end for
                 10.  end for
                 11. end for
                 12. return  Q

                 代码  3. 数据属性简单定义域      SPARQL  查询示例.

                 1. SELECT DISTINCT  ?d
                 2. WHERE


                 3. {  helis : amountOfEnergy rdfs : domain ?d
                 4. FILTER (isIRI( ?d)) }
   265   266   267   268   269   270   271   272   273   274   275