将图形与 XML-tree 同步并对其应用坐标轴

Synchronize graph with XML-tree and apply axes to them

我将带有循环和多个 parents 的图形转换为 XML,这样我就可以在其上使用 XQuery。 该图在左侧,XML-tree 在右侧。 我通过写下第一个节点(节点 1)的所有 child 节点来转换图形,并在 returned 节点上重复该操作,直到不再有 children 存在或节点已经存在访问过(如节点 2)。 此外,我添加了约束,即所有具有相同编号的节点都必须被 selected,如果其中一个节点被 selected。 (例如,如果节点 2(child of 1)被 selected,那么我们还必须 select 节点 2(child of 6)在 XML-tree.) 我可以在图表上使用的操作是:getPatents、getChildren、readValue(node)。 在图中,所有信息都存储在节点中,而在XML-tree中,节点的所有信息都存储为属性。

我的问题:我想同步两个结构,这样我就可以在图上和 XML-tree 上应用像祖先(或后代)这样的轴得到相同的结果。(我可以用 Python 和 XQuery 的 XML-tree 解析图)

我的问题:如果我select图上的节点8并应用祖先函数,它将return:4、5、2 , 1, 6, 3(6 和 3 因为循环)。 XML-tree 上的祖先轴将 return(我们必须 select 两个 8):4、5、2、1(第二个 2,(child of 6)由于约束,也将被 selected,但不是节点 6 和 3)。

我的解决方案:更改祖先轴,使其 return 包含所有 parents 的 selected 节点,然后应用约束,然后 select 再次全部 parents 等等。但这种解决方案似乎非常复杂且效率低下。有没有更好的方法?

感谢您的帮助

我认为解决该特定格式并使用 XSLT/XQuery/XPath 作为大多数步骤或 exceptintersect 或任意顺序强加的文档顺序并不容易XQuery 分组让你很难建立你想要的节点和遍历它们的顺序,我能想到的最简单的是

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

declare option output:method 'text';
declare option output:item-separator ', ';

declare variable $main-root := /;

declare function local:eliminate-duplicates($nodes as node()*) as node()*
{
    for $node at $p in $nodes
    group by $id := generate-id($node)
    order by head($p)
    return head($node)
};

declare function local:get-parents($nodes as element(node)*, $collected as element(node)*) as element(node)*
{
  let $new-parents := 
    for $p in local:eliminate-duplicates($nodes ! ..)
    return $main-root//node[@value = $p/@value][not(. intersect $collected)]
  return
    if ($new-parents)
    then local:get-parents($new-parents, ($collected, $new-parents))
    else $collected
};


local:get-parents(//node[@value = 8], ()) ! @value ! string()

https://xqueryfiddle.liberty-development.net/gWmuPs8 给出 4, 5, 2, 2, 1, 6, 3.

工作的效率部分取决于用于 node[@value = $p/@value] 比较的任何索引,在 XSLT 中,您可以确保使用密钥 (https://xsltfiddle.liberty-development.net/aiyneS),在面向数据库的 XQuery 处理器中,可能使用基于属性的索引。