Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MATCH will hang in certain cases #205

Open
liushuyu1 opened this issue Aug 30, 2023 · 23 comments
Open

MATCH will hang in certain cases #205

liushuyu1 opened this issue Aug 30, 2023 · 23 comments

Comments

@liushuyu1
Copy link

查询语句:
MATCH (n)-[r:transfer]->(n2)
WHERE id(n) == $p0 AND id(n2) == $p1
RETURN r

本地执行没问题,到服务器上跑的时候,执行到一定查询次数就会卡住不动了,也没有日志提示

image
@CorvusYe
Copy link
Collaborator

这个截图说的是上次执行之后,卡住的执行过程没有日志是吧

@liushuyu1
Copy link
Author

是的是的

@liushuyu1
Copy link
Author

换这条语句也会卡住
MATCH (n)-[r:transfer]->(n2)
WHERE id(n) == $p0 AND id(n2) == $p1
RETURN count(*) > 0

但是换成这条好像就不会卡住
MATCH (n)-[r: ${ p1 }]-(n2)
WHERE id(n) == $p0 AND id(n2) == $p2
RETURN count(*) > 0

区别就是(n)-[r:transfer]->(n2) 和 (n)-[r: ${ p1 }]-(n2)

@liushuyu1
Copy link
Author

难道是这个箭头的原因吗

@CorvusYe
Copy link
Collaborator

这些信息是有点难分析出是哪里出的问题,是数据上还是程序上
如果是 ngbatis 的问题,最大的可能是在会话的调度上,定期巡检失活的连接,然后重建新连接
但是这种情况我这边的表现是会报一次错,但卡住的情况我也是没有碰到过,期待更多的信息

@CorvusYe
Copy link
Collaborator

如果是语法上的差异可以明确重现会不会卡住,可以将两个脚本分别在studio/console中执行下看看

@liushuyu1
Copy link
Author

我描述一下我的场景:
建立两个人的转账关系,vertex是人,edge是转账关系。
//1.查询出两个人之间的转账关系是否存在
Transfer transfer = nebulaGraphManager.selectTransfer(from, to);
//2.如果存在就插入,否则就更新转账关系的部分属性
if(transfer == null){
insertTransfer(tokenTransfer,fromWallet,toWallet,txTime);
} else {
updateTransfer(transfer,tokenTransfer,fromWallet,toWallet,txTime);
}

@liushuyu1
Copy link
Author

然后那个卡顿的点是在1这里
Transfer transfer = nebulaGraphManager.selectTransfer(from, to);
对应的语句是
MATCH (n)-[r:transfer]->(n2) WHERE id(n) == $p0 AND id(n2) == $p1 RETURN r

@liushuyu1
Copy link
Author

然后我替换成NebulaDaoBasic.existsEdge好像就不会卡住
image

@CorvusYe
Copy link
Collaborator

数据量很大吗,selectTransfer 跟 NebulaDaoBasic 的区别也是差一个箭头的问题
但你的业务避不开这个箭头啊,不然 to 向 from 转账的记录在 existsEdge 的判断下是 true
from 并没有向 to 转过账,跟业务逻辑是不是相悖了

@liushuyu1
Copy link
Author

是滴是滴,数据量不算大,现在我是要判断左边点向右边点是否有转账,但是existsEdge好像并不能判断单边的

@liushuyu1
Copy link
Author

我换成->的查询就卡住,不过不是第一次就卡住,而是过了一定次数就会卡住,然后换成-就不会卡住,刚刚又试了一下

@CorvusYe
Copy link
Collaborator

是个很诡异的问题,SHOW LOCAL QUERIES; 能查到卡住的查询吗

@liushuyu1
Copy link
Author

好像并不能
image

@CorvusYe
Copy link
Collaborator

那 SHOW QUERIES; 呢

@liushuyu1
Copy link
Author

no data
image

@CorvusYe
Copy link
Collaborator

CorvusYe commented Aug 30, 2023

目前我也没办法定位具体是哪个环节卡住了
按我的理解如果是在数据库卡住了,应该会有对应的QUERY记录才对
我在论坛提了个帖子 https://discuss.nebula-graph.com.cn/t/topic/13899 ,等待一下回复

@liushuyu1
Copy link
Author

好的,谢谢。另外我这边又测试了一下,直接while循环调用,然后打印次数
image

然后发现本地跑是没问题,能一直跑下去,不卡住
image

但是我在服务器上跑就会卡住,而且次数很准,每次基本都是第260次的时候
image

我本地是MacOS,

服务器是Ubuntu
image

@CorvusYe
Copy link
Collaborator

CorvusYe commented Aug 30, 2023

这个用例可以试试线上跑测试库,或者本地连正式库?(不知道你们能不能允许这种操作)排除一下跟数据库数据状态的影响

@liushuyu1
Copy link
Author

试了,还是一样的,so sad

@CorvusYe
Copy link
Collaborator

CorvusYe commented Aug 30, 2023

那这就跟数据库没有关系,这样上面的show没有结果也就解释得通了,但这个箭头跟非箭头的区别反而解释不通了,只有数据库才会涉及语义,对于其他环节只是长度差1的字符串,so sad...

@CorvusYe
Copy link
Collaborator

目前我也没办法定位具体是哪个环节卡住了 按我的理解如果是在数据库卡住了,应该会有对应的QUERY记录才对 我在论坛提了个帖子 https://discuss.nebula-graph.com.cn/t/topic/13899 ,等待一下回复

这边有回复了,看样子 SHOW QUERIES 没结果可以说明没在数据库查询中卡住,这就不好排查了
可以试试本地用 java -jar 的方式启动看看,排除下启动方式带来的干扰
剩下的就是环境参数的问题了

@liushuyu1
Copy link
Author

好吧,谢谢,我试试

@wey-gu wey-gu changed the title 【MATCH查询会卡住不动】执行一个点到另一个点之间的边查询语句,执行到一定的查询次数会卡住 MATCH will hang in certain cases Sep 7, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants