我正在使用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
之间的关系请仔细阅读代码段,如果需要更多说明,请告知我们
答案 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!