Re: Query on the XML graph

Michael Brundage <[email protected]>
Newsgroups gmane.comp.web.query-languages
Message-ID <BC4C4A89.100C%[email protected]>
XPath can follow ID/IDREF edges (in one direction) using the id() function.

Also, XPath can do self-joins, and when extended with the document() (or
doc()) function, it can do cross-document joins.  The kinds of joins that
can be expressed are limited by XPath's inability to introduce variables
(aliases).

Some joins are built-in to the semantics of XPath.  For example,
//A[B/C > B/D]
Iterates over the B children of A twice (independently, as a cross-product).


Other joins are possible using absolute paths in predicates to achieve
independence.

For example, given a structure containing Employee elements with ID and
ReportsTo attributes (typed as ID, IDREF, respectively), here are some joins
expressed using XPath 1.0:

(: the manager of a particular employee :)
Id(//Employee[@ID='X1']/@ReportsTo)

(: all managers - i.e., all employees with at least one direct report :)
//Employee[//Employee/@ReportsTo = @ID]

(: employees who report to people not in the organization, or report to no
one :)
//Employee[not(@ReportsTo = //Employee/@ID)]

(: their direct reports :)
//Employee[@ReportsTo = //Employee[not(@ReportsTo = //Employee/@ID)]/@ID]

etc.

Other joins are difficult to express, require unnatural syntax, or are
outright inexpressible using XPath 1.0:

(: all employees with at least two direct reports
  You'd like to do: :)
//Employee[count(//Employee[@ReportsTo = $outer/@ID]) >= 2]
(: or :)
//Employee[count(id(//Employee/@ReportsTo)[@ID = $outer/@ID]) >= 2]
(: but you have no way to introduce an alias to the outer Employee.
If XPath had an idref() function, you could do something like: :)
//Employee[count(idref(@ID)) >= 2]


(: managers whose entire organization is a certain size
 - there's no way to count subtrees unless the hierarchy already represents
the relationship.  For example, :)
//Employee[count(.//Employee)]
(: is trivial, but there's no way to recursively follow ID/IDREF edges :)

etc.



Hope this helps,
 
Michael Brundage
[email protected]

Writing as
Author, XQuery: The XML Query Language (Addison-Wesley, 2004)
Co-author, Professional XML Databases (Wrox Press, 2000)

not as
Technical Lead
Common Query Runtime/XML Query Processing
WebData XML Team
Microsoft



On 2/8/04 7:16 PM, "Jim Tivy" <[email protected]> wrote:
> One way to accomplish cross document links is use foreignkey/primary key
> relationships and then do joins using XQuery.
> 
>> -----Original Message-----
>> From: [email protected] [mailto:[email protected]]On Behalf Of
>> Jiang Ming Fei
>> Sent: Sunday, February 08, 2004 6:48 PM
>> To: [email protected]
>> Cc: [email protected]
>> Subject: Query on the XML graph
>> 
>> 
>> 
>> I am now doing the research on the XML graph. What I am wondering about is
>> that how the nowaday query engines cope with the XML files that have idref
>> attributes, or XML graph? Since XPath have no notation for the idref/id
>> edge. Or I miss some details?  So can I always treat the XML document as
>> a tree with the special node, i.e. idref node?
>> 
>> Thank you in advance for your suggestion.
>> 
>> Regards,
>> Fianny
>> 
>> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.