我注意到虽然 rdf-insert 不允许您指定文档,但只能指定图形。

最佳答案

首先,这里的关键是要认识到在 MarkLogic 中有两种存储和管理三元组的方法。

  • 管理三元组 - 这是您想要将 MarkLogic 用作“三元组存储”的地方。
    您可以使用 mlcp(命令行批量加载器)或 sem:rdf-load() 或 sem:rdf-insert() 加载三元组。
    在这种情况下,您不想知道或关心三元组存储在哪些文档中 - 您只想加载三元组,以便稍后可以使用 SPARQL 查询它们。
    这就是为什么 sem:rdf-insert() 没有“将其插入此文档”参数的原因。
  • 嵌入三元组 - 三元组嵌入在 XML(或 JSON)文档中。
    在这种情况下,三元组在概念上是文档的一部分;因此,如果您想在文档中插入一个三元组(在文档中嵌入一个三元组),您应该查看文档操作 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/

    10-11 20:52