Табличное моделирование данных 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>

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

Теперь после этого он решает проблему с дублированием, а также результирующий набор декартовых соединений. Он предоставляет уникальный набор записей для каждой сущности (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.

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

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


person Nikunj Vekariya    schedule 13.09.2016    source источник
comment
Вы проверяли Сообщество Tableau на предмет ответов? community.tableau.com/search.jspa?q=marklogic   -  person Pallavi    schedule 04.01.2018


Ответы (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, чтобы понять это.

HTH!

person grtjn    schedule 25.05.2018