如何将三元组插入特定的XML文档?

时间:2014-12-11 08:56:31

标签: marklogic

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

3 个答案:

答案 0 :(得分:3)

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

  1. 托管三元组 - 这是您希望将MarkLogic用作"只是三重商店"的地方。 使用mlcp(命令行批量加载程序)或sem:rdf-load()或sem:rdf-insert()加载三元组。 在这种情况下,您不想知道或关心存储三元组的文档 - 您只想加载三元组,以便稍后可以使用SPARQL查询它们。 这就是sem:rdf-insert()没有"将其插入到本文档中的原因"参数。

  2. 嵌入式三元组 - 三元组嵌入在XML(或JSON)文档中。 在这种情况下,三元组在概念上是文档的一部分;因此,如果要在文档中插入三元组(在文档中嵌入三元组),则应该查看文档操作API而不是三元组操作API。

  3. 一旦你拥有了这个心智模型,你可以选择使用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节点,看看它是否被编入索引?