我注意到虽然rdf-insert
不允许您指定文档,但只允许指定图表。
答案 0 :(得分:3)
首先,这里的关键是要认识到MarkLogic中有两种存储和管理三元组的方法。
托管三元组 - 这是您希望将MarkLogic用作"只是三重商店"的地方。 使用mlcp(命令行批量加载程序)或sem:rdf-load()或sem:rdf-insert()加载三元组。 在这种情况下,您不想知道或关心存储三元组的文档 - 您只想加载三元组,以便稍后可以使用SPARQL查询它们。 这就是sem:rdf-insert()没有"将其插入到本文档中的原因"参数。
嵌入式三元组 - 三元组嵌入在XML(或JSON)文档中。 在这种情况下,三元组在概念上是文档的一部分;因此,如果要在文档中插入三元组(在文档中嵌入三元组),则应该查看文档操作API而不是三元组操作API。
一旦你拥有了这个心智模型,你可以选择使用sem:rdf-insert()如果你的三元组基本上是"自由浮动" - 即它所关注的文档并不重要。或者你可以选择使用像xdmp:node-insert-child()这样的东西,如果你真的想把这个三元组放在某个位置的现有文档里面。 (在MarkLogic 8中,您还可以使用SPARQL Update插入托管/自由浮动三元组。
那就是说,我想看看我是否能够以更简单,更直观的方式做节点插入子节点 - 即没有"技巧"上方。
首先,使用sem构建三元组是很好的:iri()和sem:上面的triple() - 尽管你可以直接在XML中构建三元组。使用sem:构造函数更加健壮。
其次,sem:triple()返回一个sem:triple类型的对象,而不是XML节点。因此,您无法直接将其传递给xdmp:node-insert-child()。 但是一个辅助函数,可以从sem:triple转换为XML节点 - sem:rdf-serialize(),带有" triplexml"选项。
所以你可以这样做:
xdmp:document-insert( "/test/test.xml", <doc><title>test</title></doc>)
然后:
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
xdmp:node-insert-child(
fn:doc('/test/test.xml')/doc,
sem:rdf-serialize(
sem:triple(sem:iri("Firefly"), "is-a", "TV show"),
"triplexml"
)
)
......你会得到:
fn:doc('/test/test.xml')
=&GT;
<doc>
<title>test</title>
<sem:triples xmlns:sem="http://marklogic.com/semantics">
<sem:triple>
<sem:subject>Firefly</sem:subject>
<sem:predicate datatype="http://www.w3.org/2001/XMLSchema#string">is-a</sem:predicate>
<sem:object datatype="http://www.w3.org/2001/XMLSchema#string">TV show</sem:object>
</sem:triple>
</sem:triples>
</doc>
答案 1 :(得分:2)
Alex,您可以使用xdmp:node-insert-child()将三元素插入到文档中。有一个技巧,即函数需要一个节点,而一个三元组不是一个节点。这有效:
xdmp:node-insert-child(
fn:doc('has-a-triple.xml')/doc,
<t>{sem:triple(sem:iri("Firefly"), "is-a", "TV show")}</t>/*
)
如果您在没有<t/>/*
技巧的情况下进行尝试,则会收到错误消息:
xdmp:node-insert-child(
fn:doc('has-a-triple.xml')/doc,
sem:triple(sem:iri("Firefly"), "is-a", "TV show")
)
返回
XDMP-ARGTYPE: (err:XPTY0004) xdmp:node-insert-child(fn:doc("has-a-triple.xml")/doc,
sem:triple(sem:iri("Firefly"), "is-a", "TV show")) -- arg2 is not of type node()
答案 2 :(得分:1)
虽然我不认为你可以使用rdf-insert做到这一点,但也许你可以查看文档中的嵌入三元组条目:
来自MarkLogic Semantics Developer's Guide
使用sem的三重文档:管理文档根目录的三元组 MarkLogic Server中的三元组。
您还可以在XML文档中嵌入三元组并将其加载到 MarkLogic按原样。
例如:
<?xml version="1.0" encoding="UTF-8"?> <article> <info> <title>News for April 9, 2013</title> <sem:triples xmlns:sem="http://marklogic.com/semantics> <sem:subject>http://example.org/article</sem:subject> <sem:predicate>http://example.org/mentions</sem:predicate> <sem:object>http://example.org/London</sem:object> </sem:triples> </info> </article>
加载的三元组会自动编入特殊用途 三重指数。三重索引允许您立即搜索 您拥有所需权限的RDF数据。
所以也许你可以尝试在文档中插入一个sem:triples节点,看看它是否被编入索引?