match 对中间值进行limit

MATCH p=(v:site_ip{name:"99.83.154.118"})-[e:url_edge_site_ip |:url_edge_register_domain*1..3]-(v2:url) RETURN p as path

请问 match 可以对中间值进行limit 吗?
一个IP–>1万url(limit)–>注册域名(limit)–>网站

match
with limit
match

但是我这个语句中间有很多边,怎么去加with limit 呢?

MATCH p=(v:site_ip{name:"99.83.154.118"})-[e:url_edge_site_ip]-(v2:url) with e limit 10 return v2 as path

加了后,也特别慢,和没加一样

可以调一下这个配置 max_edge_returned_per_vertex

调了,调到了1万,数据比较多,调的太低的话,会漏数据
max_edge_returned_per_vertex这个参数,截断是随机截断,还是根据时间顺序呢?
如果是根据点的创建时间进行截断的话,我可以调的更低

随机截断。是会漏数据。

一个IP–>1万url(limit)–>注册域名(limit)–>网站
像这种,我需要分步limit,就只能分开写语句了吗?比如用go或者match 一步一步往下推,每步都limit?

你的最初问题是要怎么写limit。。。。

性能是另外一个问题。limit本来就没下推,你怎么试limit都没用

换到3.3吧 go | limit | go go 应该能好点。

另外,要分析至少发个profile吧,不然怎么帮你看呢。。。

不发profile是因为,跑这个语句内存就直接炸了,504 timeout.

目前这边的解决方案也是go | limit | go go,一步一步的往下推

赞。那就升级到 3.3试试吧,这对内存做了些控制。不过会不会炸还得试试看看
所以你本质问题是会炸?和太慢?

3.3 内存做了啥控制?

我的本质问题就是对一条语句(match ()-[:e1|e2*1…3]-() )的中间值进行limit
一个IP–>1万url(limit)–>注册域名(limit)–>网站
不想通过go limit | go limit | go 这种方案来解决

你们不是搞了什么属性裁剪之类的嘛?

我最终的理解是:
对一条语句(match ()-[:e1|e2*1…3]-() )的中间值进行limit 目前是不可行的
替换方案就是go limit | go limit | go 这种方案

以后会有对中间值进行limit的功能吗?
match ()-[:e1|e2*1…3]-() limit [5, 10, 100] 对第一条边限制结果5–对第二条边限制结果10–对第二条边限制结果100

@RandomJoe

Cypher 的话这种 1…3 的可变跳数的,可以试试展开一跳写一下 match 然后像大家说的 with limit,因为可变,往下一跳接 optional MATCH

不过能接受用 GO 表达的查询一般会比用 MATCH 更适合

我这边是写好了一个模板

MATCH (v:{}{{name:"{}"}})-[e{}*{}]-(v2:url) 

当我在不同需求的时候,传入不同的点和边以及对应的steps,如果展开写的话,就不具有通用性,我们以前是用go limit | go limit | go 这种方案的,就是想问问有没有目前这种模板的限制方式

@wey

了解了,MATCH 更适合定义模板一些,不过 opencypher 里好像确实没有精确定义中间 LIMIT 的语义。

如我同事 @wey 所说,cypher 标准并没有定义这种语法,我们之后应该是不会提供支持的,原因是语言设计并不是一件简单的事情,比如形式验证以及评估对其他语言元素的影响等等。当然,如果希望 cypher 加入你说的特性,可以去官方社区OpenCypher给出你的提案CIR,如果被采纳我们肯定是很乐意去支持的。

就我所见,你的需求 “一个IP–>1万url(limit)–>注册域名(limit)–>网站” 中边的 limit 和终点的 limit 并无区别,而这完全可以通过语句改写来解决。

关于 match 语句 limit 相关的优化,可以跟一下这个 issue: match-limit-enhancement

4 个赞

好的,感谢

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