MarkLogic 模板驱动的提取和三元组:处理数组节点
MarkLogic template driven extraction and triples: dealing with array nodes
我一直在研究这里的例子: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)' returns TDE-BADVALEXPRESSION: Invalid val expression: XDMP-CAST: (err:FORG0001) Invalid cast: (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")) cast as xs:string?
将数组节点提取到三元组中的正确语法是什么?
第二个有点相关的问题:说我也想要 "child1 is-sibling-of child2" 形式的三元组。对于上面的示例,它将是 "Bob Child is-sibling-of Sue Child"。正确的语法是什么?我什至不确定如何从这个开始。
TDE 是否适合这里?还是以编程方式执行此操作更好?即在文档摄取时,直接在文档中生成那些三元组?
(如果相关,则使用的 ML 版本为 9。)
更改模板的上下文以匹配每个 children,然后从每个 child 而不是 parent 投影三元组。
上下文为 children
,object val 为 xs:string(name)
然后为了 select 为 parent,调整 selection of the subject val relative from the child to be 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)"
}
}
]
}
}
);
我一直在研究这里的例子: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)' returns TDE-BADVALEXPRESSION: Invalid val expression: XDMP-CAST: (err:FORG0001) Invalid cast: (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")) cast as xs:string?
将数组节点提取到三元组中的正确语法是什么?
第二个有点相关的问题:说我也想要 "child1 is-sibling-of child2" 形式的三元组。对于上面的示例,它将是 "Bob Child is-sibling-of Sue Child"。正确的语法是什么?我什至不确定如何从这个开始。
TDE 是否适合这里?还是以编程方式执行此操作更好?即在文档摄取时,直接在文档中生成那些三元组?
(如果相关,则使用的 ML 版本为 9。)
更改模板的上下文以匹配每个 children,然后从每个 child 而不是 parent 投影三元组。
上下文为 children
,object val 为 xs:string(name)
然后为了 select 为 parent,调整 selection of the subject val relative from the child to be 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)"
}
}
]
}
}
);