match 语句转nGQL 语句 [Neo4j 转Nebula]

提问参考模版:

  • nebula 版本:v2.0.1

  • 部署方式(分布式 / 单机 / Docker / DBaaS):分布式

  • 是否为线上版本:Y

  • 问题的具体描述
    Neo4j 转Nebula, 原先的业务里面有几个语句,不太好转,语句如下

MATCH p = (self:Company)<-[sr:ACTUAL|CONTROL]-(target) WHERE self.keyNo = "aaa" RETURN CASE target.status WHEN '存续' THEN 0 ELSE 8 END AS status, target, collect(p) AS path, 'C' AS nodeType, CASE type(sr) WHEN 'ACTUAL' THEN 0 ELSE 1 END AS type ORDER BY status, type SKIP 0 LIMIT 10

现在想到了这里

go from -6732559126034379613 over Legal, Invest Reversely yield CASE $$.Company.shortstatus WHEN '存续' THEN 0 ELSE 8 END AS status, $$.Company.keyno, $$.Company.name, "C" as nodeType, Legal._type, CASE Legal._type < 0 WHEN true THEN 0 ELSE 1 END AS type | ORDER BY status, type | LIMIT 0, 10

有几个问题不知道怎么解决, 有没有更好的写法:

  1. target 有两种类型,有一个没有status 字段,这个表示会有点奇怪,缺少更具体的表达,后续需要业务代码处理
  2. OpenCypher 里面的case type(sr) 不知道该怎么表示,毕竟Go 里面没有关系没有type, 用Legal._type 毕竟很奇怪,这个值 我和NULL,EMPTY 比较都没有值,很奇怪 如果类型为Invest,
    CASE Legal._type 应该怎么比较
+--------+------------------------------------+----------------------------+----------+-------------+--------------+------+
| status | $$.Company.keyno                   | $$.Company.name            | nodeType | Legal._type | Invest._type | type |
+--------+------------------------------------+----------------------------+----------+-------------+--------------+------+
| 0      | "1326546545455444444789978797/961" | "清华大学资产管理有限公司" | "C"      |             | -71          | 1    |
+--------+------------------------------------+----------------------------+----------+-------------+--------------+------+
| 8      |                                    |                            | "C"      | -72         |              | 0    |
+--------+------------------------------------+----------------------------+----------+-------------+--------------+------+

1、 你的 match 中的 targe 是什么类型的,也是company吗
2、legal._type 和 type(src) 并不是同一个东西,不能这样去比

  1. target 有多种类型,Company 有status字段 其他Entity没有
  2. 如果这种改写不合适,该怎么改更合适

可以试试 CASE Legal._type is EMPTY when true then 0 else 1 end as type, 表示这一行结果中是否有legal这种类型的边

版本是v2.0.1 貌似现在并不支持

刚看了一下代码, 2.0.1的分支上 还没支持 is EMPTY 和 is not EMPTY的

还有一个比较 tricky的办法, 就是 你先 输出 一下,你想要的 边的 type, 然后 case legal._type when (type的值) then …

没办法就可以先这样。
然后还有第一个需要CASE target.status WHEN '存续' THEN 0 ELSE 8 END AS status
但是target 可能是Company 可能是Person 可能是其他, 这里面只有Company 有status 属性,这个有较好的改写方法吗?

这个没办法, 现在的ngql必须明确 tag类型才能取属性, 到年底的版本这方面会加强

OK,明白了

原先业务里边的 match 语句不就可以支持吗?你是想改写成 go 语句?

type 函数返回的是 string 类型

  1. 因为Nebula 的Space里面有其他业务,不方便加索引,担心影响其他业务, 所以不能用match
  2. type 是指type(src) 吗?这个在Go语法里面用不了

了解了。
对的,只能在 match 里边用,用法和 cypher 的 type 函数是一致的

好的,明白了

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。