在 XQuery 中搜索两个图节点之间的路径

2023-12-30

我正在尝试创建一种算法,用于搜索并返回 xQuery 中图形中两个节点之间的路径,但到目前为止我没有运气,因为它只返回一个节点及其相邻节点。首先,我应该明确该图是一个有向图,每个节点可以有零个、一个或多个原点,在 XML 中,节点仅具有到其原点的链接,但不具有到其后续节点的链接

下面是一些节点及其 XML 的示例

<node>
  <id> 123-456-789</id>
  <name> something </name>
  <Links>
     <Link>
        <origin></origin>
     </Link>
  <Links>

 <node>
  <id> 245-678-901</id>
  <name> node 2</name>
  <Links>
     <Link>
        <origin> 123-456-789 </origin>
     </Link>
  <Links>

  <node>
  <id> xxx-xxx-xxx</id>
  <name> node 3</name>
  <Links>
     <Link>
        <origin> 123-456-789 </origin>
     </Link>
  <Links>

  <node>
  <id> 234-546-768</id>
  <name> node 4</name>
  <Links>
     <Link>
        <origin> 245-678-901</origin>
     </Link>
  <Links>

从该 XML 我想获取从节点 1 到节点 4 的路径(节点 1-> 节点 2 -> 节点 4) 但无论我尝试做什么只会给我node1-node2和node3而不是node4 另一件事是我想选择一条不直接的路径,我的意思是,如果我想要节点5和节点7之间的路径,但节点5和节点7都指向节点6

我尝试将此 python 代码改编为 xquery

def BFS(graph,start,end,q):

temp_path = [start]

q.enqueue(temp_path)

while q.IsEmpty() == False:
    tmp_path = q.dequeue()
    last_node = tmp_path[len(tmp_path)-1]
    print tmp_path
    if last_node == end:
        print "VALID_PATH : ",tmp_path
    for link_node in graph[last_node]:
        if link_node not in tmp_path:
            new_path = []
            new_path = tmp_path + [link_node]
            q.enqueue(new_path)

(代码不是我的,它属于它的合法编码者此活动状态页面 http://code.activestate.com/recipes/576675/)

这是我尝试做的:

declare function local:BFS($graph as element()* , $ini_node as element(Node)*, $end_node as element(Node)*) as element()*
{
    let $seq := $ini_node
    let $queue := ($seq)
    for $item in $queue
        return
            if ( count($queue) > 0) then
                let $seq := remove($queue, count($queue))
                let $last := $seq[last()] return if (deep-equal($last, $end_node)) then $seq
                else
                    for $node in $graph[contains(.,$graph/id[contains(.,$last/Links/Link/origin/text())])] (: what i've tried was to get the graph nodes which id is equal to the origins of the last node :)
                        return if(not(functx:is-node-in-sequence-deep-equal($node,$seq))) then
                            let $new_path:= ()
                            let $new_path:= insert-before($seq, count($seq)+1, $node)
                            let $queue := insert-before($queue,1, $new_path) return $queue
                        else ()

            else
                ()


};

XQuery 和 Python 之间的根本区别在于 XQuery 是一个函数式编程语言 http://en.wikipedia.org/wiki/Functional_programming。这意味着绑定到变量的值之后无法修改。在你的函数中local:BFS(...)例如你不能改变的值$queue在循环内,您所做的就是创建一个新变量$queue遮蔽了外部。

为了让它工作,您可以将外循环编写为递归函数 http://en.wikipedia.org/wiki/Recursion_%28computer_science%29相反,它将当前队列作为参数。循环的每次迭代都是使用队列的更新版本调用该函数:

declare function local:BFS($graph, $queue, $steps, $end) {
  if(empty($queue)) then error(xs:QName('local:NOTFOUND'), 'No path found.')
  else (
    let $curr := $queue[1], $rest-queue := $queue[position() > 1]
    return (
      if($curr eq $end) then local:result($steps, $end)
      else (
        let $successors :=
          $graph//node[Links/Link/origin = $curr and not($steps/@to = id)]/id/string()
        let $new-steps  :=
          for $succ in $successors
          return <edge from="{$curr}" to="{$succ}" />
        return local:BFS(
          $graph,
          ($rest-queue, $successors),
          ($steps, $new-steps),
          $end
        )
      )
    )
  )
};

可以通过向起始节点提供第一条边来调用它:

declare function local:BFS($graph, $start, $end) {
  local:BFS($graph, $start, <edge to="{$start}" />, $end)
};

所有使用的边都存储在$steps。为了在找到目的地后重建路径,我们可以向后遍历它们,直到找到初始边缘:

declare function local:result($steps, $dest) {
  let $pred := $steps[@to = $dest]/@from/string()
  return if(exists($pred)) then (local:result($steps, $pred), $dest)
  else $dest
};

如果您担心性能,XQuery 序列可能不是用作队列的最佳数据结构。对于用于查找的 XML 片段也是如此。因此,如果您有权访问XQuery 3.0 http://www.w3.org/TR/xquery-30/处理器,你可以看看我写的一些(至少渐近)更有效的数据结构https://github.com/LeoWoerteler/xq-modules https://github.com/LeoWoerteler/xq-modules。我什至包括迪杰斯特拉算法 https://github.com/LeoWoerteler/xq-modules/blob/master/src/test/xquery/dijkstra.xq举个例子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 XQuery 中搜索两个图节点之间的路径 的相关文章

随机推荐

  • 注入 screen_on 事件以使传感器在屏幕关闭时工作

    我试图让传感器在屏幕关闭时工作 这是众所周知的错误 所有手机上都没有任何解决方案 我假设如果我发送 注入 screen on 事件 而实际上屏幕将关闭 我可以欺骗内核 您有什么想法如何检查我的假设并注入此类事件 你为什么不开始一个后台服务
  • 如何修复构建 IPA 时的 Xcode 6.1 错误

    今天刚刚升级到 Xcode 6 1 猜猜看 现在我在使用 TestFlight 桌面应用程序提交构建时遇到了问题 这是应用程序开始构建 IPA 时遇到的错误 错误 usr bin codedesign force preserve meta
  • 在 Rails 上创建新应用程序 ruby

    我对在 Rails 上使用 ruby 的 简单 工作感到有点困惑 因为我已经花了三天时间尝试创建一个应用程序 我从事 site5 托管工作 并尝试创建新的应用程序 一步步 rails new app d mysql gem install
  • UserControl 中的 wpf 绑定集合属性

    我有一个自定义用户控件 其中包含自定义对象的集合 public class Question FrameworkElement public readonly static DependencyProperty FullNameProper
  • Asp.Net MVC3:在 ValidationContext 中设置自定义 IServiceProvider,以便验证器可以解析服务

    2012 年 12 月 18 日更新 在 MVC 5 2 上 您可以利用窃取 安德拉斯的回答 https stackoverflow com a 5222249 11635和 MVC 源以及 1 推导DataAnnotationsModel
  • Mandelbrot 程序未输出正确的数据

    我的班级接到一个作业 要编写一个绘制曼德尔布罗图的程序 我们基本上必须让程序绘制结果的位图 事情是 我的CalcMBF函数仅输出2作为曼德尔布罗数 我完全不知道为什么会这样 谁能帮我吗 这是我的代码 using System using S
  • 带有粘性标题和水平、垂直滚动条的垫表

    我有一个垫子表 带有粘性标题和页面的垂直滚动 它工作正常 直到我动态添加更多列并出现水平滚动条 粘性标题停止工作 有什么办法让它发挥作用吗 请看例子 https stackblitz com edit angular hdg9xh http
  • NSDate格式问题

    这是来自 nsdate 格式化程序的代码 由于某种原因 值 dateSelected 不正确 而不是 2011 年 4 月 30 日 7 55PM 它返回 2011 05 01 02 55 知道我是什么吗做错了吗 NSDateFormatt
  • go mod供应商返回“所有匹配的没有包”

    我正在尝试设置一个新的存储库 其中将包含一些后端服务 名为backend 我创建了存储库 将其克隆到 home me go src github com myrepo backend 然后我做了以下事情 go mod init backen
  • 如何在 VS 代码中语法高亮 JavaScript 字符串中的 HTML? [复制]

    这个问题在这里已经有答案了 是否有任何 Vs Code 扩展可以在 JavaScript 字符串中语法突出显示 HTML 具体来说 我正在编写网络组件 const html content gt div table content tabl
  • codeigniter 分页类中使用_page_numbers?

    我在分页类中使用 use page numbers 配置设置为 true 时遇到问题 当我单击第 2 页的链接时 它从数据库检索的行数是正确的 但问题是 第二页的第一行是第一页的第三行 这意味着第 2 页从数据库中的同一行开始 该行已在第一
  • 为什么当工作交错时 TCP 写入延迟会更严重?

    我一直在分析 TCP 延迟 特别是write从用户空间到内核空间的小消息 以便获得对某个消息的延迟的一些直觉write 承认这可能是特定于上下文的 我注意到在我看来相似的测试之间存在很大的不一致 并且我非常想弄清楚差异从何而来 我知道微基准
  • 获取django应用程序的绝对路径

    我正在编写一个单元测试 需要访问我放在 django 应用程序目录下的 fixtures 目录中的图像文件 我想在测试中使用相对路径打开这个图像文件 这需要我获取 django 应用程序的绝对路径 有没有办法获取 django 应用程序的绝
  • 如何解析并输出具有动态值的JSON对象?

    我需要输出 JSON 对象 如下所示 dynamicvaluenumberone 3 dynamicvaluenumbertwo 7 在某些方面 看起来像 dynamicvaluenumberone 3 dynamicvaluenumber
  • 使用 Qt Creator 时的 CMake 配置问题

    我正在尝试使用 cmake 在 qt Creator 中设置构建环境 但无论我尝试什么 我都无法让它取得进展 它因问题而失败 配置问题 当展开一般消息部分中的详细信息时 它看起来像是无法编译测试 C 程序 我看不出我的 qt 创建者配置有什
  • Java:如何获取OS X Lion中的滚动方法?

    由于 OS X 支持 自然滚动 因此我的应用程序无法正常工作 自然滚动是为滚动窗格设计的 我真的很喜欢 但是 当我想放大 缩小时 它会出错 所以 我想做的是检查 OS X 的滚动方法 如果它是 自然的 我将采用与滚动值相反的值MouseWh
  • 如何在Numpy中实现ReLU函数

    我想制作一个使用 ReLU 函数的简单神经网络 有人可以告诉我如何使用 numpy 实现该函数吗 有几种方法 gt gt gt x np random random 3 2 0 5 gt gt gt x array 0 00590765 0
  • 如何在 EditText 中嵌入视图(带有按钮等)?

    我正在尝试找出如何嵌入东西 other与 Drawables 相比 在 EditText 小部件内 具体来说 我想到的例子来自 Google Buzz 小部件 截屏 http greydream org pics buzz png 没有内嵌
  • Google Apps 域上的 Google App Engine

    我无法将我的域名指向由 Google 应用引擎托管的网站 这是背景 注意区分 谷歌应用程序 域名托管 电子邮件等 和 谷歌应用程序引擎 网站框架 的概念 我有一个正在使用 Google Apps for Your Domain 的域 我们将
  • 在 XQuery 中搜索两个图节点之间的路径

    我正在尝试创建一种算法 用于搜索并返回 xQuery 中图形中两个节点之间的路径 但到目前为止我没有运气 因为它只返回一个节点及其相邻节点 首先 我应该明确该图是一个有向图 每个节点可以有零个 一个或多个原点 在 XML 中 节点仅具有到其