OrientDB v3.0多路径遍历查询求助:从Client关联到Contact
解决OrientDB从Client遍历到Contact节点的问题
看起来你已经能从Client节点遍历到Segments了,只差最后一步关联到Contact节点对吧?核心问题应该是没在遍历路径里补上Segments到Contact的关联边,我来给你梳理几个可行的解决方案:
1. 直接链式关联查询(最直观简洁)
如果你的节点关系是 Client ->[Access]→ 中间节点 →[Contain]→ Segments →[你的边名]→ Contact(比如假设Segments和Contact之间的边是Have,你可以替换成数据库里实际的边名称),直接用链式out()调用就能一步到位:
SELECT out('Access').out('Contain').out('Have') FROM Client WHERE myId = 30543
这个查询会直接返回从指定Client出发,经过Access、Contain最终关联到的所有Contact节点。
2. 使用TRAVERSE做更灵活的遍历控制
如果你的路径有分支,或者需要更精细的遍历规则(比如限制深度、过滤特定节点类型),TRAVERSE语句会更合适:
SELECT FROM ( TRAVERSE out('Access'), out('Contain'), out('Have') FROM (SELECT @rid FROM Client WHERE myId = 30543) MAXDEPTH 3 ) WHERE @class = 'Contact'
这里MAXDEPTH 3对应三层跳转:Client(深度0)→ 经Access关联的节点(深度1)→ Segments(深度2)→ Contact(深度3),最后用WHERE @class = 'Contact'精准过滤出目标节点。
调整你的Node.js代码适配查询结果
你原来的代码可以针对返回的Contact节点做更清晰的处理,比如:
const pool = await orient.getPool(); const session = await pool.acquire(); logger.info('Running query...'); // 替换成你实际使用的查询语句 const query = `SELECT out('Access').out('Contain').out('Have') FROM Client WHERE myId = 30543`; session.command(query) .on('data', (data) => { // 处理返回的Contact节点集合 const contactList = data.out_Have?.delegate || []; contactList.forEach(contact => { logger.info('找到Contact节点:RID=%s,信息=%o', contact['@rid'].toString(), contact); }); }) .on('error', (err) => { logger.error('查询出错:', err); }) .on('end', () => { console.timeEnd('query'); logger.info('查询流结束'); process.emit('SIGINT'); }); logger.debug('注册SIGINT信号'); process.once('SIGINT', async () => { await session.close(); await pool.close(); await orient.stop(); });
几个关键提醒
- 一定要确认
Segments到Contact之间的边的准确名称,这是遍历的核心,我这里用Have做示例,你要换成你数据库里实际的边名。 - 如果
Segments到Contact有多个同类型边,链式out()会返回所有关联的Contact节点,不用额外处理。 - 用
@class过滤节点能避免拿到其他类型的节点,让结果更精准。
内容的提问来源于stack exchange,提问作者Manuel Spigolon
相关产品推荐
相关产品推荐

