在 MarkLogic 中搜索语义标记文档
Searching semantically tagged documents in MarkLogic
任何人都可以向我指出 MarkLogic
中语义标记和查询语义标记文档的一些简单示例吗?
我在这方面还很新,所以一些初学者级别的例子就可以了。
当您说 "semantically tagged" 时,您是指恰好包含一些三元组的常规 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"))))))
如果您正在谈论使用语义技术来丰富您的内容,MarkLogic 不会直接提供这种技术。
您可以从外部丰富您的内容,例如通过调用像 OpenCalais 提供的服务这样的 public 服务,然后在插入之前插入内容的丰富内容。
您还可以构建查找值列表,然后使用 cts:highlight 在您的内容中标记此类术语。这可能很简单:
let $labels := ("MarkLogic", "Whosebug")
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!
任何人都可以向我指出 MarkLogic
中语义标记和查询语义标记文档的一些简单示例吗?
我在这方面还很新,所以一些初学者级别的例子就可以了。
当您说 "semantically tagged" 时,您是指恰好包含一些三元组的常规 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"))))))
如果您正在谈论使用语义技术来丰富您的内容,MarkLogic 不会直接提供这种技术。
您可以从外部丰富您的内容,例如通过调用像 OpenCalais 提供的服务这样的 public 服务,然后在插入之前插入内容的丰富内容。
您还可以构建查找值列表,然后使用 cts:highlight 在您的内容中标记此类术语。这可能很简单:
let $labels := ("MarkLogic", "Whosebug")
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!