1

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

我有一组文档,这些文档由父名称和一组具有自己名称的子节点组成。我想创建一个模板来生成“name1 is-a-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 for Object='xs:string(children/name)' 返回 TDE-BADVALEXPRESSION: Invalid val表达式:XDMP-CAST: (err:FORG0001) 无效转换:(fn:doc("/test/tde.json")/content/array-node("children")/object-node()[1]/text ("name"), fn:doc("/test/tde.json")/content/array-node("children")/object-node()[2]/text("name")) 转换为 xs :细绳?

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

第二个相关的问题:假设我也想要“child1 is-sibling-of child2”形式的三元组。对于上面的示例,它将是“Bob Child is-sibling-of Sue Child”。什么是正确的语法?我什至不知道如何从这个开始。

TDE甚至是去这里的路吗?还是以编程方式执行此操作更好?即在文档摄取时,直接在文档中生成那些三元组?

(如果相关,正在使用的 ML 版本是 9。)

4

1 回答 1

4

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

在上下文为 的情况下children,对象 val 是xs:string(name),然后为了选择它的父对象,将对象 val 相对于子对象的选择调整为xs:string(../../name)

var template = xdmp.toJSON(
{
  "template":{
    "context":"children",
    "collections": [
      "test"
    ],
      "triples":[
      {
        "subject": {
          "val": "xs:string(../../name)"
        },
        "predicate": {
          "val": "sem:iri('is-parent-of')"
        },
        "object": {
          "val": "xs:string(name)"
        }     
      }
    ]   
  }
}
);
于 2017-11-23T15:50:14.110 回答