Tableau MarkLogic Моделирование данных

Я использую Tableau с MarkLogic. У меня есть следующая структура XML

<CustomerInformation CustomerId="1">
        <CustomerBasicInformation>
            <CustomerTitle></CustomerTitle>
            <CustomerFirstName></CustomerFirstName>
            <CustomerMiddleName></CustomerMiddleName>
            <CustomerLastName></CustomerLastName>
        </CustomerBasicInformation>
        <CustomerEmplyomentDetails>
            <CustomerEmployer>
                <EmployerName IsCurrentEmployer=""></EmployerName>
                <CustomerDesignation></CustomerDesignation>
                <EmployerLocation></EmployerLocation>
                <CustomerTenure></CustomerTenure>
            </CustomerEmployer>
        <CustomerEmplyomentDetails>
        <PolcyDetails>
            <Policy PolicyId="">
                <PolicyName></PolicyName>
                <PolicyType></PolicyType>
                <PolicyCategory></PolicyCategory>
                <QuoteNumber></QuoteNumber>
                <PolicyClaimDetails>
                    <PolicyClaim ClaimId="">
                        <PolicyClaimedOn></PolicyClaimedOn>
                        <PolicyClaimType></PolicyClaimType>
                        <PolicyClaimantName></PolicyClaimantName>
                    </PolicyClaim>
                </PolicyClaimDetails>
                <PolicyComplaintDetails>
                    <PolicyComplaint ComplaintId="">
                        <PolicyComplaintStatus></PolicyComplaintStatus>
                        <PolicyComplaintOn></PolicyComplaintOn>
                    </PolicyComplaint>
                </PolicyComplaintDetails>
                <BillingDetails>
                    <Billing BillingId="">
                        <BillingAmount></BillingAmount>
                        <BillingMode></BillingMode>
                    </Billing>
                </BillingDetails>
            </Policy>
            <Policy PolicyId="">
            <PolicyName></PolicyName>
            <PolicyType></PolicyType>
            <PolicyCategory></PolicyCategory>
            <QuoteNumber></QuoteNumber>
            <PolicyClaimDetails>
                <PolicyClaim ClaimId="">
                    <PolicyClaimedOn></PolicyClaimedOn>
                    <PolicyClaimType></PolicyClaimType>
                    <PolicyClaimantName></PolicyClaimantName>
                </PolicyClaim>
            </PolicyClaimDetails>
            <PolicyComplaintDetails>
                <PolicyComplaint ComplaintId="">
                    <PolicyComplaintStatus></PolicyComplaintStatus>
                    <PolicyComplaintOn></PolicyComplaintOn>
                </PolicyComplaint>
            </PolicyComplaintDetails>
            <BillingDetails>
                <Billing BillingId="">
                    <BillingAmount></BillingAmount>
                    <BillingMode></BillingMode>
                </Billing>
            </BillingDetails>
        </Policy>
    </PolcyDetails>
</CustomerInformation>

Я создал вид на вышеупомянутую структуру. Первоначально я создал одно представление для всех элементов, но в Таблице я получил дублированные значения, а также результат декартового объединения. Поэтому для решения этой проблемы я использовал подход фрагмента root. Поскольку может быть несколько PolicyDetails для одного клиента. Я создал фрагмент root на Политике. Аналогично, претензии, жалобы, выставление счетов, квота могут быть множественными для одной политики, я создал фрагмент root для каждой из них.

Теперь после этого он решает проблему дублирования, а также набор результатов декартовых объединений. Он предоставляет уникальный набор записей для каждого объекта (CustomerInfo, Политика, Претензии, Жалобы, Цитата, Работодатель, Биллинг).

Однако я не могу связать эти объекты друг с другом (как в первичном ключе).

Я создал следующее представление с областью действия элемента и всем. Я вставляю только сведения о клиенте и политике, если это разрешает управление другими объектами.

view:create(
  "InsurancePOC",
  "CustomerBasicInfo",
  view:element-view-scope(xs:QName("CustomerInformation")),
  ( 
    view:column("CustomerId", cts:element-attribute-reference(xs:QName("CustomerInformation"), xs:QName("CustomerId"))),
    view:column("PolicyId", cts:element-attribute-reference(xs:QName("Policy"), xs:QName("PolicyId"))), 
    view:column("QuoteNumber", cts:element-attribute-reference(xs:QName("Quote"), xs:QName("QuoteNumber"))),
    view:column("ComplaintId", cts:element-attribute-reference(xs:QName("PolicyComplaint"), xs:QName("ComplaintId"))),
    view:column("BillingId", cts:element-attribute-reference(xs:QName("Billing"), xs:QName("BillingId"))),:)
    view:column("CustomerFirstName", cts:element-reference(xs:QName("CustomerFirstName"))),
    view:column("CustomerLastName", cts:element-reference(xs:QName("CustomerLastName")))                        
  ),
  (),
  () 
),
view:create(
  "InsurancePOC",
  "PolcyInfo",
  view:element-view-scope(xs:QName("Policy")),
  ( 
    view:column("PolicyId", cts:element-attribute-reference(xs:QName("Policy"), xs:QName("PolicyId"))),
    view:column("PolicyName", cts:element-reference(xs:QName("PolicyName"))),
    view:column("PolicyType", cts:element-reference(xs:QName("PolicyType")))                    
  ),
  (),
  () 
)

Все предварительные условия, такие как индекс диапазона элементов, и все уже сделано.

Я пытаюсь связать эти лица, используя view:column("PolicyId", cts:element-attribute-reference(xs:QName("Policy"), xs:QName("PolicyId"))) в CustomerBasicInfo view,

Если я это сделаю, он покажет нулевые результаты в консоли Tableau или Query. Если я удаляю его, выдает уникальную запись, но без каких-либо отношений друг с другом. Все, чего я хочу, это добиться отношений между Полисом-Клиентом

Пожалуйста, просмотрите фрагмент кода, пожалуйста, дайте мне знать, если понадобятся дополнительные разъяснения.

1 ответ

Получение результатов декартовых объединений - известная проблема с представлениями SQL, основанными на индексах Range в MarkLogic, особенно с агрегированными документами, как описано выше.

Самый простой способ решить эту проблему для представлений SQL состоит в том, чтобы разделить ваши документы на отдельные Политики со встроенными копиями клиента. Это может означать значительное количество дублирования данных, если клиенты часто используют несколько политик.

Можно также рассмотреть возможность разделения этих документов и отдельного хранения политик и сведений о клиенте с идентификаторами идентификаторов от политики к клиенту, чтобы впоследствии можно было объединить их вместе в Tableau или SQL.

MarkLogic 9 поставляется с новой функцией, которая позволит избежать всего этого. Это называется извлечением из шаблона. Он также предоставляет представления SQL для данных, но работает по-другому. Это управляется с шаблоном совпадения (называется context), который контролирует строки в представлении. Вы бы использовали Policy как context в этом случае. Оттуда вы будете использовать относительные пути для перехода вверх по дереву к сведениям о клиенте и вниз для получения сведений о политике.

Шаблоны TDE устанавливаются с использованием tde:template-insert, Документация этой функции показывает простой пример такого TDE:

http://docs.marklogic.com/tde:template-insert

Вы также можете поиграть с tde:node-data-extract во-первых, чтобы овладеть этим.

НТН!

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