Cypher是一种声明式图查询语言,表达高效查询和更新图数据库。
例子:声明式编程是一种编程范式,即构建计算机程序的结构和元素的一种风格,它表达了计算的逻辑而没有描述其控制流程。常用的声明性语言包括数据库查询语言(例如SQL,XQuery),正则表达式,逻辑编程,函数式编程和配置管理系统。命令式编程以明确的步骤实现算法。match 相当于SQL select
cypher查询语言的基本介绍:
match
(node) - [relationship] ->(node)
where
(node | relationship)
return
(node | relationship)
1、实体三元组的写入和去重。
2、实体的融合和对齐
3、补齐属性
在写入前我按照1:4的比例提取了26万多篇文章的100万个三元组集合(因为之前做了测试大概是100篇文章可以提取460条三元组集合)联系运维在服务器上部署好我们组专用的neo4j。
在三元组写入方面,依据每个数据的情况不一样来确定三元组的写入语句。首先用新闻数据来提取三元组,然后查看提取出来的三元组的值的情况,来判断估算重复值的数量。其次采用cypher语句里面的merge 写入三元组的实体写成node。因为merge 有自动去除重复值的功能。 match可以匹配节点,用create unique创建俩俩之间的唯一关系。看图2的 代码。出来的效果如下
在步骤一的基础上来做实体对齐。我做到的是把neo4j里面的子图来做一个小子图谱的自我对齐,如下图4 。
对齐的基本思路:匹配出所有的节点或和关系,拿出来在一个个独立小的子图谱里面做对齐,
对齐步骤1:Levenshtein distance (最小编辑距离),Jaccard 系数,例如:jaccard系数大于0.75就可以证明相似。在本代码中用到的是前面2着相似度的和的平均值。
对齐步骤2在对齐步骤1基础上用cypher 语句进行对齐(就是删除相似度高的关系,或者节点)a:先取出一个个小图谱里面的所有实体,然后用2个for循环嵌入(这里的生成一个矩阵,取矩阵的上半部分的值。看事例图5)。 b:把实体进行俩俩相似度计算,计算出相似度。c:用python结合cypher语句来进行调整图数据库里面的节点和关系。
注意,调整的时候还要判断关系是否一样,如果关系一样可以直接调整删除,如果不一样,还要先把关系调整到另外一个不删除的实体上,然后在删除原先的相似度高的实体和关系。具体如下:
在步骤二的基础上,进行图谱的属性的补全前,还需要考虑一个标准数据的问题。
我仔细查看了一下数据,有一部分数据是在说公司的新闻,而且里面公司信息大部分是上市公司。所以我就结合了公司的redis 里面的company 信息 和 mongodb里面的董高监数据信息来做的实体对齐。
这个是链接redis 信息。
redis_nodes = [1111111
2222222
3333333]
redisconn = StrictRedisCluster(startup_nodes=redis_nodes, decode_responses=True)
但拿到neo4j里面的公司的名称或者短称后,进行于redis里面的公司信息匹配搜索,拿到相对比较全面的信息来补充neo4j里面的公司信息作为其属性进行补全。具体代码如下:
上面的公司信息补全作为属性存入的结果如下
下面是 链接到公司mongodb的董高监数据,目的是获取里面的上市公司的信息,来补全人和公司的关系属性。
onnect1 = MongoClient()
db1 = connect1[]
db1.authenticate(“", "*”)
collect1 = db1.hpd
看上面 图11-图12的例子,关系都是 “监事会主席” ,但是2个人的任职时间不一样。
这个就是来源公司的董高监数据。补全人和公司的属性。