8 种图数据库对 NULL 属性值支持情况
摘要:在语义网等图模型中,遵循开放世界假设,对于数据中未包含的事实,都认为是未知的而非假的。
本文分享自华为云社区《图数据库对NULL 属性值支持情况》,原文作者:你好_TT 。
NULL(空值)是数据库中对数据属性未知或缺失的一种标识,用于指示数据库中不存在的数据值。当图数据库中图数据的某个节点或边的属性值缺失或未定义时,该属性值即为 NULL。
那么为什么图数据库需要支持 NULL 值呢?
在语义网等图模型中,遵循开放世界假设,对于数据中未包含的事实,都认为是未知的而非假的。例如对于一个包含若干学生的图数据库,有如下两条查询:
查询一:找出大学在清华大学的人
查询二:找出大学不在清华大学的人
如果图数据库中的小明同学没有填写学校,那么小明是属于查询一的结果集,还是属于查询二的结果集。开放世界假设认为,未包含的数据是未知的而非虚假,在这个逻辑的支撑下,小明既不属于查询一的答案,也不属于查询二的答案。
图数据库,通过 NULL 值实现这一逻辑。
下面我们来看看各图数据库对 NULL 属性值的支持情况。
GDB
对于字符串这种数据类型,支持长度为零的空字符串,表示为:””,不使用双引号的空白域表示不存在,为 nullptr。
NebulaGraph
默认情况下,插入点或边时,属性值可以为 NULL ,用户也可以设置属性值不允许为 NULL (NOT NULL),即插入点或边时必须设置该属性的值,除非创建属性时已经设置默认值。
HugeGraph
可以指定一些字符串代表空值,比如"NULL",如果该列对应的顶点/边属性又是一个可空属性,那在构造顶点/边时不会设置该属性的值。
Amazon Neptune
允许输入空白字段,一个空白字段被认为是一个 NULL 值。
Neo4j
在 Cypher 中,NULL 用于表示缺失或者未定义的值。从概念上讲,NULL 意味着缺失的未知的值,它的处理方式与其他值的处理方式略有不同。
Gremlin
TinkerGraph 可以配置为支持 NULL 作为属性值,但并不是所有的图数据库产品都支持。所以在使用之前请务必检查 supportsNullPropertyValues()的功能或查看说明文档。
TigerGraph
不支持 NULL 和 NOT NULL 属性。图数据库中不支持 NULL 这个值。如果在创建顶点或边实例时未为属性赋值,则以该数据类型的默认值为该属性赋值,最新版本已经废除这条。
华为云图引擎服务 GES
支持 NULL 属性值。当输入空白字段时,认为该属性值为 NULL。
下面举例说明,假设导入数据的 schema 为:
导入的点数据为:
导入的边数据为:
调用 GES 原生 API 接口进行边查询:
得到结果:
可以看到,查询到的边的 Datetime 的属性值是 null , 这是因为该属性字段输入时是空白字段。
另外,GES 支持 Gremlin 和 Cypher 两种主流的图查询语言,下面我们通过 Cypher 验证文章开始时提出的问题。
分别进行以下三个查询:
得到的查询结果分别为:
当 n.School 为 null 时,n.School<>'清华大学' 和 n.School='清华大学' 的返回值都是非 true,所以小明未在前两个查询的结果集中。这背后是 GES Cypher 支持的三值运算逻辑,这套逻辑支撑起了文章开始时所述的查询,也遵循了语义网等模型的开放世界假设。
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/09a5db4552f820bb099d8d11a】。文章转载请联系作者。
评论