在MarkLogic中搜索语义标记的文档

时间:2015-03-17 03:48:38

标签: semantics marklogic

任何人都可以指出一些简单的语义标记示例,并在MarkLogic中查询语义标记的文档吗?

我在这方面相当新,所以一些初学者水平的例子会做。

2 个答案:

答案 0 :(得分:3)

当你说"语义标记"你的意思是普通的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"))))))

答案 1 :(得分:3)

如果您正在讨论使用语义技术丰富您的内容,那么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!