知识储存与查询 ​ 常用的储存方式是RDF,这是一个被用来设计提供一种描述信息的通用方法,如图是一个RDF表示Aristotle的相关信息,包含其相关属性,以及他与其他实体的关系。 不管是属性,还是关系,都可以通过一系列的三元组信息去表示,图示为相关三元组表示信息 针对这些数据,具体的存储方式可以分为以下几种: 三列表储存 使用一些关系数据库用来维护一张巨大的三元组表,将SPARQL查询转换成SQL查询 这种方法的通用性比较好,但是查询的性能很差 水平储存 将知识图谱当中的每个RDF表示为数据库当中的一行,表的列包括RDF当中的所有属性 这种方法设计简单,容易回答面向面向某个主体的属性查询 表非常稀疏造成性能损失,不方便储存一个属性多个值问题,在数据变化的时候会带来很大的变化成本问题 属性表储存 在维护单张大的三元组表的基础上,通过聚类的方式将相似的三元组聚类,将每个聚类的三元组统一到一张属性表中进行管理,也可以通过分类的方法维护属性表 全索引 将三元组在主体、属性、客体之间各种排列下能够形成的各种形态枚举构建出来,然后构建相关索引 可能会浪费很多储存空间;复杂的查询需要大量的表连接操作;随着数据量的增大,表的规模不断扩大,性能严重下降 图模型的储存查询 SPARQL的查询可以看作是在数据图上搜索相关的子图 Neo4j图数据库 CQL代表Cypher查询语言,Neo4j使用CQL作为查询语言 常用的Neo4j CQL命令有: 常用的Neo4j CQL函数: Neo4j支持的数据类型: Neo4j 支持的布尔运算符: Neo4j支持的比较运算符: Neo4j支持的字符串函数: Neo4j支持的聚合函数: Neo4j支持的关系函数: CREAT命令 用来创建没有属性的节点,没有任何的关系与属性 ,命令语法为CREATE (<node-name>:<label-name>) <node-name>:要创建的节点名称 <label-name>:节点标签名称 用来创建具有属性的节点,命令语法为CREATE (<node-name>:<label-name>{<Property1-name>:<Property1-Value>…….}) 从单个标签到关系,命令语法CREATE (<node1-name>:<label1-name>-[(<relationship-name>:<relationship-label-name>)]->(<node2-name>:<label2-name>)) MATCH命令 用来从数据库中获取节点、属性、关系的数据,命令语法MATCH (<node-name>:<label-name>) RETURN命令 检索节点的某些属性、所有属性、关联关系的某些属性,命令语法RETURN <node-name>.<property-name>,…….<node-name>.<propertyn-name> WHERE子句 用来过滤MATCH查询结果 WHERE <condition> WHERE <condition> <boolean-operator> <condition> <condition>语法:<property-name> <comparison-operator> <value> <property-name>: 节点或关系的属性名 <comparison-operator>: 比较运算符 DELETE删除 删除节点和关联关系,命令:DELETE <node-name-list> REMOVE删除 删除标签和属性,命令:REMOVE <property-name-list> SET子句 向现有的节点或关系添加新属性,命令:SET <property-name-list> ORDER BY子句 对返回结果进行排序,命令:ORDER BY <property-name-list> [DESC] UNION UNION子句:将两组结果中的公共行合并返回到一组结果当中,不从两个节点返回重复行 UNION ALL子句:结合并返回两个结果所有行成一个单一的结果集,还返回由两个节点的重复行 LIMIT 用来限制返回的行数,修剪查询结果底部的结果,命令: LIMIT <number> SKIP 用来限制返回的行数,修剪查询结果顶部的结果,命令:SKIP <number> MERGE合并 用来创建节点,关系,属性 MERGE (<node-name>:<label-name> {<Property-name>:<Property-Value>}) 完成了创建节点,查询所有相关配置节点信息并返回