1 引言
以前用java做了一个程序,写了很多年,根据条件来推断,入下面的代码。但这个代码并没有什么技术含量,体力活。于是想着能不能通过知识图谱的技术来做推断呢?能不能让传统的子平计算机程序再往前走一步。
@Service("日进角合")
public class JinJiaoHeDayService extends AbstractXchhService {
@Override
protected List<AssertionDto> hanleCaibo(BaZi bazi, SexEnum sex, SectionEnum section, LiuShiJiaZiEnum dayun, LiuShiJiaZiEnum liunian, Integer age) {
AssertionDto assertionDto = null;
List<AssertionDto> assertionDtos = new ArrayList<>();
BookFactory bookFactory = BookFactory.getInstance();
if (age>=16){
assertionDto = AssertionDto.builder()
.assertion("此年成立事业必有成就")
.reason(String.format("%s日%s流年,进角合", bazi.getDay().display(),liunian.display()))
.section(section)
.jx(JiXiongEnum.JI).direction(DirectionEnum.ZP)
.book(bookFactory.getBook(BookEnum.SJFZXCHHTJ,81))
.build();
assertionDtos.add(assertionDto);
}
return assertionDtos;
}
}
2 本体工程
斯坦福大学到这里面去下载protege这个开源知识图谱编辑和本体工程工具。如何构建子平推理的知识图谱呢,有点犯难,因为没有参考,只能按照自己的理解去设计。
2.1 定义class
学习过面向对象的工程师,对这个应该容易理解,类是相似实体的抽象。在enties中定义六十甲子、天干、地支三个class
2.2 定义个体实例
给六十甲子、天干、地支定义个体实例,就是类的实例化。
2.3 定义对象属性
对象属性是实体与实体时间的关系,因此就就可以推论出,有如下的关系定义。最基础的就是下图描述。因为甲乙丙丁是天干实例,子丑寅卯是地支实例,甲子的天干是甲、地支为子,那么前面定义的实例关系就可以建立了。
有一些关系是相同概念,故而设置Equivation To关系。
2.4 添加关系
在对象属性中把与个体相关的关系建立起来。
2.5 查看关系图
3 sparql查询
SPARQL是RDF数据库的标准查询语言,上面定义了本体和关系,如何进行查询呢?这里不去讲sparql的基本语法,因为我懒得把基本语法看一遍,实践就可以推理出来了。
下面是查询某个关系属于哪类子属性,
这是咋知道,为啥这么写呢?rdf设计了一个IRI,同一了标准的资源唯一定位,搞了很长的路径,所以在如果要使用sparql,故而定义了前缀,后面就用缩写就行,否则就写查询语句就很长。
查看保存的rdf文件,就知道了,是咋回事了。