2

我有以下 2 个文件。1 个文档包含以下数据:

<Content>
  <sem:triples xmlns:sem="http://marklogic.com/semantics">
    <sem:triple>
      <sem:subject>http://sector#Basic_Materials</sem:subject>
      <sem:predicate>http://relationship#isTRBCEconomicSectorOf</sem:predicate>
      <sem:object>http://company#CST_Mining_Group_Limited</sem:object>
    </sem:triple>
  </sem:triples>
  <AnalystName>Henrik Christiansson</AnalystName>
  <DocumentFormat>pdf</DocumentFormat>
</Content>

另一个包含以下数据的文档:

<Content>
  <sem:triples xmlns:sem="http://marklogic.com/semantics">
    <sem:triple>
      <sem:triple>
        <sem:subject>http://sector#Energy_-_Fossil_Fuels</sem:subject>
        <sem:predicate>http://relationship#isTRBCEconomicSectorOf</sem:predicate>
        <sem:object>http://company#Bodycote_PLC</sem:object>
      </sem:triple>
    </sem:triple>
  </sem:triples>
  <AnalystName>Pawel Dziedzic</AnalystName>
  <DocumentFormat>pdf</DocumentFormat>
</Content>

我在这两个嵌入式三元组之间建立了关系

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

INSERT DATA
{

  <http://company#CST_Mining_Group_Limited> rdfs:subClassOf <http://company#Bodycote_PLC> .

}

当我查询以获取 Bodycote Plc 的经济部门的所有结果时,我得到了两个三元组,这是正确的,但是当我使用组合查询时,它并没有给我所需的结果。

例如,当查询具有 BodyCote 的经济部门并且分析师姓名是 Henrik Christiansson 时,我希望它返回第一个三元组,但它没有。

我使用了以下查询:

xquery version "1.0-ml";

import module namespace sem = "http://marklogic.com/semantics" 
  at "/MarkLogic/semantics.xqy";

sem:sparql(
  'SELECT ?subject
   WHERE {
     ?subject <http://relationship#isTRBCEconomicSectorOf> <http://company#Bodycote_PLC>
   }',
  (),
  (),
  cts:and-query( (
    cts:element-value-query( xs:QName("AnalystName"), "Henrik Christiansson" )
  ) )
)

我想知道是否有一种方法可以在组合查询中应用推理。

4

1 回答 1

1

您的方法的问题在于 cts:query 仅选择相关文档,而不是指定子类的托管三元组。您在这里没有使用真正的推理,而是实际上通过添加三元组来外部化推理规则。改用规则集,这样更灵活,效果也更好。有关详细信息,请参阅语义指南

准备好规则集文件后,您需要将查询包装在sem:store中,然后使用sem:ruleset-store应用规则集:

sem:sparql(
  '
    SELECT ?subject
    WHERE {
      ?subject <http://relationship#isTRBCEconomicSectorOf <http://company#Bodycote_PLC>
    }
  ',
  (),
  (),
  sem:ruleset-store(
    "myrules",
    sem:store(
      (),
      cts:and-query((
       cts:element-value-query( xs:QName("AnalystName"), "Henrik Christiansson" )
      ))
    )
  )
)

于 2015-06-26T12:59:16.273 回答