Course Hero - We put you ahead of the curve!
You have requested the below document.
- Title: XML-2
- Type: Notes
- School: Rutgers
- Course: 198 336
- Term: Fall
XML Querying Documents (based on notes by D.Suciu/UofW Suciua/Ramakrishnan/ Gehrke/Borgida 1 XPath http://www.w3.org/xpath Building block for other W3C standards: XSL Transformations (XSLT) XML Query Was originally part of XSL Suciua/Ramakrishnan/ Gehrke/Borgida 2 Example doc for XPath Queries <bib> <book> <publisher> Addison-Wesley </publisher> <author> Serge Abiteboul </author> <author> < rst-name> Rick </ rst-name> <last-name> Hull </last-name> </author> <author> Victor Vianu </author> <title> Foundations of Databases </title> <year> 1995 </year> </book> <book price= 55 > <publisher> Freeman </publisher> <author> Jeffrey D. Ullman </author> <title> Principles of Database and Knowledge Base Systems </title> <year> 1998 </year> </book> </bib> Suciua/Ramakrishnan/ Gehrke/Borgida 3 <bib> <book price= 55 > <publisher> Addison-Wesley </publisher> <author> Serge Abiteboul </author> <author> < rst-name> Rick </ rst-name> <last-name> Hull </last-name> </author> <author> Victor Vianu </author> <title> Foundations of Databases </title> <year> 1995 </year> </book> <book> <publisher> Freeman </publisher> <author> Jeffrey D. Ullman </author> <title> Principles of Knowledge Bases</title> <year> 1998 </year> </book> </bib> root bib book book price 55 publisher author author author title publisher year Freeman JeffU 1995 VictorV SergeA Suciua/Ramakrishnan/ Gehrke/Borgida author title year A-W rst name last name 1998 Pples of KB 4 Rick Hull Fnds of DB XPath: Simple Expressions /bib/book/year Result: <year> 1995 </year> <year> 1998 </year> /bib/paper/year Result: empty (there were no papers) Suciua/Ramakrishnan/ Gehrke/Borgida 5 XPath: Restricted Kleene Closure //author Result:<author> Serge Abiteboul </author> <author> < rst-name> Rick </ rst-name> <last-name> Hull </last-name> </author> <author> Victor Vianu </author> <author> Jeffrey D. Ullman </author> /bib// rst-name Result: < rst-name> Rick </ rst-name> Suciua/Ramakrishnan/ Gehrke/Borgida 6 Xpath: Wildcard //author/* Result: < rst-name> Rick </ rst-name> <last-name> Hull </last-name> * Matches any element /*/*/author/ authors at 3rd level Suciua/Ramakrishnan/ Gehrke/Borgida 7 Xpath: Local Info About Nodes /bib/book/author/text() Result: Serge Abiteboul Jeffrey D. Ullman Rick Hull doesn t appear because he has rstname, lastname Functions in XPath: text() = matches a text value name() = returns the name of the current tag /bib/book/*/name()! ~~> author Suciua/Ramakrishnan/ Gehrke/Borgida 8 Xpath: Attribute Nodes /bib/book/@price Result: 55 @price means that there is a price attribute with a value present Suciua/Ramakrishnan/ Gehrke/Borgida 9 Xpath: Quali ers /bib/book/author[ rstname] [ rstname] means has rstname element Result: <author> < rst-name> Rick </ rst-name> <last-name> Hull </last-name> </author> Suciua/Ramakrishnan/ Gehrke/Borgida 10 Xpath: Combining Quali ers /bib/book/author[ rstname][address[//zip][city]]/lastname Result: <lastname> </lastname> lastname of author (which has rstname and address (which has zip below and city)) Suciua/Ramakrishnan/ Gehrke/Borgida 11 Xpath: Quali ers with conditions on values /bib/book[@price < 60 ] /bib/book[author/@age < 25 ] /bib/book[author/text()] Suciua/Ramakrishnan/ Gehrke/Borgida 12 XPath: more tree traversal current node: . parent node: .. siblings? General axes: /bib// rst-name/.. ~~> <author> ..rick</author> author[3] ~~> 3rd child self::path-step parent::path-step child::path-step descendant::path-step ancestor::path-step descendant-or-self::path-step ancestor-or-self::path-step preceding-sibling::path-step following-sibling::path-step preceding::path-step following::path-step (previous XPaths we saw were in abbreviated form ) /bib//last-name/preceding::* ~~> < rst-name>hull</ tst-name> ( /bib//last-name/ <~~> /child::bib/descendant-or-self::last-name/ ) Suciua/Ramakrishnan/ Gehrke/Borgida 13 Xpath: Summary bib matches a bib element * matches any element / matches the root element /bib matches a bib element under root bib/paper matches a paper in bib bib//paper matches a paper in bib, at any depth //paper matches a paper at any depth //paper/.. matches the parent of paper at any depth paper | book matches a paper or a book @price matches a price attribute bib/book/@price matches price attribute in book, in bib bib/book/[@price< 55 ]/author/lastname matches Suciua/Ramakrishnan/ Gehrke/Borgida 14 XQuery Based on Quilt (which is based on XML-QL) http://www.w3.org/TR/xquery/ Check out Web Resources on remus for lots of tutorials We ll use an on-line interpreter http://db.bell-labs.com/galax/demo/galax_demo.html Suciua/Ramakrishnan/ Gehrke/Borgida 15 FLWOR ( Flower ) Expressions FOR ... LET... FOR... LET... WHERE... ORDER BY RETURN... Suciua/Ramakrishnan/ Gehrke/Borgida 16 XQuery Find all book titles published after 1995: variable URL Xpath FOR $x IN document("bib.xml")/bib/book WHERE $x/year > 1995 RETURN $x/title Result: <title> abc </title> <title> def </title> <title> ghi </title> Suciua/Ramakrishnan/ Gehrke/Borgida 17 schema de ne element bib { type Book* } de ne type Book { element book { attribute year { xsd:int }, element title { xsd:string }, (type Author+ | type Editor+), element publisher { xsd:string }, element price { xsd:decimal } } } de ne type Author { element author { element last { xsd:string }, element rst { xsd:string } } } de ne type Editor { element editor { element last { xsd:string }, element rst { xsd:string }, element af liation { xsd:string } } } de ne element reviews { type Entry* } de ne type Entry { element entry { type Title, type Price, type Review } } de ne type Title { element title { xsd:string } } de ne type Price { element price { xsd:string } } de ne type Review { element review { xsd:string } } de ne element prices { type PBook* } de ne type PBook { element book { element title { xsd:string }, element source { xsd:string }, element price { xsd:decimal } } } de ne de ne element title { text } element section { element title, element section* } de ne element chapter { element title, element section* } de ne de ne de ne de ne global $books { treat as document chapter (glx:document-validate("docs/books.xml","chapter")) } global $bib { treat as document bib (glx:document-validate("docs/xmpbib.xml","bib")) } global $reviews { treat as document reviews (glx:document-validate("docs/xmpreviews.xml","reviews")) } global $prices { treat as document prices (glx:document-validate("docs/prices.xml","prices")) } Suciua/Ramakrishnan/ Gehrke/Borgida 18 XQuery: make better use of Xpath Find all book titles published after 1995: FOR $b IN document("bib.xml")/bib/book[year > 1995] RETURN $b/title or even shorter document("bib.xml")/bib/book[year > 1995]/title Result: <title> abc </title> <title> def </title> <title> ghi </title> Suciua/Ramakrishnan/ Gehrke/Borgida 19 XQuery: constructing answers For all books published after 1995 return title and authors FOR $b IN document("bib.xml")/bib/book[year > 1995] RETURN <result> <the-title>{ $b/title/text() } </the-title> <authors> { $b/author } </authors> </result> If you left { } out, you ld get Beware of forgetting the { and }; they mean evaluate nested expression <authors> $b/author </author Suciua/Ramakrishnan/ Gehrke/Borgida 20 XQuery: nested queries For each author of a book by AW, list all books she published: FOR $a IN document("bib.xml") /bib/book[publisher= AW ]/author RETURN <result> { $a, FOR $t IN /bib/book[author=$a]/title RETURN $t } </result> Suciua/Ramakrishnan/ Gehrke/Borgida 21 XQuery Result: <result> <author>Jones</author> <title> abc </title> <title> def </title> </result> <result> <author> Smith </author> <title> ghi </title> </result> Suciua/Ramakrishnan/ Gehrke/Borgida 22 XQuery: LET expressions FOR $x IN expr -- binds $x in turn to each value in the list expr LET $x := expr -- binds $x once to the entire sequence expr Useful for common subexpressions and for aggregations Suciua/Ramakrishnan/ Gehrke/Borgida 23 XQuery <big_publishers> FOR $p IN document("bib.xml")//publisher LET $b := document("bib.xml")/book[publisher = $p] WHERE count($b) > 100 RETURN $p </big_publishers> count = a (aggregate) function that returns the number of elms Suciua/Ramakrishnan/ Gehrke/Borgida 24 XQuery Find books whose price is larger than average : LET $a := avg( document("bib.xml")/bib/book/price ) FOR $b in document("bib.xml")/bib/book WHERE $b/price > $a RETURN $b Suciua/Ramakrishnan/ Gehrke/Borgida 25 XQuery Summary: FOR-LET-WHERE-RETURN = FLWR FOR/LET Clauses List of tuples WHERE Clause List of tuples RETURN Clause Instance of Xquery data model Suciua/Ramakrishnan/ Gehrke/Borgida 26 FOR vs. LET FOR Binds node variables iteration LET Binds collection variables one value Returns: <result> <book>...</book></result> <result> <book>...</book></result> <result> <book>...</book></result> ... FOR $x IN document("bib.xml")/bib/book RETURN <result> { $x } </result> LET $x := document("bib.xml")/bib/book RETURN <result> { $x } </result> Returns: <result> <book>...</book> <book>...</book> <book>...</book> ... </result> 27 Suciua/Ramakrishnan/ Gehrke/Borgida Collections in XQuery Ordered and unordered collections /bib/book/author ~~> an ordered collection distinct_values(/bib/book/author) ~~> an unordered collection LET $b := /bib/book ~~> $b is a collection $b/author ~~> a collection (authors of all books) RETURN <result> { $b/author } </result> Returns: <result> <author>...</author> <author>...</author> <author>...</author> ... </result> 28 Suciua/Ramakrishnan/ Gehrke/Borgida Sequences in Xquery 1,2,3 = (1,2,3) = (1, (2,3),() ) () can be used as sort of a null; () + 2 = () but boolean logic is 2-valued: () and true() yields false() although there are automatic coercions for tests if x then ... else x a sequence ~~> check for non-null x a number ~~> check for non-zero (yuck!) Suciua/Ramakrishnan/ Gehrke/Borgida 29 If-Then-Else FOR $h IN //catalogoue RETURN <catalogue> { $h/title, IF $h/@type = "Journal" THEN $h/editor ELSE $h/author } </catalogue> Suciua/Ramakrishnan/ Gehrke/Borgida 30 Existential Quanti ers Books which have some paragraph containing both the words sailing and windsur ng FOR $b IN //book WHERE SOME $p IN $b//para SATISFIES contains($p, "sailing") AND contains($p, "windsur ng") RETURN $b/title Suciua/Ramakrishnan/ Gehrke/Borgida 31 Universal Quanti ers Books in which all paragraphs contain the word sailing FOR $b IN //book WHERE EVERY $p IN $b//para SATISFIES contains($p, "sailing") RETURN $b/title Suciua/Ramakrishnan/ Gehrke/Borgida 32 Try out queries at http://db.bell-labs.com/galax/demo/galax_demo.html Suciua/Ramakrishnan/ Gehrke/Borgida 33 Widom s DTD <!ELEMENT Bookstore (Book | Magazine)*> <!ELEMENT Book (Title, Authors, Remark?)> <!ATTLIST Book ISBN CDATA #REQUIRED Price CDATA #REQUIRED Edition CDATA #IMPLIED> <!ELEMENT Magazine (Title)> <!ATTLIST Magazine Month CDATA #REQUIRED Year CDATA #REQUIRED> <!ELEMENT Title (#PCDATA)> <!ELEMENT Authors (Author+)> <!ELEMENT Remark (#PCDATA)> <!ELEMENT Author (First_Name, Last_Name)> <!ELEMENT First_Name (#PCDATA)> <!ELEMENT Last_Name (#PCDATA)> Suciua/Ramakrishnan/ Gehrke/Borgida 34 <?xml version="1.0" standalone="no"?> <!DOCTYPE Bookstore SYSTEM "bookstore.dtd"> <Bookstore> <Book ISBN="ISBN-0-13-035300-0" Price="$65" Edition="2nd"> <Title>A First Course in Database Systems</Title> <Authors> <Author> <First_Name>Jeffrey</First_Name> <Last_Name>Ullman</Last_Name> </Author> <Author> <First_Name>Jennifer</First_Name> <Last_Name>Widom</Last_Name> </Author> </Authors> </Book> Suciua/Ramakrishnan/ Gehrke/Borgida 35 <Book ISBN="ISBN-0-13-031995-3" Price="$75"> <Title>Database Systems: The Complete Book</Title> <Authors> <Author> <First_Name>Hector</First_Name> <Last_Name>Garcia-Molina</Last_Name> </Author> <Author> <First_Name>Jeffrey</First_Name> <Last_Name>Ullman</Last_Name> </Author> <Author> <First_Name>Jennifer</First_Name> <Last_Name>Widom</Last_Name> </Author> </Authors> <Remark> Amazon.com says: Buy this book bundled with "A First Course," it's a great deal! </Remark> </Book> </Bookstore> Suciua/Ramakrishnan/ Gehrke/Borgida 36 Equality in XQuery (?) let $a := $bib//author for $last in distinct-values($a/last), $ rst in distinct-values($a[last = $last]/ rst) return <result> {$last, $ rst} { for $b in $bib/bib/book where some $ba in $b/author satis es ($ba/last = $last and $ba/ rst = $ rst) return $b/title } </result> } </results> Suciua/Ramakrishnan/ Gehrke/Borgida These 2 queries returned same answer, but the left one is the W3 use-case ? Debate on what equals means for elements. for $a in distinct-values($bib//author) return <result> {$a/last, $a/ rst} { for $b in $bib/bib/book where some $ba in $b/author satis es ($ba=$a) return $b/title 37 Flattening Flatten the authors, i.e. return a list of (author, title) pairs FOR $b IN document("bib.xml")/bib/book, $x IN $b/title, $y IN $b/author RETURN <answer> <title> { $x } </title> <author> { $y } </author> </answer> Suciua/Ramakrishnan/ Gehrke/Borgida Result: <answer> <title> abc </title> <author> efg </author> </answer> <answer> <title> abc </title> <author> hkj </author> </answer> 38 Re-grouping For each author, return all titles of her/his books FOR $b IN document("bib.xml")/bib, $x IN $b/book/author RETURN <answer> <author> { $x } </author> { FOR $y IN $b/book[author=$x]/title RETURN $y } </answer> Suciua/Ramakrishnan/ Gehrke/Borgida Result: <answer> <author> efg </author> <title> abc </title> <title> klm </title> . . . . </answer> What about duplicate authors ? 39 Same, but eliminate duplicate authors: FOR $b IN document("bib.xml")/bib LET $a := distinct-values($b/book/author/text() ) FOR $x IN $a RETURN <answer> <author> { $x }</author> { FOR $y IN $b/book[author=$x]/title RETURN $y } </answer> distinct-values eliminates duplicates collection of text values, not of elements) (but must be applied to a Suciua/Ramakrishnan/ Gehrke/Borgida 40 Re-grouping Same thing: FOR $b IN document("bib.xml")/bib, $x IN distinct-values($b/book/author/text()) RETURN <answer> <author> { $x } </author> { FOR $y IN $b/book[author/text()=$x]/title RETURN $y } </answer> Suciua/Ramakrishnan/ Gehrke/Borgida 41 Another Example Find book titles by the coauthors of Database Theory FOR $b IN document("bib.xml")/bib, $x IN $b/book[title= Database Theory ], $y IN $b/book[author = $x/author] RETURN <answer> { $y/title } </answer> Result: <answer> abc </ answer > < answer > def </ answer > < answer > abc </ answer > < answer > ghk </ answer > Suciua/Ramakrishnan/ Gehrke/Borgida 42 Distinct-values Same as before, but eliminate duplicates: FOR $b IN document("bib.xml")/bib, $x IN $b/book[title/text() = Database Theory ]/author/text(), $y IN distinct-values($b/book[author/text() = $x] /title/text()) RETURN <answer> { $y } </answer> distinct-values = a function that eliminates duplicates Result: <answer> abc </ answer > < answer > def </ answer > < answer > ghk </ answer > Need to apply to a collection of text values, not of elements note how query has changed Suciua/Ramakrishnan/ Gehrke/Borgida 43 SQL and XQuery Side-by-side Find all product names, prices Product(pid, name, maker, price) <db> <Product> <row> <pid 1234 /> <name bulb/> <maker </row> SELECT x.name, x.price FROM Product x FOR $x in document( db.xml )/db/Product/row RETURN <answer> { $x/name, $x/price } </answer> SQL Suciua/Ramakrishnan/ Gehrke/Borgida XQuery 44 Xquery s Answer <answer> <name> <price> </answer> <answer> <name> <price> </answer> . . . . abc </name> 7 </price> def </name> 23 </price> Notice: this is NOT a well-formed document ! (WHY ???) Suciua/Ramakrishnan/ Gehrke/Borgida 45 Producing a Well-Formed Answer <myQuery> { FOR $x in document( db.xml )/db/Product/row RETURN <row> { $x/name, $x/price } </row> } </myQuery> Suciua/Ramakrishnan/ Gehrke/Borgida 46 Xquery s Answer <myQuery> <row> <name> <price> </row> <row> <name> <price> </row> . . . . </myQuery> Suciua/Ramakrishnan/ Gehrke/Borgida abc </name> 7 </price> Now it is well-formed ! def </name> 23 </price> 47 SQL and XQuery Side-by-side Find all product names, prices sorted by price Product(pid, name, maker, price) FOR $x in $db/Product/row ORDER BY $x /price/text() RETURN <a> { $x/name, $x/price }</a> XQuery SELECT x.name, x.price FROM Product x ORDER BY price SQL Suciua/Ramakrishnan/ Gehrke/Borgida 48 Answer: <answer> <name> <price> </answer> <answer> <name> <price> </answer> .... abc </name> 7 </price> def </name> 23 </price> Notice: this is NOT a well-formed document ! (WHY ???) Suciua/Ramakrishnan/ Gehrke/Borgida 49 Producing well formed doc <result> { FOR $x in document( db.xml )/db/Product/row ORDER BY $x/price/text() RETURN <a> { $x/name, $x/price } </a> } <myQuery> </result> <a> </a> <a> <name> def </name> <price> 23 </price> </a> .... </myQuery> Suciua/Ramakrishnan/ Gehrke/Borgida <name> abc </name> <price> 7 </price> 50 SQL and XQuery Side-by-side Find all products made in Seattle Product(pid, name, maker, price) Company(cid, name, city, revenues) FOR $x in $db/Product/row, $y in $db/Company/row SELECT x.name WHERE FROM Product x, Company y $x/maker=$y/cid WHERE x.maker=y.cid and $y/city = Seattle and y.city= Seattle RETURN { $x/name } SQL Compact XQuery XQuery FOR $y in /db/Company/row[city= Seattle ], $x in /db/Product/row[maker=$y/cid] RETURN $x/name Suciua/Ramakrishnan/ Gehrke/Borgida 51 <product> <row> <pid> 123 </pid> <name> abc </name> <maker> efg </maker> </row> <row> . </row> </product> <product> . . . </product> . . . . Suciua/Ramakrishnan/ Gehrke/Borgida 52 SQL and XQuery Side-by-side For each company with revenues < 1M count the products over $100 SELECT c.name, count(*) FROM Product p, Company c WHERE p.price > 100 and p.maker=c.cid and c.revenue < 1000000 GROUP BY c.cid, c.name FOR $r in document( db.xml )/db, $c in $r/Company/row[revenue<1000000] RETURN <proudCompany> <companyName> { $c/name } </companyName> <numberOfExpensiveProducts> { count($r/Product/row[maker=$c/cid][price>100]) } </numberOfExpensiveProducts> </proudCompany> Suciua/Ramakrishnan/ Gehrke/Borgida 53 SQL and XQuery Side-by-side Find companies with at least 30 products, and their average price SELECT y.name, avg(x.price) An element FROM Product x, Company y WHERE x.maker=y.cid GROUP BY y.cid, y.name FOR $r in document( db.xml )/db, HAVING count(*) > 30 $y in $r/Company/row LET $p := $r/Product/row[maker=$y/cid] WHERE count($p) > 30 A collection RETURN = the group for y <theCompany> <companyName> { $y/name } </companyName> <avgPrice> avg($p/price) </avgPrice> </theCompany> Suciua/Ramakrishnan/ Gehrke/Borgida 54
Find millions of documents here - Study Guides, Homework Solutions, Papers, Exam Answer Keys and more.
Course Hero has millions of course related materials that will enable you to learn better, faster and get an A in all your courses.
Below is a small sample set of documents:
336_Chapter18.pdf
Path: Rutgers >> 198 >> 336 Fall, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 206 >> 352 Spring, 2008
Path: Rutgers >> 198 >> 352 Summer, 2008
Path: Rutgers >> 198 >> 442 Fall, 2008
Path: Rutgers >> 198 >> 443 Spring, 2008
Path: Rutgers >> 198 >> 509 Fall, 2008
Path: Rutgers >> 198 >> 538 Fall, 2008
Path: Rutgers >> 198 >> 516 Fall, 2008
Path: Rutgers >> 198 >> 516 Fall, 2008
Path: Rutgers >> 198 >> 516 Fall, 2008