最新要闻
- 当前热讯:成功展商要点——2023第十二届北京国际汽车制造业博览会
- 环球即时:传音Tecno Camon 20系列发布:五边形镜组极具辨识度
- 当前资讯!《斗罗大陆双神战双神》首个场景秀公开:虚幻5打造 画面逼真
- 这就很尴尬 男子高速电话指导女友开车 结果自己撞了
- 世界看点:4699元起 九号智能电动车小Q发布:新国标、能跑95km
- 一图看懂联发科旗舰新U天玑9200+:CPU/GPU性能提升10%、功耗更低了
- 环球看点!男童喉咙长菜花样肿块确诊感染HPV
- 2023年梅花金银兔纪念币价格(2023年05月10日)_世界快资讯
- 仅7999元!Redmi MAX 90英寸巨屏电视开售:百级分区、144Hz高刷 即时焦点
- 每日热议!亏电百公里油耗3.9升 比亚迪驱逐舰07申报:凯美瑞、雅阁瑟瑟发抖
- 保时捷718上新款 157.8万元起!真心无法抗拒 全球简讯
- 环球快看点丨悦达起亚被曝管理岗轮休 一休就一年!官方回应
- 中国电信在科技创新中加速释放消费活力 每日聚焦
- 黄道十二宫是什么意思?黄道十二宫是哪个文明首先提出的?
- 每日看点!98年浙大女学霸曾被视为格力接班人 孟羽童称靠别人永远不如靠自己
- 金锣玉米热狗香肠20袋到手19.9元:新鲜美味 当前短讯
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
基于华为云图引擎GES,使用Cypher子查询进行图探索
摘要:本文以华为云图引擎 GES 为例,来介绍如何使用图查询语言 Cypher 表达一些需要做数据局部遍历的场景。
本文分享自华为云社区《使用 Cypher 子查询进行图探索 -- 以华为云图引擎 GES 为例》,作者:蜉蝣与海。
在图数据库 / 图计算领域,很多查询可以使用图查询语言 Cypher、Gremlin 或者指令式 API 进行表达,如多跳过滤、全局检索以及对过滤后的结果进行聚集排序等操作。然而有些查询不是那么容易表达,常常需要对图中的一组数据去做局部遍历,例如在社交网络(人 - 人,人 - 兴趣,人 - 工作地的关联网络)场景中,常常涉及以下场景:
【资料图】
- 朋友推荐:看看小明的朋友的朋友中,哪些不是小明的朋友,进而推荐给小明。
- 潜在二度人脉分析:选取一组点,每个点代表一个人,在他们朋友的朋友中,统计他们各自有多少不认识的男性朋友和女性朋友。
- 兴趣推荐 A:兴趣爱好也是社交网络中的点,看看小明的朋友有哪些兴趣爱好(人 - INTEREST - 兴趣),从每个朋友的兴趣爱好中选取至多 N 个兴趣爱好推荐给小明。
- 兴趣推荐 B:看小小明有哪些朋友还没有录入兴趣爱好,允许小明把自己的兴趣爱好推荐给他们。
这些查询往往只关注图中的某个局部,对局部进行多跳查询,且局部上往往有类似下列限制:
- 数量限制:例如兴趣推荐 A 场景中,限制了每个朋友的兴趣数目,而不是总数目。
- 条件限制:例如朋友推荐场景中,“哪些不是小明的朋友” 需要先查询小明和朋友的朋友间有没有边,并将结果作为查询条件输入。
在查询语言 Cypher 中,常常使用子查询来解决这类问题。本文会以华为云图引擎 GES 为例(图引擎版本 >=2.3.6),来介绍如何使用 Cypher 表达上述场景。
注:本文同步发布至华为云 AI Gallery,文中所有代码皆可以在AI Gallery上运行:【AI Gallery】使用Cypher子查询进行图探索 – 以华为云图引擎GES为例。
阅读前准备
基础知识
阅读前需要了解如下基础知识
- Cypher查询语言的基本结构:
- 关于Cypher样例语句,可以参考:图引擎服务帮助文档-业务面API-Cypher-基本操作和兼容性
- 关于Cypher的文法说明,可以参考openCypher 9官方页面。
- Cypher的列表表达式:
- 华为云图引擎GES支持的列表表达式,可以参考图引擎服务帮助文档-业务面API-Cypher-支持的表达式,函数及过程
- Neo4j 3.5 Cypher Manual - Lists - List Comprehension
- 对本文中使用到的列表表达式,提前做下述解释:
下方三个小节会指导如何配置一个 GES 实例并使用 notebook 连接 GES 服务进而做查询演示。如果你只想了解如何编写查询语句,对输入的 Cypher 查询获取返回结果没有需求,可以直接跳过下方三个小节。
本文使用的数据集
本教程使用 LDBC-SF0.1 社交数据集中截选的人物关系数据集,数据集可以从此处下载。下载后需要在 GES 中创建图并导入数据集,详细指导流程可参见华为图引擎文档 - 快速入门和华为云图引擎服务 GES 实战 —— 创图。
如何调用 GES 的 Cypher API
GES 官网帮助文档上有 GES Cypher 的 API,为了方便用户调用,API 设计为基于 http/https 请求,响应体的设计也兼容的 neo4j 的 json 格式。这里放置一下链接执行 Cypher 查询。调用 API 时需要将 Token 输入请求头中进行鉴权,有关 Token 的获取问题请参考业务面 API 认证鉴权。
本文会使用 ges4jupyter 工具脚本进行相关查询的演示,该脚本中封装了刚刚提到的鉴权 & Cypher 查询 API,并对结果进行了一些处理,提供了相关可视化的能力。
本文使用的代码包
ges4jupyter 是 jupyter 连接 GES 服务的工具文件。文件中封装了使用 GES 查询的预置条件,包括配置相关参数和对所调用 API 接口的封装,如果你对这些不感兴趣,可直接运行而不需要了解细节,这对理解后续具体查询没有影响。本文的所有语句请求都会访问一个 GES 实例并得到实际的响应。
import moxing as moxmox.file.copy("obs://obs-aigallery-zc/GES/ges4jupyter/beta/ges4jupyter.py", "ges4jupyter.py")mox.file.copy("obs://obs-aigallery-zc/GES/ges4jupyter/beta/ges4jupyter.html", "ges4jupyter.html")
GESConfig 的参数都是与调用 GES 服务有关的参数,依次为 “公网访问地址”、“项目 ID”、“图名”、“终端节点”、“IAM 用户名”、“IAM 用户密码”、“IAM 用户所属账户名”、“所属项目”,其获取方式可参考调用 GES 服务业务面 API 相关参数的获取。这里通过 read_csv_config 方法从配置文件中读取这些信息。如果没有配置文件,可以根据自己的需要补充下列字段。对于开启了 https 安全模式的图实例,参数 port 的值为 443。
from ges4jupyter import GESConfig, GES4Jupyter, read_csv_configeip = ""project_id = ""graph_name = ""iam_url = ""user_name = ""password = ""domain_name = ""project_name = ""port = 80eip, project_id, graph_name, iam_url, user_name, password, domain_name, project_name, port = read_csv_config("cn_north_4_graph.csv")config = GESConfig(eip, project_id, graph_name, iam_url = iam_url, user_name = user_name, password = password, domain_name = domain_name, project_name = project_name, port = port)ges_util = GES4Jupyter(config, True);
首先在 GES 中创建索引,这有利于后续查询加速。
import timedef wait_job_finish(util, job_id, max_loop): job_result = util.get_job(job_id) if "errorCode" not in job_result: for i in range(max_loop): if job_result["status"] == "success": break else: time.sleep(1) job_result = util.get_job(job_id) print(job_result)job_id = ges_util.build_vertex_index()wait_job_finish(ges_util, job_id, 100)job_id = ges_util.build_edge_index()wait_job_finish(ges_util, job_id, 100)
可以使用下列语句查看 schema 信息:
import timebody = ges_util.generate_schema_structure()job_id = body["jobId"]print("开始构造schema结构:")wait_job_finish(ges_util, job_id, 100)print("schema结构构造完成")cypher_result = ges_util.cypher_query("call db.schema()",formats=["row","graph"]);ges_util.format_cypher_result(cypher_result, candidate_title = ["description", "name"])
如图是本文使用的数据集的 schema,主要包括下列类型的点边:
使用子查询
一般来说,使用 Cypher 查询朋友的朋友是相对容易的,下列语句演示了如何查询顶点 p367 朋友的朋友。
match (n)-[:KNOWS]->(a)-[:KNOWS]->(b) where id(n)="p367" return distinct b
然而,使用一般的 Cypher 语义,从朋友的朋友中移除所有的朋友,表达朋友推荐场景中的 “朋友的朋友而非我的朋友” 却很困难。文章如何使用GES进行社交关系考据?—GES查询能力介绍中,描述了一种常规的查询语句的写法:
match (n)-[:KNOWS]->(a) where id(n)="p367" with n, collect(a) as neighbormatch (n)-[:KNOWS]->(a)-[:KNOWS]->(b) where not (b in neighbor)return b
由于 cypher 的结果是使用行(Row)组织数据,所有的计算以 “行” 作为单元进行,如果要进行过滤,只能进行行内过滤。所以上述语句第一步,先通过 collect (a), 将 “朋友” 这个集合组织到了一行里,而后才能将 collect (a) 作为过滤条件,进行二次查询。
将子查询作为查询条件
在 GES 2.3.6 版本,实现了子查询能力,支持 Neo4j 中的 SemiApply 算子,该算子支持类似于下列语句的运行,使得查询更为简洁:
match (n) where id(n)="p367"match (n)-[:KNOWS*2..2]->(b)where not (n)-[:KNOWS]->(b)return id(b) limit 10cypher_result = ges_util.cypher_query("""match (n) where id(n)="p367" match (n)-[:KNOWS*2..2]->(b) where not (n)-[:KNOWS]->(b) return id(b) limit 10""",formats=["row","graph"]);ges_util.format_cypher_result(cypher_result)注意到这里 where 条件后面跟从的不是一个一般的条件表达式,不是大于小于这样的比较运算,在条件运算 not 后跟随了一个图模式(Graph Pattern),整个 where 条件表示 “不存在从顶点 n 连向顶点 b,且 label 为 KNOWS 的边”。这样的表达方式使得整条查询语句看起来更为简洁。也可以使用 explain 查看其查询计划,可以看到是 AntiSemiApply 在发挥作用。这里条件查询主要包含两个算子:
- SemiApply: 用于支撑 “where (n)-[:KNOWS]->(b)” 这样的条件,表示对应的查询模式存在。
- AntiSemiApply:用于支撑 “where not (n)-[:KNOWS]->(b)” 这样的条件,表示对应的查询模式不存在。
这两个算子对每个左子树生成的结果,都去检查右子树是否会 / 不会产生满足条件的结果,并将右子树的结果作为过滤条件,辅助左子树的结果过滤。
通过这两个算子,即可实现简单的条件子查询。
cypher_result = ges_util.cypher_query("""explain match (n) where id(n)="p367" match (n)-[:KNOWS*2..2]->(b) where not (n)-[:KNOWS]->(b) return id(b) limit 10""",formats=["row","graph"]);ges_util.format_cypher_result(cypher_result)
子查询作为条件,也可以用来描述兴趣推荐 B场景:看小小明有哪些朋友还没有录入兴趣爱好,允许小明把自己的兴趣爱好推荐给他们。
match (n:Person) where id(n)="p933" match (n)-[r]->(m) where not (m)-[:HAS_INTEREST]-() return id(m)
将子查询作为中间结果
此外,还可以将子查询作为中间结果,朋友推荐场景下,cypher 语句还可以这么写:
match (n) where id(n)="p367" with [(n)-[:KNOWS*2..2]->(b)|id(b)] as hop2, [(n)-[:KNOWS]->(b)|id(b)] as hop1return [x in hop2 where not x in hop1|x] limit 10
在这条查询语句中,Graph Pattern 出现在了 with 子句中,用于收集某个点的多跳结果。
另外采用类似的写法还可以筛选三度好友中 “我不认识的人” 的数目,示例如下:
match (n) where id(n)="p367" with [(n)-[:KNOWS*3..3]->(b)|id(b)] as hop3, [(n)-[:KNOWS*1..2]->(b)|id(b)] as hop2return size([x in hop3 where not x in hop2|x])cypher_result = ges_util.cypher_query("""match (n) where id(n)="p367" with [(n)-[:KNOWS*3..3]->(b)|id(b)] as hop3, [(n)-[:KNOWS*1..2]->(b)|id(b)] as hop2 return size([x in hop3 where not x in hop2|x])""",formats=["row","graph"]);ges_util.format_cypher_result(cypher_result, boxHeight=200)
同时这种子查询也可以包含子查询过滤条件,进行各类统计操作,如上述提到的潜在二度人脉分析:
match (n:Person) where id(n) in ["p367","p13194139534836","p932","p4398046512206","p6597069767359"] with n, [(n)-[:KNOWS*2..2]->(m) where not (n)-->(m)|m] as recSetreturn id(n) as key, size([x in recSet where x.gender="male"]) as maleNumber, size([x in recSet where x.gender="female"]) as femaleNumbercypher_result = ges_util.cypher_query("""match (n:Person) where id(n) in ["p367","p13194139534836","p932","p4398046512206","p6597069767359"] with n, [(n)-[:KNOWS*2..2]->(m) where not (n)-->(m)|m] as recSet return id(n), size([x in recSet where x.gender="male"]),size([x in recSet where x.gender="female"])""",formats=["row","graph"]);ges_util.format_cypher_result(cypher_result, boxHeight=200)
下列元素出现在 with 子句中,描述了一个子查询:
[(n)-[:KNOWS*2..2]->(m) where some-condition|m] as recSet
这里会对每个遍历到的 n,都进行二跳查询, 取二跳查询的末端节点 m,然后组装成一个列表。
注意到 where 条件中,使用了刚刚提到的条件子查询:
where not (n)-->(m)
这里条件使用 where 条件,对子查询的结果进行了过滤,且过滤时,是将一个 Graph Pattern 作为的过滤条件,最后使用竖线进行投影。
在 return 子句中,使用了 Cypher 中 List Comprehension 的语法,进行列表过滤,并获取大小:
return id(n) as key, size([x in recSet where x.gender="male"]) as maleNumber, size([x in recSet where x.gender="female"]) as femaleNumber
支撑子查询作为过滤条件的,是 RollUpApply 算子,可以通过 explain 看到其在查询计划中发挥价值:
cypher_result = ges_util.cypher_query("""explain match (n:Person) where id(n) in ["p367","p13194139534836","p932","p4398046512206","p6597069767359"] return n, [(n)-[:KNOWS*2..2]->(m) where not (n)-->(m)|m] as recSet""",formats=["row","graph"]);ges_util.format_cypher_result(cypher_result, boxHeight=200)
对每个左子树生成的结果(这里是 (n:Person))都会作为变量输入,并执行右子树,将右子树的结果打包返回为 list。
此外还可以限制子查询的数目,对查询进行 PerNodeLimit(单点跳出限制:每个点每层只能向外跳出限定个数的顶点)。
例如兴趣推荐 A场景中,看看小明的朋友有哪些兴趣爱好(人 - INTEREST - 兴趣),从每个朋友的兴趣爱好中选取至多 N 个兴趣爱好推荐给小明。
match (n:Person) where id(n)="p367" match (n)-[r]->(m) return [(m)-[:HAS_INTEREST]-(a)|a][0..3]
为了可视化演示效果,可视化时同步打印了 “朋友” 和 “INTEREST” 边。
同样的,也可以使用 RollUpApply+Limit 对每跳做 PerNodeLimit,例如统计和小明的朋友有共同兴趣爱好的朋友,每跳最多找 3 个点,最后一跳每个点最多找 1 个点:
match (n:Person) where id(n)="p367" match (n)-[r]->(m) with m limit 3 with m,[(m)<-[r1:HAS_INTEREST]-(a)|a][0..3] as interests unwind interests as interest with interest, [(interest)-[r1:HAS_INTEREST]->(a) where not (a)--(m)|[r1,a]][0..1] as soulMatereturn *
其他子查询
使用 with 也可以实现其他子查询任务,例如上一跳的查询结果经过 limit 限制后输入下一跳,成为查询条件:
match (n:Person) where id(n) in ["p367","p13194139534836","p932","p4398046512206","p6597069767359"] with n limit 10match (m:Person{lastName:n.lastName}) return n.lastName, m.firstName
使用 explain 也可以看到其查询计划:
cypher_result = ges_util.cypher_query("""explain match (n:Person) where id(n) in ["p367","p13194139534836","p932","p4398046512206","p6597069767359"] with n limit 10match (m:Person{lastName:n.lastName}) return n.lastName, m.firstName""",formats=["row","graph"]);ges_util.format_cypher_result(cypher_result)
由于不同的 n,其 n.lastName 的值是不固定的,所以需要针对每个 n,去做 match (m:Person {lastName:n.lastName}) 这样的查询,因此需要使用 Apply 子查询算子支撑这样的语句。
总结
借助子查询局部遍历是图查询中的常用操作,将子查询作为条件过滤或者中间结果,可以满足某些业务场景下的对查询的局部有限制的诉求,如文中提到的社交网络分析,再如股权穿透网络中穿透层数分析、装备制造和配置管理(IT 设备管理)领域依赖识别和变更影响分析等。
此外,由于 Cypher 以行的形式组织数据,某些情况下使用子查询可以节省中间结果产生,加速 Cypher 查询的执行。
当然,使用更高效的 API(如 GES 产品中有多跳过滤 API) 或者使用非行存的查询执行引擎也是可选的解决方案。
点击关注,第一时间了解华为云新鲜技术~
关键词:
-
每日快讯!【新华500】新华500指数(989001)10日收跌0.65%
新华500指数(989001)10日收盘跌0 65%,报4397 27点。指数盘中最高触及4415 96点,最低触及4381 64点,成
来源: 基于华为云图引擎GES,使用Cypher子查询进行图探索
每日消息!Vue2组件间通讯
每日快讯!【新华500】新华500指数(989001)10日收跌0.65%
当前热讯:成功展商要点——2023第十二届北京国际汽车制造业博览会
环球即时:传音Tecno Camon 20系列发布:五边形镜组极具辨识度
当前资讯!《斗罗大陆双神战双神》首个场景秀公开:虚幻5打造 画面逼真
这就很尴尬 男子高速电话指导女友开车 结果自己撞了
世界看点:4699元起 九号智能电动车小Q发布:新国标、能跑95km
一图看懂联发科旗舰新U天玑9200+:CPU/GPU性能提升10%、功耗更低了
环球看点!男童喉咙长菜花样肿块确诊感染HPV
今日看点:89.关于类的定义抽象数据类型
全球观速讯丨Mac系统,Qt工程转xcode工程,打包pkg
大幅提升前端工作效率!Numeral.js数值格式化库来了!
无需代码绘制人工神经网络ANN模型结构图的方法
2023年梅花金银兔纪念币价格(2023年05月10日)_世界快资讯
仅7999元!Redmi MAX 90英寸巨屏电视开售:百级分区、144Hz高刷 即时焦点
每日热议!亏电百公里油耗3.9升 比亚迪驱逐舰07申报:凯美瑞、雅阁瑟瑟发抖
保时捷718上新款 157.8万元起!真心无法抗拒 全球简讯
环球快看点丨悦达起亚被曝管理岗轮休 一休就一年!官方回应
中国电信在科技创新中加速释放消费活力 每日聚焦
每日播报!利用Appuploader上架IPA步骤
环球热文:代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。第一章 数组part01
黄道十二宫是什么意思?黄道十二宫是哪个文明首先提出的?
每日看点!98年浙大女学霸曾被视为格力接班人 孟羽童称靠别人永远不如靠自己
金锣玉米热狗香肠20袋到手19.9元:新鲜美味 当前短讯
热讯:为什么这届年轻人基本不走亲戚了?互联网“断亲”情况加剧:专家释疑
【环球新视野】西渝高铁最新进展!200余户已签协议
双商最高的四大星座是什么?十二星座的月份表
神话Eric的妻子是谁?神话Eric个人介绍
2011年快乐女声有哪些评委?2011届快女排名前十名
消失日晖打一字是什么?猜字谜游戏题目及答案
台电平板怎么刷机?台电平板android版如何获取root?
会声会影x4激活步骤是什么?会声会影x4激活代码
华硕f83v笔记本电池充电时橙色充电灯不停闪烁怎么解决?华硕f83v笔记本参数
三星笔记本r467怎么进bios设置u盘启动?三星笔记本r467参数
Vue 前端开发团队风格指南(史上最全)
Linux ARM架构_安装JDK8-银河麒麟V10 Kylin Linux-焦点速递
PSP上哪个火影的游戏最好玩?PSP经典游戏有哪些?
商家广告鼓励偷男友钱喝奶茶被罚 热消息
环球通讯!苹果推出iPad版Final Cut Pro与Logic pro:1个月免费试用
国人秒懂内涵 如何辨别在美国的中国人:看车牌 环球今头条
吸、扫、拖三合一!米家免洗扫拖机器人2正式开售:1999元
深圳一男子举牌相亲 月薪6千要求女方1万2:被路人质疑后神回应 世界热门
史诗级尴尬!马斯克驾驶Cybertruck结果趴窝:在农田里陷车
2023年社保缴费基数怎么调整?什么时候重新申报?_环球新资讯
环球新资讯:2分钟快速上手流水线的创建与运行
当前视讯!接单日记(三)文本处理之词云生成
今日热门!台式电脑有线网络怎么连接_有线网络怎么连接
华为将发布双旗舰笔记本 MateBook新品颜值、性能将迎全面升级
世界热点!任天堂Switch卖不动了?销量下降22% 还要再苟一年
首发9999元 小米电视ES Pro 90寸开售:1000nits高亮度
今日观点!希思黎京东官方自营旗舰店开业 打造全新高端奢护体验
环球今日报丨支持双枪快充!比亚迪赵长江:腾势N7制动距离“遥遥领先”
焦点热讯:首个“三体”线下项目《三体 · 引力之外》有啥不一样?
焦点热议:杭州:西湖景区莲花绽放 花朵水面摇曳身姿
全球即时看!科大智能参设新能源发展公司 经营范围含电池销售
今日快讯:3D建模师用AI把自己变美少女 大叔成偶像
理想老板怒斥媒体人:隔壁吉利的高管羡慕坏了
多家挖呀挖公司注册成立:涉及零售业、服务业-每日资讯
环球滚动:50万级老板专属座驾 新一代国产奔驰E级亮相:车身、轴距全加长
249元 小米智能摄像机3开售:3K超清画质 支持双向语音通话
听说你还回忆我小说 听说你还回忆我
高效c语言1快速入门|焦点热闻
使用IDEA远程Debug调试(详细)|今日快讯
Echarts引入——绘制一个简单的图表|环球信息
世界热点评!豫能控股拟30亿布局新能源转型待考 煤炭涨价助推成本上升两年累亏逾40亿
头条:国内“老头乐一哥”!雷丁汽车申请破产:曾被经销商举报为诈骗
七彩虹发布新款隐星游戏本:RTX 4060首发5999元
【世界聚看点】百万级越野车!仰望U8申报信息公布:搭比亚迪最强2.0T发动机
全球聚焦:蔚来车主 绑架李斌?
比亚迪海豚最强对手来了!五菱宝骏云朵亮相:10万级大五座_热消息
今日视点:再动员再部署!龙湾全面推进这项工作!
VM虚拟机去虚拟化 玩游戏多开 过检测 tp vmp cf dnf
中信证券:下半年全球新能源汽车及储能有望延续高增长
AMD RDNA3甜点卡RX 7600到货了:价格不友好
热资讯!杭州女生地铁上隔空收到陌生信息 果粉热议常被此折磨:苹果回应给解决办法
你遇到没?苹果iPhone天气又崩了:用户吐槽不如安卓
爱犬跳车乱蹿 摩托车骑手高速路上抓狗:险象环生-视点
扫码才能点餐缴费?市消协劝喻商家:不得强制消费者关注公众号或用小程序_当前视讯
聚焦重点靶向发力 万亿税费红利加快释放 全球热文
环球观察:韩国最新民调:尹锡悦就职一周年,施政差评率60%
iOS 16.5 RC准正式版推送!iOS 16系统更新要绝唱了 每日速讯
华为Mate X3国际版亮相:系统是EMUI 13.1
学系统集成项目管理工程师(中项)系列19b_成本管理(下)_世界看点
新坎特伯利传说_关于新坎特伯利传说简介
捡漏上瘾!印度仍在抢购廉价俄油 全球油价将大涨价 环球关注
网友第一次装机遇到这些问题:好像当年的自己_每日热议
即时:滴滴一面:BigKey问题很致命,如何排查和处理?
“下沉式旅游”的信号,小城市接收到了吗? 焦点简讯
天天短讯!微信5个超实用隐藏功能 很多人都不会用!看完涨知识
最强高端旗舰手表 华为WATCH 4系列全球首发亮相:腕上健康管家
全球焦点!开发者称《王国之泪》主题是"手":让林克更具辨识度
代工厂搞出“雷军电动车”的老头乐一哥 死了:因为想好好做车
4.1Pb/s!中国创造光纤传输新纪录 世界观点
“基金公司”APP上买理财,血本无归?法院判了
欧冠半决赛晋级率:本菲卡居首,米兰、利物浦、尤文列前四|全球看点
指标到校和统招的区别_指标到校与统招的区别
谁抢到了五月天门票?网友吐槽:黄牛加价可随便买 最新资讯
国产SSD继续卷:梵想S690 2TB到手价499元 4800MB/s
拍照机皇再次易主 华为P60 Pro拿下DXO手机影像全球第一:156分-全球看点