【问题标题】:Searching semantically tagged documents in MarkLogic在 MarkLogic 中搜索语义标记的文档
【发布时间】:2015-03-17 03:48:38
【问题描述】:

谁能指出一些简单的语义标记示例和查询MarkLogic 中的语义标记文档?

我是这个领域的新手,所以一些初学者级别的例子就可以了。

【问题讨论】:

    标签: semantics marklogic


    【解决方案1】:

    当您说“语义标记”时,您是指其中恰好有一些三元组的常规 XML 文档吗? http://docs.marklogic.com/guide/semantics/embedded 的讨论和示例非常适合。

    首先在您的数据库中启用三重索引。然后插入一个测试文档。这只是 XML,但 sem:triple 元素代表了一个语义事实。

    xdmp:document-insert(
      'test.xml',
      <test>
        <source>AP Newswire</source>
        <sem:triple date="1972-02-21" confidence="100">
          <sem:subject>http://example.org/news/Nixon</sem:subject>
          <sem:predicate>http://example.org/wentTo</sem:predicate>
          <sem:object>China</sem:object>
        </sem:triple>
      </test>)
    

    然后查询它。示例查询非常复杂。为了了解发生了什么,我将在该示例文档上插入变体,使用不同的 URI 而不仅仅是 test.xml,并查看各种查询术语如何匹配。尝试仅使用 SPARQL 组件,而不使用额外的 cts 查询。尝试不带 SPARQL 的 cts:search,只使用 cts:query。

    xquery version "1.0-ml";
    import module namespace sem = "http://marklogic.com/semantics" 
      at "/MarkLogic/semantics.xqy";
    sem:sparql('
      SELECT ?country
      WHERE {
    <http://example.org/news/Nixon> <http://example.org/wentTo> ?country
      }
      ',
     (),
     (),
     cts:and-query((
       cts:path-range-query( "//sem:triple/@confidence", ">", 80) ,
       cts:path-range-query( "//sem:triple/@date", "<",     xs:date("1974-01-01")),
       cts:or-query((
         cts:element-value-query( xs:QName("source"), "AP Newswire"),
         cts:element-value-query( xs:QName("source"), "BBC"))))))
    

    【讨论】:

      【解决方案2】:

      如果您正在谈论使用语义技术丰富您的内容,MarkLogic 并不直接提供。

      您可以在外部丰富您的内容,例如调用 OpenCalais 提供的公共服务,然后在插入之前将丰富内容插入到内容中。

      您还可以构建查找值列表,然后使用 cts:highlight 在您的内容中标记此类术语。这可能很简单:

      let $labels := ("MarkLogic", "StackOverflow")
      return
        cts:highlight($doc, cts:word-query($labels), <b>{$cts:text}</b>)
      

      或者使用 spraql 进行更动态的替换:

      let $labels := map:new()
      let $_ := 
        for $result in sem:sparql('
          PREFIX demo: <http://www.marklogic.com/ontologies/demo#>
      
          SELECT DISTINCT ?label
          WHERE {
            ?s a demo:person. 
            {
              ?s demo:fullName ?label 
            } UNION {
              ?s demo:initialsName ?label 
            } UNION {
              ?s demo:email ?label 
            }
          }
        ')
        return
          map:put($labels, map:get($result, 'label'), 'person')
      return
        cts:highlight($doc, cts:word-query(map:keys($labels)), 
          let $result := sem:sparql(concat('
            PREFIX demo: <http://www.marklogic.com/ontologies/demo#>
      
            SELECT DISTINCT ?s ?p
            {
              ?s a demo:', map:get($labels, $cts:text), ' .
              ?s ?p "', $cts:text, '" .
            } 
          '))
          return
            if (map:contains($labels, $cts:text))
            then
              element { xs:QName(fn:concat("demo:", map:get($labels, $cts:text))) } {
                attribute subject { map:get($result, 's') },
                attribute predicate { map:get($result, 'p') },
                $cts:text
              }
            else ()   
        )
      

      HTH!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-06
        • 1970-01-01
        • 1970-01-01
        • 2018-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多