XQuery:计算作者之间的距离

时间:2015-05-04 09:15:48

标签: xml xquery

我想计算书籍作者之间的距离。 一起出版书籍的作者的距离为1。 此外,如果a和b没有一起出版一本书,但它们都与c一起出版,则a和b之间的距离为2.

这是一个XML文件,例如:

ScriptManager.RegisterStartupScript(this,GetType(),"showalert","alert('Only alert Message');",true);

根据这个XML,作者和#34; Thibaut"之间的距离。以及其他如下:

  • Thibaut和Luc距离为1(因为他们有出版商book1在一起.. Thibaut - > Luc)
  • Thibaut和Jay距离2(因为Thibaut / Luc有出版商,Luc / Jay有出版商,所以Thibaut和Jay之间的距离是2 ... Thibaut - > Luc - > Jay)
  • Thibaut和Henry距离3(因为Thibaut - > Luc - > Jay - > Henry)
  • 我的XML示例很简短,但距离可以更高

对于我的XML文件中的每个作者X,我需要计算与所有其他作者y的距离(x!= y,所以不是同一作者) anabody知道如何在XQUery中编写代码吗?或者有算法的想法?

任何帮助表示赞赏, 谢谢!

1 个答案:

答案 0 :(得分:0)

您需要以某种方式在内存中表示您的图形,以便您可以在其上运行最短路径算法。事实上,您的上述文档可以被视为图形表示,但它可能是多余的(同一对作者可能已经共同出版了多本书)。

更好的图形表示可以是(其中)邻接列表,邻接矩阵或事件矩阵。见这里:http://en.wikipedia.org/wiki/Graph_%28abstract_data_type%29

由于您的图表可能很稀疏,因此您应该选择邻接列表。邻接列表具有节点 - >的形式。 List [Node],表示它将每个节点映射到其相邻节点的列表。在Java中,您可以选择Map(例如HashMap)将其存储在内存中。为了运行图算法,数据结构应具有较低的查找时间。 XQuery没有映射,但您可以创建xml片段作为变量的值。这是一个例子:

let $a := 
  <map>
    <author>
        <name>Luc</name>
        <coauthors>
          <name>Thibault</name>
        </coauthors>
    </author>
    <author>
      <name>Jay</name>
      <coauthors>
        <name>Henry</name>
        <name>Luc</name>
      </coauthors>
      ...
    </author>
  </map>    

请注意,这不是完整的图表表示,而只是边缘的子集。您需要定义一个子程序,用于从输入文档计算此中间结果。然后,您可以定义一个实用程序函数,该函数使用此中间结果为您提供给定作者姓名的紧邻作者。基于此,您可以实现最短路径算法。

请注意,上面的图表表示对查找相邻节点效率不高,我认为很难为相邻节点编写有效的查找函数。上面提到的查找函数需要在最坏的情况下遍历整个中间结果(如果你查找最后一个作者的相邻节点)。如果您担心运行时,我建议您使用您选择的通用编程语言(例如Java)。如果图形表示不适合存储器,则使用某种磁盘索引结构(例如由关系数据库提供)。