基于亲属图谱的关系推理
程序员文章站
2022-05-18 19:14:51
...
有朋友提到一个亲属图谱推理的问题,下面分享一下自己的实现思路,仅供参考。
一、定义推理规则
提前定义一些关系推理规则,比如:
path=(a)<-[:父亲]-(b)-[:姐姐]->(c)
则可以推断出
path=(c)-[:父亲]->(a)
就亲属关系而言这些规则是可以穷举出来的。
二、隐含关系推理
在接口直接输入两个人的ID能得出来他们之间的隐含关系。
- 需要拿出两个人之间的所有路径,而不是最短路径。
- 拿到所有路径之后,每一条路径都是一个有向的输出序列,将所有有向序列整理到列表
- 将定义的规则拿到有向序列列表去匹配,这个匹配结果可能是多个的图谱比较复杂的话可以考虑使用路径扩展过程。路径扩展
- 可以将挖掘出的隐含关系持久化到图谱,也可以生成虚拟图的方式返回。
#参考虚拟图的生成过程
CALL apoc.create.vNode
CALL apoc.merge.vRelationship
- 注意点:在获取路径的时候,可以根据定义的规则路径长度去获取数据。比如:定义的规则路径长度最多为四层,那在获取数据的时候最多获取四层以内全部的路径。
# 1.路径长度和路径序列获取
MATCH (n),(m) WHERE id(n)=544 AND id(m)=1349
MATCH p=(n)-[*..4]-(m) WITH RELATIONSHIPS(p) AS paths,SIZE(RELATIONSHIPS(p)) AS pathSize SKIP 1 LIMIT 1
UNWIND paths AS path
RETURN TYPE(path),pathSize
# 2.路径长度和路径序列获取
MATCH (n),(m) WHERE id(n)=544 AND id(m)=1349
MATCH p=(n)-[*..4]-(m) WITH RELATIONSHIPS(p) AS paths,SIZE(RELATIONSHIPS(p)) AS pathSize SKIP 1 LIMIT 1
RETURN paths,pathSize
# 3.路径长度和路径序列获取
MATCH (n),(m) WHERE id(n)=544 AND id(m)=1349
MATCH p=(n)-[*..4]-(m) WITH RELATIONSHIPS(p) AS paths,SIZE(RELATIONSHIPS(p)) AS pathSize SKIP 1 LIMIT 1
UNWIND paths AS path
RETURN TYPE(path),ID(startNode(path)),ID(endNode(path)),pathSize
# 4.使用LENGTH函数获取路径长度
MATCH (n),(m) WHERE id(n)=544 AND id(m)=1349
MATCH p=(n)-[*..4]-(m) WITH RELATIONSHIPS(p) AS paths,LENGTH(p) AS pathSize SKIP 1 LIMIT 1
UNWIND paths AS path
RETURN TYPE(path),ID(startNode(path)),ID(endNode(path)),pathSize
三、通过算法插件进行隐含关系推理
上述方法是先获取所有路径再匹配的方式,还有一种方式是直接通过遍历算法去控制获取的路径。这个方法比较高效。定义路径遍历的算法插件,遍历规则使用自己定义的规则,关系有序遍历,并且节点只经过人物类节点。