我注意到虽然 rdf-insert
不允许您指定文档,但只能指定图形。
最佳答案
首先,这里的关键是要认识到在 MarkLogic 中有两种存储和管理三元组的方法。
您可以使用 mlcp(命令行批量加载器)或 sem:rdf-load() 或 sem:rdf-insert() 加载三元组。
在这种情况下,您不想知道或关心三元组存储在哪些文档中 - 您只想加载三元组,以便稍后可以使用 SPARQL 查询它们。
这就是为什么 sem:rdf-insert() 没有“将其插入此文档”参数的原因。
在这种情况下,三元组在概念上是文档的一部分;因此,如果您想在文档中插入一个三元组(在文档中嵌入一个三元组),您应该查看文档操作 API 而不是三元组操作 API。
一旦你有了那个心智模型,你可以选择使用 sem:rdf-insert() 如果你的三元组本质上是“自由 float 的” - 即它在哪个文档中并不重要。或者你可以选择使用类似 xdmp 的东西:node-insert-child() 如果您真的想将该三元组放在现有文档中的某个位置。
(在 MarkLogic 8 中,您还可以使用 SPARQL 更新来插入托管/自由 float 三元组。
也就是说,我想看看我是否可以以更简单、更直观的方式执行节点插入子节点 - 即没有上面的“技巧”。
首先,最好使用上面的 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')
=>
<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>
关于marklogic - 如何将三元组插入特定的 XML 文档?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27418817/