lala
1
【问题】
tag A 的属性-createTime 是Datetime类型,业务需要查询某一个日期范围内的数据,只要数据的创建时间符合搜索范围就认为是有效数据,现在使用下面的语句,执行时间耗时1.X秒(图空间当前数据 95k条数据),想问问还有没有什么方法可以优化?
MATCH (v: A) WHERE date(toString( v.createTime )) >= date(XXXX) and date(toString( v.createTime)) RETURN v
- nebula 版本:
- 部署方式:分布式
- 安装方式:RPM
- 是否为线上版本:Y
- 硬件信息
wey
2
不转换直接比呢,时间类型数字底层是数字的,直接可比较。
虽然您这里只关心日期,可以把时间换成某一个时区的 0 时,这省去了你现在写法里的 toString() 再 date()
CREATE TAG IF NOT EXISTS school(name string , found_time timestamp);
CREATE TAG INDEX date_index on school(found_time);
(root@nebula) [basketballplayer]> INSERT VERTEX school(name, found_time) VALUES "DUT":("DUT", timestamp("1988-03-01T08:00:00"));
Execution succeeded (time spent 6964/9980 us)
Wed, 17 Nov 2021 07:49:06 UTC
(root@nebula) [basketballplayer]> INSERT VERTEX school(name, found_time) VALUES "foo":("foo", timestamp("1998-04-01T08:00:00"));
Execution succeeded (time spent 5790/9676 us)
Wed, 17 Nov 2021 07:49:11 UTC
(root@nebula) [basketballplayer]> INSERT VERTEX school(name, found_time) VALUES "bar":("bar", timestamp("2000-04-01T08:00:00"));
Execution succeeded (time spent 5855/8444 us)
Wed, 17 Nov 2021 07:49:15 UTC
(root@nebula) [basketballplayer]> MATCH (v: school) WHERE v.found_time > timestamp("1998-04-01T08:00:00") return v
+-----------------------------------------------------+
| v |
+-----------------------------------------------------+
| ("bar" :school{found_time: 954576000, name: "bar"}) |
+-----------------------------------------------------+
Got 1 rows (time spent 33992/39306 us)
Wed, 17 Nov 2021 07:49:54 UTC
1 个赞
lala
3
原始数据是从其他平台集成过来的,所以存储到数据库的时候需要跟原始数据保持一致,请问还有其他方法吗?
wey
4
您的情况是 schema 里日期存成了 string,如果是 string的话也不需要 toString(),直接 date() 就够了吧?
另外如果是的话“集成的过程中”为什么做不到把它存成 datetime 么?
lala
5
集成的时候已经存成dateTime类型了,但是 datetime类型不能直接转成date,所以需要先转成string,再转date
只需要比较日期,具体的时间不用比较
wey
6
嗯嗯,那直接和这个日期作比较就可以了哈,比如你关心的是 GMT + 8 的,和 1998-04-01
就是和 timestamp("1998-04-01T08:00:00")
比较
lala
7
要过滤的时间范围是接口A从图数据库里面查询的,然后作为接口B的入参 作为查询周期过滤条件的
wey
8
ok,过滤范围是这个形式的对吧 "2021-11-18"
在 query 里以 concat 起来,,比如是8时区,就用 timestamp转换成了 datetime,就可以直接比了,就省去了对 v.createTime 的批量转换了。
(root@nebula) [basketballplayer]> return timestamp((concat("2021-11-18","T08:00")))
+------------------------------------------+
| timestamp(concat("2021-11-18","T08:00")) |
+------------------------------------------+
| 1637222432 |
+------------------------------------------+
Got 1 rows (time spent 831/2560 us)
lala
10
过滤范围是这个形式: “2021-11-18T18:00:00.123”
wey
11
那更好办了,直接用 timestamp 就可以和v.createTime 作比较了:
(root@nebula) [basketballplayer]> return timestamp(("2021-11-18T18:00:00.123"))
+--------------------------------------+
| timestamp("2021-11-18T18:00:00.123") |
+--------------------------------------+
| 1637258400 |
+--------------------------------------+
Got 1 rows (time spent 1248/5335 us)
(root@nebula) [basketballplayer]> MATCH (v: school) WHERE v.found_time > timestamp("1998-04-01T08:00:00.123") return v
+------------------------------------------------------------------------------------------------------+
| v |
+------------------------------------------------------------------------------------------------------+
| ("bar" :school{found_time: 954576000, name: "bar"}) |
| ("player100" :school{found_time: 954576000, name: "player100"} :player{age: 42, name: "Tim Duncan"}) |
+------------------------------------------------------------------------------------------------------+
Got 2 rows (time spent 11175/15701 us)
Thu, 18 Nov 2021 14:53:23 UTC
system
关闭
12
此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。