MarkLogic模板驱动的提取和三元组:处理数组节点

时间:2017-11-23 06:32:35

标签: marklogic marklogic-9

我一直在研究这里的例子:https://docs.marklogic.com/guide/semantics/tde#id_25531

我有一组文档,这些文档由父名称和具有自己名称的子节点数组构成。我想创建一个模板,生成格式为#34的三元组; name1是-2-parent-of name2"。这是我尝试过的一项测试,其中包含文档结构示例:

declareUpdate();

xdmp.documentInsert(
       '/test/tde.json',
       {
         content: {
           name:'Joe Parent',
           children: [
             {
               name: 'Bob Child'
             },
             {
               name: 'Sue Child'
             }
           ]
         }
       },
       {permissions : xdmp.defaultPermissions(),
        collections : ['test']})

cts.doc('/test/tde.json')

var tde = require("/MarkLogic/tde.xqy");
// Load the user template for user profile rows
var template = xdmp.toJSON(
{
  "template":{
    "context":"content",
    "collections": [
      "test"
    ],
      "triples":[
      {
        "subject": {
          "val": "xs:string(name)"
        },
        "predicate": {
          "val": "sem:iri('is-parent-of')"
        },
        "object": {
          "val": "xs:string(children/name)"
        }     
      }
    ]   
  }
}
);
//tde.validate([template]),
tde.templateInsert("/templates/test.tde", template);
tde.nodeDataExtract( 
  [cts.doc( '/test/tde.json' )]
)

但是,上面引发了一个异常:

  

[javascript] TDE-EVALFAILED:tde.nodeDataExtract([cts.doc(" /test/tde.json")]) - 对象的Eval =' xs:string(儿童/名称)'返回TDE-BADVALEXPRESSION:无效的val表达式:XDMP-CAST :(错误:FORG0001)无效的强制转换:(fn:doc(" /test/tde.json")/ content / array-node(&#34) ; children")/ object-node()[1] / text(" name"),fn:doc(" /test/tde.json")/ content / array -node(" children")/ object-node()[2] / text(" name"))强制转换为xs:string?

将数组节点提取到三元组的正确语法是什么?

第二个有点相关的问题:说我也想要形式三元组" child1 is-sibling-of child2"。对于上面的例子,它将是" Bob Child是Sue Child的兄弟姐妹"。这个的正确语法是什么?我甚至不确定如何从这个开始。

TDE甚至可以去这里吗?或者以编程方式执行此操作会更好吗?即在文件摄取时,直接在文档中生成这些三元组?

(如果相关,则使用的ML版本为9.)

1 个答案:

答案 0 :(得分:3)

更改模板的上下文以匹配每个子项,然后从每个子项而不是父项中投影三元组。

上下文为-L/usr/local/cuda-9.0/lib64 -lcudart -lcufft ,对象val为children,然后为了选择它的父级,将相对于子级的主题val的选择调整为xs:string(name)

xs:string(../../name)