neo4j 转 nebula 问题

最近在进行项目重构,原先是neo4j,实现了根据节一个点,沿着某一个边关系进行遍历(还会根据条件进行过滤就是 where条件)),换成nebula之后,根据官方文档中 GET SUBGRAPH 来实现,可是今天自己尝试实现的时候,一加where 条件就不行,现在好像有一点是明确的,nebula中 GET SUBGRAPH 还无法支持 条件查询。。。。蛋疼,,,请问大家有什么好方案吗,我总不能把一个查询拆成多个执行吧。这样效率无法保证啊。。惆怅,有知道的道友,请指点指点啊

想返回的东西是什么呢?如果只要用终点,用 LOOKUP | GO 就足够了,如果需要路径中的所有点,可以用 MATCH 哈

LOOKUP ON intopiece WHERE intopiece.loan_business_id == $loan_business_id YIELD properties(vertex).global_id as global_id ,properties(vertex).commit_time as commit_time
这是后台的查询串,参数是 map.put(“loan_business_id”,“A1441920190805005221”);,执行后,=================测试数据============={“code”:-1009,“message”:“SemanticError: Column type error : loan_business_id”}, loan_business_id 这个字段是string啊,怎么说是类型错误呢

这是另一个问题?能在 console 里最小重现你的query和报错么?

$loan_business_id 是你的应用代码里拼接 nGQL 的变量?如果是的话,你应该用引号包裹它。比如它 eval 成 foo 的话,这个查询应该是


LOOKUP ON intopiece \
  WHERE intopiece.loan_business_id == "foo" \
  YIELD properties(vertex).global_id as global_id ,properties(vertex).commit_time as commit_time

Map<String, Object> map = new HashMap<>();
map.put("a", 1);
map.put("b", true);
map.put("c", nvalue);
map.put("d", list);
paramMap.put("p5", map);
String query = "RETURN abs($p1+1),toBoolean($p2) and false,$p3,$p4[2],$p5.d[3]";
ResultSet resp = session.executeWithParameter(query, paramMap);

如果不是自己拼接字符串 query,而是用 executeWithParamter,那不应该用引号包裹哈,其实在 console、studio 里也支持参数化的,你可以先试试这个表达的位置的参数是不是可以的哈,我知道确实有的地方参数还有些问题。


客户端的 session类给出的方法 入参 是 map<String ,Object> 的,这样传到nebula就是类型不匹配了,我想知道有没有 个方法 实现比如 toString($loan_business_id) 这样,试了下这个不行,要不然就只能手动拼接了

抱歉,这里 == $var 还不支持,我去提一下 issue,你可以先这么用 IN list 的形式绕过 IN [$loan_business_id]

(root@nebula) [basketballplayer]> :param p0 => "Tim Duncan”
(root@nebula) [basketballplayer]> lookup on player where player.name IN [$p0] YIELD id(vertex);
+-------------+
| id(VERTEX)  |
+-------------+
| "player100" |
+-------------+

(root@nebula) [basketballplayer]> lookup on player where player.name == $p0 YIELD id(vertex);
[ERROR (-1009)]: SemanticError: Column type error : name

Issue: https://github.com/vesoft-inc/nebula/issues/4452

1 个赞

好的 谢谢 还有个问题 就是


实际业务中种类非常多 ,。。。 如果没填的话,就默认查所有边类型呢? 试了下报错,如果想实现的话,怎么办啊

* 或者 foo,bar

(root@nebula) [basketballplayer]> go from "player100" over * YIELD dst(edge);
+-------------+
| dst(EDGE)   |
+-------------+
| "team204"   |
| "player101" |
| "player125" |
+-------------+
Got 3 rows (time spent 3873/209305 us)

Fri, 22 Jul 2022 15:25:00 CST

(root@nebula) [basketballplayer]> go from "player100" over follow,serve YIELD dst(edge);
+-------------+
| dst(EDGE)   |
+-------------+
| "player101" |
| "player125" |
| "team204"   |
+-------------+
Got 3 rows (time spent 1652/67644 us)

ref: GO - Nebula Graph Database 手册

<edge_type_list> ::=
   <edge_type> [, <edge_type> ...]
   | *

GO 2 STEPS FROM $-.v_id OVER * ,这是我代码里的片段,是查询节点两跳的数据,为什么还会返回一跳的数据会来,目前准备 一跳、二跳的数据 查询后去重,但是有点麻烦,怎么解决呢?

GO 是 walk,MATCH 是 trail,所以 GO 比如会有 a->b->a 这样的路径被查出来,在两跳里,如果你是 2 STEPS 可以限制一个 WHERE 去掉?

(root@nebula) [basketballplayer]> YIELD "player100" AS v | GO 2 STEPS FROM $-.v OVER follow YIELD $$ AS d , $-.v AS src | YIELD $-.d AS d WHERE id($-.d) != $-.src
+-----------------------------------------------------------+
| d                                                         |
+-----------------------------------------------------------+
| ("player125" :player{age: 41, name: "Manu Ginobili"})     |
| ("player102" :player{age: 33, name: "LaMarcus Aldridge"}) |
+-----------------------------------------------------------+

他应该说的是 a->b->c、a->d->b 中要对 b 去重吧

1 个赞

啊,对:sob:,这样除了集合算,有更好办法么?

没什么办法。

1 个赞

看起来没有更好的做法。

我现在是这么做的。时间0.6s了 有点太耗时了

这样做肯定是不好的。GET SUBGRAPH 和 MATCH 的路径模式是 Trail,可以试试

1 个赞

嗯只能试下,还有个问题,发现二跳的速率很慢,有什么建议吗,数据量1200W,边关系30个这样子的

GET SUBGRAPH 的话,可以直接得到去重后的节点数据吗

我的环境里,求2跳的数据就很慢 比如
LOOKUP ON intopiece WHERE intopiece.loan_business_id == “200815895984202710026”
YIELD id(vertex) as v_id, properties(vertex).commit_time as commit_time |
GO 2 STEPS FROM $-.v_id OVER *
BIDIRECT where datetime($$.intopiece.commit_time) < datetime(“2020-05-16 11:15:30”)
yield distinct properties($$).loan_business_id as results
耗时 :

浙ICP备20010487号