Ориентировать многократный ход - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть этот график:

graph

И я пытаюсь написать запрос с «синтаксисом 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();
});

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

match лучше для такого рода задач.

С SELECT:

В первой версии запрос более читабелен, но не использует индексы, поэтому он менее оптимален с точки зрения времени выполнения. Второй и третий используют индексы, если они существуют (для Person.name или City.name, оба в подзапросе), но их труднее читать. Какой индекс они используют, зависит только от того, как вы напишите запрос.

Но совпадение:

Исполнитель запроса оптимизирует запрос для вас, выбирая индексы там, где они существуют. Более того, запрос становится более читабельным, особенно в сложных случаях, таких как множественные вложенные запросы SELECT.

Здесь правильный запрос:

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
    )
0 голосов
/ 10 апреля 2019

Пожалуйста, попробуйте использовать этот код:

"select out_{edgeclass}.in from (select expand(out_{edgeclass}.in) from {Vetex} where {condition})"
...