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为:
<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 属性值支持情况的更多相关文章
- 41-ssm中对象查找正确但是没有将数据库中某个属性值赋给对象的一个成员变量
原因: 变量名虽然与 数据库字段一致,但是 包含下划线,如: a_b,数据库确实也是a_b: 但是ssm开启驼峰命名了,就要将变量名改为 aB , 驼峰命名就可以了.
- 一种struts标签取不到值的情况
编写一个网页,使用<s:date >标签将日期格式化,使用了多组数据一直没有问题,突然在一组数据上死活出现不了数据了.程序如下 <s:iterator value="art ...
- 分布式图数据库 Nebula Graph 的 Index 实践
导读 索引是数据库系统中不可或缺的一个功能,数据库索引好比是书的目录,能加快数据库的查询速度,其实质是数据库管理系统中一个排序的数据结构.不同的数据库系统有不同的排序结构,目前常见的索引实现类型如 B ...
- Neo4j图数据库从入门到精通
目录 第一章:介绍 Neo4j是什么 Neo4j的特点 Neo4j的优点 第二章:安装 1.环境 2.下载 3.开启远程访问 4.启动 第三章:CQL 1.CQL简介 2.Neo4j CQL命令/条款 ...
- Neo4j图数据库从入门到精通(转)
add by zhj: 转载时,目录没整理好,还会跳转到原文 其实RDB也可以存储多对多的关系,使用的是中间表,GDB使用的是边,RDB中的实体存储在数据表,而GDB存储在节点.两者使用的底层技术不同 ...
- 【图数据库】史上超全面的Neo4j使用指南
转自:https://cloud.tencent.com/developer/article/1336299 在这篇文章中: 第一章:介绍 Neo4j是什么 Neo4j的特点 Neo4j的优点 第二章 ...
- Neo4j图数据库使用
最近在处理一些图的数据,主要是有向图,如果图的节点不是特别大可以直接加载到内存里来处理,但是当图的节点个数特别大时,内存就放不下了:我 们牵涉到的图的节点数最大可以达到数亿个节点,已经超出的机器内存的 ...
- ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积02, 在界面实现
在"ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现"中,在控制台应用程序中实现了属性值的笛卡尔乘积.本篇在界面中实现.需要实现的大致如下: 在界面 ...
- 高性能内存图数据库RedisGraph(一)
作为一种简单.通用的数据结构,图可以表示数据对象之间的复杂关系.生物信息学.计算机网络和社交媒体等领域中产生的大量数据,往往是相互连接.关系复杂且低结构化的,这类数据对传统数据库而言十分棘手,一个简单 ...
- 使用mybatis如果类属性名和数据库中的属性名不一样取值就会为null
使用mybatis时如果类属性名和数据库中的属性名不一样取值就会为null 这是不能再去改变javabean中的属性,只能改变sql语句.语句如下所示: <select id="sel ...
随机推荐
- hammer.js学习
demo:https://github.com/fei1314/HammerJs/tree/master 知识点: hammer--手势识别:点击.长按.滑动.拖动.旋转.缩放 方法: tap 快速的 ...
- Vue之属性
Vue中的属性:举例 看一下就明白了 <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- GameFramework摘录 - 1. ReferencePool
GameFramework是一个结构很优秀的Unity游戏框架,但意图似乎在构建可跨引擎的框架?对要求不高的小型个人(不专业)开发来说有些设计过度了,但其中的设计精华很值得学习. 首先来说一下其中的R ...
- django 国际化
参考文档: https://docs.djangoproject.com/zh-hans/2.2/topics/i18n/translation/ https://blog.csdn.net/qq_3 ...
- Error running 'TestAlterNickname.test': Command line is too long. Shorten command line for TestAlterNickname.test or also for JUnit default configuration
问题描述 如图IDEA报错问题,发生在我用JUnit进行测试时. 解决方法 1. 直接点击 default 2. Modify options -> Shorten command line 3 ...
- Net 高级调试之七:线程操作相关命令介绍
一.简介 今天是<Net 高级调试>的第六篇文章.上一篇文章我们说了值类型,引用类型,数组等的内存表现形式.有了这个基础,我们可以更好的了解我们的程序在运行时的状态,内存里有什么东西,它们 ...
- 免费领取Python学习资料
话不多说,直接上Python学习资料 QQ·群: 894692354(不单独一一发了,要的人太多,实在忙不过来)
- 2021 ICPC济南 J Determinant
题意就是给定一个矩阵,然后给出他的行列式的绝对值,这个值是精确的,然后让我们判断行列式的正负. 思路来源:一个Acmer 首先做这个题要明白一个性质才可以做,一个数和它的相反数对一个奇数的取模一定不同 ...
- 栈与队列应用:逆波兰计算器(逆波兰表达式;后缀表达式)把运算符放到运算量后边 && 中缀表达式转化为后缀表达式
1 //1.实现对逆波兰输入的表达式进行计算如(2-1)*(2+3)= 5 就输入2 1 - 2 3 + * //先把2 1 压栈 遇到-弹栈 再把2 3压进去 遇到+弹栈 最后遇到*弹栈 2 //2 ...
- 6k Star!B站、滴滴、小红书都在用的网站防火墙
你有网站么?你担心网站被黑客攻击么?你知道如何抵御来自黑客的攻击吗? 据称互联网上有 30% 的流量都来自于恶意攻击.做过 Web 开发或者有过建站经验的朋友对 SQL 注入.CC 攻击.XSS.We ...