Dremel - уровень повторения и определения

Читая статью " Интерактивный анализ наборов данных веб-масштаба", я наткнулся на концепцию уровня повторения и определения.
в то время как я понимаю необходимость этих двух, чтобы иметь возможность устранять неоднозначности, он добавляет уровень повторения и определения к каждому значению.

Что мне неясно, так это то, как они вычисляли уровни...

Как показано на рисунке:

Это говорит:

Рассмотрим код поля на рисунке 2. Это происходит три раза в r1. Вхождения "en-us" и "en" находятся в первом имени, а "en-gb" - в третьем имени. Чтобы устранить неоднозначность, мы добавляем уровень повторения к каждому значению. Он говорит нам, в каком повторяемом поле на пути поля значение повторяется.


Путь к полю Name.Language.Code содержит два повторяющихся поля: Name и Language. Следовательно, уровень повторения кода находится в диапазоне от 0 до 2; Уровень 0 обозначает начало новой записи. Теперь предположим, что мы сканируем запись r1 сверху вниз. Когда мы встречаемся с "en-us", мы не видим повторяющихся полей, т. Е. Уровень повторения равен 0. Когда мы видим "en", поле языка повторяется, поэтому уровень повторения2.

Я просто не могу заставить меня думать об этом, Name.Language.Code в r1 имеет en-us а также en ценности. Пока первый r = 0 и второй r = 2 потому что два определения были повторены? (язык и код)?

Если бы это было:

Name
    Language
       Code: en-us
Name 
    Language
        Code: en
Name
    Language
        Code: en-gb

Будет ли это?

0 2
1 2
2 2 

Уровни определения. Каждое значение поля с путем p, esp. каждый NULL имеет уровень определения, указывающий, сколько полей в p, которые могут быть неопределены (потому что они являются необязательными или повторяются), фактически присутствуют в записи.

Почему тогда уровень определения равен 2? Разве это не путь Name.Language содержать два поля Code а также Country где только 1 optional\repeated?

3 ответа

Решение

Вероятно, это больше не интересует вас. Еще кто-то может наткнуться на этот вопрос. Алгоритм чередования Dremel отнюдь не тривиален.

Чтобы ответить на ваш первый вопрос:

  • Уровень повторения en-us 0, так как это первое вхождение name.language.code Путь в записи.

  • Уровень повторения en равно 2, поскольку повторение произошло на уровне 2 (языковой тег).

Чтобы ответить на ваш второй вопрос, для следующей записи,

DocId: 20
Name
  Language
    Code: en-us
Name 
  Language
    Code: en
Name
  Language
    Code: en-gb

записи для name.language.code было бы

en-us 0 2
en    1 2
en-gb 1 2 

Объяснение:

  • Уровень определения всегда равен двум, поскольку два необязательных тега name а также language присутствуют.
  • Уровень повторения для en-us ноль, так как это первый name.language.code в записи.
  • Уровень повторения для en а также en-gb 1, так как повторение произошло на name тег (уровень 1).

Это помогает?

Adelin попросила привести еще несколько случайных примеров, чтобы прояснить ситуацию. Чтобы развернуть ответ user152468:

      DocId: 20
Name
  Language
    Code: en-us
Name 
  Language
    Code: en
Name
  Language
    Code: en-gb
  Language
    Code: zh
Name
  url: 'https://A'

Было бы:

Насколько я понимаю, есть одна запутанная, но важная деталь:

Уровень повторения — это НЕ последовательный индекс повторяющегося поля внутри пути, а индекс поля среди повторяющихся полей внутри пути .

Очевидно, повторяющееся полеNameв вашем примере, и это делает уровень 1 для тех, кто не был первым полем.

Реальная проблема заключается в том, как обозначить повторяющиесяLinks.Forwards. Последовательный индекс повторяющегося поля,Forwards, равно 2, но поскольку полеLinksне повторяется, повторение 1, а не 2.

Эта страница очень помогает, поскольку некоторые комментарии уже упоминались.

Другие вопросы по тегам