Tableau MarkLogic数据建模

时间:2016-09-13 07:39:54

标签: tableau marklogic marklogic-8

我正在使用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。我在Policy上创建了片段根目录。 类似的声明,投诉,计费,报价对于单个策略可以是多个,我已经在每个策略上创建了碎片根。

现在执行此操作后,它解决了重复问题以及笛卡尔连接结果集。它为每个实体(CustomerInfo,Policy,Claims,Complaints,Quote,Employer,Billing)提供了唯一的记录集。

但是我无法将这些实体相互关联(如在foreign-primary key中)。

我用元素范围和所有创建了以下视图。我只粘贴客户和政策详细信息,如果这解决了其他实体可以进行类似管理

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控制台中显示零结果。 如果我删除它,给出独特的记录,但彼此没有任何关系。 我想要的只是实现Policy-Customer

之间的关系

请仔细阅读代码段,如果需要更多说明,请告知我们

1 个答案:

答案 0 :(得分:1)

获取笛卡尔连接结果是MarkLogic中从Range索引驱动的SQL视图的一个已知问题,特别是对于上面的聚合文档。

解决SQL视图的最简单方法是将文档拆分为单独的策略,并将客户的嵌入副本分成。如果客户经常有多个政策,这可能意味着相当数量的数据重复。

您还可以考虑将这些文档分开,并分别存储策略和客户详细信息,并将id refs从策略发送给客户,以便您可以在之后,Tableau或SQL中将它们连接在一起。

MarkLogic 9附带了一项新功能,可以避免所有这些需求。它被称为Template Driven Extraction。它还提供有关数据的SQL视图,但以不同的方式工作。它由匹配模式(称为context)驱动,该模式控制视图中的行。在这种情况下,您可以使用Policy作为context。从那里,您将使用相对路径将树上升到客户详细信息,然后下载以获取策略详细信息。

使用tde:template-insert安装TDE模板。该函数的文档显示了这样一个TDE的简单示例:

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

你也可以先使用tde:node-data-extract来玩弄它。

HTH!