У меня есть этот график:
И я пытаюсь написать запрос с «синтаксисом SQL» OrientDB v3.0, который начинается с клиента и следует пути чтения (X означает: и не имеют Have
отношения к Клиенту).
Я могу получить Сегменты, но не нахожу, как дойти до Контакта. документы имеют много примеров, но только по одному пути.
Я безуспешно пробовал эти запросы:
SELECT FROM (TRAVERSE out("Access").out("Contain") FROM (SELECT @rid FROM Client where myId = 30543) MAXDEPTH 1)
SELECT FROM (
TRAVERSE out("Contain") FROM
(TRAVERSE out("Access") FROM (SELECT @rid FROM Client where myId = 30543) MAXDEPTH 1)
MAXDEPTH 1
)
SELECT out('Access').out("Contain") FROM Client WHERE myId = 30543
Есть ли у вас какая-либо информация для выполнения этого траверса?
Я использую API Node.js:
const pool = await orient.getPool();
const session = await pool.acquire();
logger.info('Running query...');
session.command(`SELECT out('Access').out("Contain") FROM Client WHERE myId = 30543`)
.on('data', (data) => {
if (data.out_Contain && data.out_Contain.delegate) {
logger.info('Segment %s contains %o Contact', data['@rid'].toString(), data.out_Contain.delegate.size);
} else if (data['@rid']) {
logger.info('Segment %s contains %o Contact', data['@rid'].toString(), data);
} else {
logger.info('Data %o', data);
}
})
.on('error', (err) => {
logger.error(err);
})
.on('end', () => {
console.timeEnd('query');
logger.info('End of the stream');
process.emit('SIGINT');
});
logger.debug('Registering SIGINT');
process.once('SIGINT', async () => {
await session.close();
await pool.close();
await orient.stop();
});
Пожалуйста, попробуйте использовать этот код:
"select out_{edgeclass}.in from (select expand(out_{edgeclass}.in) from {Vetex} where {condition})"
match
лучше подходит для таких задач.
С SELECT
:
In the first version, the query is more readable, but it does not use indexes, so it is less optimal in terms of execution time. The second and third use indexes if they exist, (on Person.name or City.name, both in the sub-query), but they're harder to read. Which index they use depends only on the way you write the query.
Но соответствие:
the query executor optimizes the query for you, choosing indexes where they exist. Moreover, the query becomes more readable, especially in complex cases, such as multiple nested SELECT queries.
Вот правильный запрос:
SELECT EXPAND(contatti)
FROM (
match { class: Client, as: user, where : ( myId = 30543)}
.out('Access')
.out('Contain'){ class:Contact, as:contatti, where: (gender= 'M')},
NOT {as:user} -Have-> {as:contatti}
RETURN DISTINCT contatti LIMIT 1000
)
Я получаю те же строки с этим:
SELECT out_Access.in FROM Client WHERE myId = 30543