估计阅读时长: 3 分钟

https://github.com/xieguigang/graphQL

构建一个图数据库,可以用来帮我们解决复杂的知识关联计算问题。例如我们想要程序向我们回答dihydrogen oxidewater是否是同一个东西。如果光从字符串比较角度上面来看待这个问题的话,很显然,二者的字符串比较结果肯定是False。面对上面的这个问题,图数据库则可以很简单的向我们回答道上面的两个字符串都是指代的同一个东西。

在日常的工作之中,例如我们想要将多个数据库整合为一个大的知识库。那在这个数据整合的过程之中,就会不可避免的出现诸如上面所提及的同义词的问题。同义词的问题在处理生物学数据库整合的过程之中是非常常见的:例如某一种代谢物在不同的数据库之间可能就会存在有不同的称呼名字,或者代谢物的名字在不同的数据库之间的大小写有差别。碰到诸如此类的同义词的问题,如果只采用简单的字符串比较计算的话,将会给我们的数据库整合结果引入非常多的错误信息。

所以为了解决上面所提到的信息匹配的问题,我专门构建了用于建立知识网络所需要的图数据库引擎模块,在这里向大家介绍一下。

使用方法示例

如果需要从头开始建立一个知识网络的话。首先,我们需要在python脚本之中导入所编写的图数据库程序包,然后创建出一个新的图数据库用于存储我们的知识网络信息:

import graphQL
kb = MsgFile::open()

之后我们就可以往kb对象里面添加新知识了。在往数据库之中添加新知识之前,我们首先需要来了解一下在这里所需要的知识数据结构是怎样的。在这个数据库之中,知识的模型是一个term关联多个元数据所构成的。每一个元素据对象本身又是另一个知识对象的term,所以依照这个关系,就构建出来一个知识网络。图数据库对象就是基于这个知识网络的数据基础上进行知识判断的回答。

假设我们有这样子的一个键值对信息用来表示一个知识点:

#              key                             value
# ---------------------------------------------------
# <mode>  <string>                          <string>
# [1, ]       "id"                          "C01405"
# [2, ]     "name"                         "Aspirin"
# [3, ]     "name"            "Acetylsalicylic acid"
# [4, ]     "name" "2-Acetoxybenzenecarboxylic acid"
# [5, ]     "name"                "Acetylsalicylate"
# [6, ]  "formula"                          "C9H8O4"

#  [ reached 'max' / getOption("max.print") -- omitted 7 rows ]

则我们可以通过下面的函数将上面的键值对信息处理成向知识网络中添加新知识所需要的数据结构,然后向kb知识库对象中添加新知识:

def process_knowledge(kb, data):
    data = as.list(data, byrow = True)
    data = groupBy(data, x -> x[["key"]])
    data = lapply(data, x -> sapply(x, i -> i[["value"]]), x -> x[["key"]])

    # $id
    # [1]     "C01405"
    #
    # $name
    # [1]     "Aspirin"
    # [2]     "Acetylsalicylic acid"
    # [3]     "2-Acetoxybenzenecarboxylic acid"
    # [4]     "Acetylsalicylate"
    #
    # $formula
    # [1]     "C9H8O4"
    #
    # $xref
    # [1]     "50-78-2"         "PubChem:4594"
    # [3]     "ChEBI:15365"     "CHEMBL25"
    # [5]     "AIN[PDBj]"       "3DMET:B00284"
    # [7]     "NIKKAJI:J2.300K"

    # insert new knowledge term into kb
    Query::insert(kb, data[["id"]], data)

经过不同的知识点对知识网络数据库的insert操作之后,我们就有了进行数据库整合所需要的知识信息了。那现在我们就可以使用save函数来保存我们的知识库数据至MessagePack文件之中,之后呢可以再用open函数进行加载:

# save graph
MsgFile::save(kb, file = "./example.graph")
# load graph
kb = MsgFile::open(`./example.graph`)

XXX是什么

基于上面的代码所构建的知识库,然后我们就可以进行知识信息查询,例如我们想要了解到XXX是什么,则我们可以使用query函数进行查询:

result = Query::query(kb, "Aspirin")
[1]     "Aspirin is the name of C01405 with confidence 1.00"
[2]     "Aspirin is the name of HMDB0001879 with confidence 1.00"
[3]     "Aspirin is the name of ChEBI:15365 with confidence 1.00"

XXX是XXX么

回到这篇文章最开始的一个例子,我们想要程序向我们回答dihydrogen oxidewater是否是同一个东西,或者Aspirin是否是和Acetylsalicylic acid等价。回答一个等价性问题,或者说是回答一个知识对象的相似度问题,我们可以使用similarity函数来进行计算:

Query::similarity(kb, "dihydrogen oxide", "water")
# [1] 0.35

Query::similarity(kb, "Aspirin", "Acetylsalicylic acid")
# [1]  0.740741

Latest posts by 谢桂纲 (see all)

Attachments

No responses yet

Leave a Reply

Your email address will not be published.