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 ...
随机推荐
- 【matplotlib 实战】--漏斗图
漏斗图,形如"漏斗",用于展示数据的逐渐减少或过滤过程.它的起始总是最大,并在各个环节依次减少,每个环节用一个梯形来表示,整体形如漏斗.一般来说,所有梯形的高度应是一致的,这会有助 ...
- pkg-config手册
定义 pkg-config是一款用于返回已安装库元信息的工具: (语法)概要 pkg-config [--modversion] [--help] [--print-errors] [--silenc ...
- 数据库系列:InnoDB下实现高并发控制
数据库系列:MySQL慢查询分析和性能优化 数据库系列:MySQL索引优化总结(综合版) 数据库系列:高并发下的数据字段变更 数据库系列:覆盖索引和规避回表 数据库系列:数据库高可用及无损扩容 数据库 ...
- .Net8 Blazor 尝鲜
全栈 Web UI 随着 .NET 8 的发布,Blazor 已成为全堆栈 Web UI 框架,可用于开发在组件或页面级别呈现内容的应用,其中包含: 用于生成静态 HTML 的静态服务器呈现. 使用 ...
- HDL刷题:Edgedetect
原题链接 一道想了好久的题目,在这种并行执行的程序里怎么才能保存前一个状态,看了题解后才发觉,非阻塞赋值啊,代码如下: module top_module ( input clk, input [7: ...
- 2020年第十一届蓝桥杯第二场C/C++ B组省赛题解
2020年第十一届蓝桥杯C/C++ B组省赛题解 试题A:门牌制作 [问题描述] 小蓝要为一条街的住户制作门牌号. 这条街一共有 \(2020\) 位住户,门牌号从 \(1\) 到 \(2020\) ...
- 发现AI自我意识:从理解到思维
广义"理解"已经实现 在最新的人工智能系统中,我们经常可以观察到一种类似"理解"的能力.这种广义的"理解"能力,主要建立在两个基础之上:海量 ...
- 大立科技DM63红外相机SDK开发Ⅱ-获取仪器红外图像
目录 1.开发准备 2.导入头文件 3.数据初始化 4.获取红外图像 5.关闭红外图像 6.完整代码 1.开发准备 为了方便发开,需要下载Visual Studio,本开发基于Visual Studi ...
- 一次显著的性能提升,从8s到0.7s
前言 最近我在公司优化了一些慢查询SQL,积累了一些SQL调优的实战经验. 我之前写过一些SQL优化相关的文章<聊聊SQL优化的15个小技巧>和<explain | 索引优化的这把绝 ...
- 什么是物理信息系统(cps)?
物理信息系统(Cyber-Physical Systems,简称CPS)是由计算机.网络和物理组件相互交互的智能系统.它集成了实时计算.通信网络和物理过程控制,以提供智能化的感知.决策和执行功能. C ...