如何在OrientDB中查找通过含指定属性的边连接的所有节点?
解决OrientDB中筛选指定请求的服务关联路径问题
问题背景
你有四个服务节点:Gateway、ServiceA、ServiceB、ServiceC,通过Http类的边关联,边带有request属性。需要筛选出request为get_user_info或delete_user的边连接的节点,期望得到正向路径:Gateway->ServiceA->ServiceC->ServiceB和Gateway->ServiceB,但之前的查询出现了反向链接(如ServiceB->Gateway)。
问题分析
你之前的查询仅获取了所有关联节点,未明确限定边的方向和路径起始点,因此包含了反向的边关联。要得到正向路径,需用有向路径查询精准控制方向与路径逻辑。
解决方案
方案1:使用MATCH语句(推荐,精准匹配路径)
OrientDB的MATCH语法专为路径查询设计,可直接定义从Gateway出发的正向路径,匹配指定request的边:
-- 匹配1跳、2跳、3跳的正向路径 MATCH {class: Services, name: 'Gateway'} -[e:Http WHERE e.request IN ['get_user_info', 'delete_user']]-> {class: Services} AS s1, s1 -[e2:Http WHERE e2.request IN ['get_user_info', 'delete_user']]-> {class: Services} AS s2, s2 -[e3:Http WHERE e3.request IN ['get_user_info', 'delete_user']]-> {class: Services} AS s3 RETURN $paths UNION MATCH {class: Services, name: 'Gateway'} -[e:Http WHERE e.request IN ['get_user_info', 'delete_user']]-> {class: Services} AS s1 RETURN $paths
该查询会直接返回所有符合条件的正向路径,完全匹配你期望的结果。
方案2:直接查询符合条件的有向边
如果仅需查看每条符合条件的边及其关联节点(不合并路径),可直接查询边类,明确获取有向的out(源节点)和in(目标节点):
-- 获取所有指定request的Http边,包含源和目标节点 SELECT out, in, request FROM Http WHERE request IN ['get_user_info', 'delete_user']
若需要展开节点详情,使用expand:
SELECT expand([out, in]) FROM Http WHERE request IN ['get_user_info', 'delete_user']
方案3:修正你之前的节点查询(过滤反向关联)
如果坚持用节点查询,需只保留作为边的out节点(发起请求的节点),或明确筛选边的方向:
-- 只保留通过正向Http边关联的节点(源节点) SELECT * FROM Services WHERE @rid IN (SELECT out FROM Http WHERE request IN ['get_user_info', 'delete_user']) UNION -- 保留正向边的目标节点,避免反向关联 SELECT * FROM Services WHERE @rid IN (SELECT in FROM Http WHERE request IN ['get_user_info', 'delete_user'] AND out.name = 'Gateway' OR out.name IN (SELECT name FROM Services WHERE @rid IN (SELECT in FROM Http WHERE out.name = 'Gateway')))
不过此写法较繁琐,不如MATCH直观。
之前查询失效的原因
- 第一个查询
in('http').request = 'get_user_info'写法错误,OrientDB中无法直接通过in('http').request筛选入边属性,正确写法为inE('http').request。 - 第三个查询同时包含了
in和out的所有节点,未限定方向,因此出现反向关联节点。
内容的提问来源于stack exchange,提问作者Oleg
相关产品推荐
相关产品推荐

