#node.js #orientdb
#node.js #orientdb
Вопрос:
У меня есть этот график:
И я пытаюсь написать запрос с «синтаксисом 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
Есть ли у вас какая-либо информация для выполнения этого перехода?
Я использую Node.js API:
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 amp;amp; 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();
});
Ответ №1:
Пожалуйста, попробуйте использовать этот код:
"select out_{edgeclass}.in from (select expand(out_{edgeclass}.in) from {Vetex} where {condition})"
Комментарии:
1. Я получаю те же строки с этим:
SELECT out_Access.in FROM Client WHERE myId = 30543
Ответ №2:
Чем match
лучше для такого рода задач.
С SELECT
:
В первой версии запрос более удобочитаемый, но в нем не используются индексы, поэтому он менее оптимален с точки зрения времени выполнения. Второй и третий используют индексы, если они существуют, (на Person.name или City.name , оба в подзапросе), но их труднее читать. Какой индекс они используют, зависит только от того, как вы пишете запрос.
Но совпадают:
исполнитель запроса оптимизирует запрос для вас, выбирая индексы там, где они существуют. Более того, запрос становится более читаемым, особенно в сложных случаях, таких как несколько вложенных запросов выбора.
Здесь правильный запрос:
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
)