摘要:在语义网等图模型中,遵循开放世界假设,对于数据中未包含的事实,都认为是未知的而非假的。

本文分享自华为云社区《图数据库对 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为:

<label name="movie"><properties><property name="ChineseName" cardinality="single" dataType="string"/><property name="Year" cardinality="single" dataType="int"/> </properties>
</label>
<label name="user"><properties><property name="Gender" cardinality="single" dataType="enum" typeNameCount="2" typeName1="F" typeName2="M"/><property name="School" cardinality="single" dataType="string"/><property name="Age" cardinality="single" dataType="int"/></properties>
</label>
<label name="rate"><properties> <property name="Datetime" cardinality="single" dataType="date"/><property name="Score" cardinality="single" dataType="double" /></properties>
</label>  

导入的点数据为:

张三,user,M,清华大学
李四,user,,北京大学,20
小明,user,,,21
Titanic,movie,泰塔尼克号,1997

导入的边数据为:

张三,Titanic,rate,,4

调用GES原生API接口进行边查询:

GET http://{SERVER_URL}/ges/v1.0/{project_id}/graphs/{graph_name}/edges/detail? source=张三&target=Titanic

得到结果:

"edges": [{"index": "0","source": "张三","label": "rate","properties": {"Score": [4.0],"Datetime": [null]},"target": "Titanic"}
]

可以看到,查询到的边的 Datetime 的属性值是 null , 这是因为该属性字段输入时是空白字段。

另外,GES 支持 Gremlin 和 Cypher 两种主流的图查询语言,下面我们通过 Cypher 验证文章开始时提出的问题。

分别进行以下三个查询:

match (n:user) where n.School='清华大学' return n
match (n:user) where n.School<>'清华大学' return n
match (n:user) where n.School is null return n

得到的查询结果分别为:

"row": [{"School": "清华大学","Gender": "M","Age": null}
],
"meta": [{"id": "张三","type": "node","labels": ["user"]}
]"row": [{"School": "北京大学","Gender": null,"Age": 20}
],
"meta": [{"id": "李四","type": "node","labels": ["user"]}
]"row": [{"School": null,"Gender": null,"Age": 21}
],
"meta": [{"id": "小明","type": "node","labels": ["user"]}
]

当 n.School 为 null 时,n.School<>'清华大学' 和 n.School='清华大学' 的返回值都是非 true,所以小明未在前两个查询的结果集中。这背后是GES Cypher支持的三值运算逻辑,这套逻辑支撑起了文章开始时所述的查询,也遵循了语义网等模型的开放世界假设。

点击关注,第一时间了解华为云新鲜技术~

8种图数据库对 NULL 属性值支持情况相关推荐

  1. 【数据库】7种图数据库简单比较

    文章目录 1. 图数据库排名 2. 图数据库比较表格 3 .各种图数据库属性 3.1 Neo4j(主流) 3.2 OrientDB(不推荐) 3.3 ArangoDB(不推荐) 3.4 JanusGr ...

  2. 图数据库中的空间值——实现图数据库内容在地理坐标系下展现

  3. Java比较两个对象属性值变化情况,用于记录日志使用

    2019独角兽企业重金招聘Python工程师标准>>> public class LogUtils<T> {/*** 对象比较器* 比较结果eg:1.字段名称loginN ...

  4. 【图数据库】史上超全面的Neo4j使用指南

    转自:https://cloud.tencent.com/developer/article/1336299 在这篇文章中: 第一章:介绍 Neo4j是什么 Neo4j的特点 Neo4j的优点 第二章 ...

  5. neo4j 图数据库初步调研 图数据库与关系型数据库差异-f

    相关文章 neo4j 图数据库初步调研 三元组.属性图.图模型.超图.RDF demo项目(python+vue) 本文目录 相关文章 一.技术关键字 二.前言 三.图数据库与传统数据库 1.反规范化 ...

  6. Neo4j图数据库从入门到精通

    add by zhj: 转载时,目录没整理好,还会跳转到原文 其实RDB也可以存储多对多的关系,使用的是中间表,GDB使用的是边,RDB中的实体存储在数据表,而GDB存储在节点.两者使用的底层技术不同 ...

  7. 图数据库Neo4j实战(全网最详细教程)

    1.图数据库Neo4j介绍 1.1 什么是图数据库(graph database) 随着社交.电商.金融.零售.物联网等行业的快速发展,现实社会织起了了一张庞大而复杂的关系网,传统数据库很难处理关系运 ...

  8. 分布式图数据库在贝壳的应用实践

    导读:你想知道百亿级图谱如何实现毫秒级查询吗?社区众多的图数据库中如何才能挑选到一款适合实际应用场景的图数据库呢?贝壳找房的行业图谱480亿量级的三元组究竟是如何存储的呢?本文将带你探索上述问题并从中 ...

  9. Neo4j图数据库学习笔记

    Neo4j图数据库 数据库安装 下载安装包 https://neo4j.com/artifact.php?name=neo4j-community-4.1.1-windows.zip 解压 bin:数 ...

最新文章

  1. Matlab与线性代数 -- 矩阵的重组3
  2. CircleDisplay
  3. 5 Handler与子线程
  4. CF-557 E. Ann and Half-Palindrome(暴力Trie)
  5. java文件重命名有趣实验
  6. 查找一:C++静态查找
  7. Python花式编程案例集锦(9):sorted()函数中消失的cmp参数
  8. SpringMVC ------使用POJO对象绑定请求参数值
  9. 2、单机运行环境搭建之 --CentOS-6.5安装配置Tomcat8
  10. python和c++哪个好-C#、C++、Java、Python 选择哪个好?
  11. Python pip windows安装
  12. 在linux下运行锐捷客户端,锐捷Linux客户端使用方法(基于ubuntu16.04)
  13. 在Android Studio 中使用Assets资源文件
  14. eXo Platform 3.0访谈
  15. 如何利用语音评测技术设计英语口语选择题
  16. NTSC色域(CIE1931)计算公式
  17. 微动开关技术知识-微动开关概要
  18. GWAs——全基因组关联分析流程
  19. 基于控制的角度无人机集群——避障(有源代码)
  20. 天龙八部服务端数据传递

热门文章

  1. Bootstrap3 模态对话框的方法
  2. Bootstrap 高亮某个菜单项
  3. CSS 单词间距 word-spacing属性
  4. html label标签 ie6,IE6 IE7 IE8三大浏览器的CSS兼容速查表
  5. ufei pe安装linux,制作UEFI(64位)下的WinPE + Ubuntu + Acronis多启动U盘
  6. jdbc连接mysql数据库过程_jdbc连接数据库的步骤
  7. python读取指定行到最后一行_python读取文件最后一行两种方法
  8. DB2新建编目及删除编目
  9. [Python] Marshmallow QuickStart
  10. 第六章 图像识别与卷积神经网络