Facebook Twitter Sign in | Join
SQL Backup Pro
Getting started with SSIS - Part 1: Introduction to SSIS
First Time? You can support us by signing up. It takes only 5 seconds. Click here to sign up. If you already have an account, click here to login.

Jacob's Blog

My technology blog on SQL Server, TSQL, XML, FILESTREAM and other areas of SQL Server.
Connect your existing Source Control system to SSMS in 5 minutes
Sponsored [Advertise Here]
Learn XSD and XML Schema Collections
beyondrelational.com
This book helps you to learn XML Schema Collections from basic to advanced levels through simple examples and easy to follow walk through labs.

Syndicate your blog!
beyondrelational.com
Syndicate your blog with us to get wider reach into the technology community. Click here to get started.

SSRS Tutorial - Getting Started with SQL Server Reporting Services
beyondrelational.com
This tutorial will help you to get started with SQL Server Reporting Services (SSRS)
Loading

XQuery Lab 51 – Querying an RDF document using TSQL and XQuery

This installment of XQuery Labs presents a script that reads information from an RDF document using TSQL and XQuery.


One of my friends approached me recently with a request to write a TSQL query that reads information from an RDF document. Here is the sample XML document he wanted to process.


<RDF xmlns:r="http://www.w3.org/TR/RDF/"
      xmlns:d="http://purl.org/dc/elements/1. 0/"
      xmlns="http://dmoz.org/rdf/">
  <Topic r:id="Top/World/Afrikaans/Besigheid">
    <catid>724829</catid>
    <link r:resource="http://www.videos-sa.com" />
    <link r:resource="http://besigheidcenturion.co.za/bc/" />
  </Topic>
  <ExternalPage about="http://www.videos-sa.com">
    <d:Title>Kobus Petzer Videoproduksies</d:Title>
    <d:Description>Vervaardiging van...</d:Description>
    <topic>Top/World/Afrikaans/Besigheid</topic>
  </ExternalPage>
  <ExternalPage about="http://besigheidcenturion.co.za/bc/">
    <d:Title>Besigheid Centurion</d:Title>
    <d:Description>Sakeportaal vir ...</d:Description>
    <topic>Top/World/Afrikaans/Besigheid</topic>
  </ExternalPage>
  <ExternalPage about="http://besigheidcenturion.co.za/bc/">
    <d:Title>Besigheid Centurion</d:Title>
    <d:Description>Sakeportaal vir ...</d:Description>
    <topic>Top/World/Afrikaans/Besigheid</topic>
  </ExternalPage>
</RDF>

The challenge is to read the resource names from the Link element and join it with the about attribute in the ExternalPage element. Here is the output required from the above XML document.

/*
Resource           About            Title         CatID 
------------------ ---------------- ------------- ------
http://www.videos- http://www.video Kobus Petzer  724829
http://besigheidce http://besigheid Besigheid Cen 724829
http://besigheidce http://besigheid Besigheid Cen 724829
*/      

While writing the query to get the above result is pretty much straight forward, many people find it difficult because of the namespace declarations present in the XML document.

Here is the TSQL code that queries the above XML document and produces the required output.

DECLARE @x XML
SELECT @x = '
<RDF xmlns:r="http://www.w3.org/TR/RDF/"
      xmlns:d="http://purl.org/dc/elements/1. 0/"
      xmlns="http://dmoz.org/rdf/">
  <Topic r:id="Top/World/Afrikaans/Besigheid">
    <catid>724829</catid>
    <link r:resource="http://www.videos-sa.com" />
    <link r:resource="http://besigheidcenturion.co.za/bc/" />
  </Topic>
  <ExternalPage about="http://www.videos-sa.com">
    <d:Title>Kobus Petzer Videoproduksies</d:Title>
    <d:Description>Vervaardiging van...</d:Description>
    <topic>Top/World/Afrikaans/Besigheid</topic>
  </ExternalPage>
  <ExternalPage about="http://besigheidcenturion.co.za/bc/">
    <d:Title>Besigheid Centurion</d:Title>
    <d:Description>Sakeportaal vir ...</d:Description>
    <topic>Top/World/Afrikaans/Besigheid</topic>
  </ExternalPage>
  <ExternalPage about="http://besigheidcenturion.co.za/bc/">
    <d:Title>Besigheid Centurion</d:Title>
    <d:Description>Sakeportaal vir ...</d:Description>
    <topic>Top/World/Afrikaans/Besigheid</topic>
  </ExternalPage>
</RDF>'

;WITH XMLNAMESPACES(
      'http://www.w3.org/TR/RDF/' as r,
      'http://purl.org/dc/elements/1. 0/' as d,
      default 'http://dmoz.org/rdf/'     
)
SELECT
      y.value('@r:resource[1]','VARCHAR(100)') AS Resource,
      z.value('@about','VARCHAR(100)') AS About,
      z.value('d:Title[1]','VARCHAR(100)') AS Title,
      x.value('catid[1]','VARCHAR(100)') AS CatID
FROM @x.nodes('RDF/Topic') a(x)
CROSS APPLY x.nodes('link') b(y)
CROSS APPLY  @x.nodes('RDF/ExternalPage') c(z)
WHERE y.value('@r:resource[1]','VARCHAR(100)') = 
	z.value('@about','VARCHAR(100)')
      
/*
Resource           About            Title         CatID 
------------------ ---------------- ------------- ------
http://www.videos- http://www.video Kobus Petzer  724829
http://besigheidce http://besigheid Besigheid Cen 724829
http://besigheidce http://besigheid Besigheid Cen 724829
*/      

View All Labs: XQuery Labs - A Collection of XQuery Sample Scripts and Tutorials


Jacob Sebastian
1 · 100% · 16868
2
Liked
2
Comments



Submit

2   Comments   

Subscribe to Notifications
  • Hi Jacob...

    Good XML post.

    The query could be re-worked to insert another CROSS APPLY to get the result columns and then you could use those column aliases in the WHERE clause. This may make the query clearer AND it involves less typing and duplication.

    (The code may not be indented here as well as I'd like):

    ;WITH XMLNAMESPACES( 'http://www.w3.org/TR/RDF/' as r, 'http://purl.org/dc/elements/1. 0/' as d, default 'http://dmoz.org/rdf/'
    ) SELECT Resource, About, Title, CatID FROM @x.nodes('RDF/Topic') a(x) CROSS APPLY x.nodes('link') b(y) CROSS APPLY @x.nodes('RDF/ExternalPage') c(z) CROSS APPLY (SELECT y.value('@r:resource[1]','VARCHAR(100)') AS Resource, z.value('@about','VARCHAR(100)') AS About, z.value('d:Title[1]','VARCHAR(100)') AS Title, x.value('catid[1]','VARCHAR(100)') AS CatID) F WHERE Resource=About

    commented on Feb 16 2010 6:59PM  .  Report Abuse This post is not formatted correctly
    Brad Schulz
    92 · 2% · 405
  • Thanks Brad, I made another post showing your method. http://beyondrelational.com/blogs/jacob/archive/2010/02/25/XQuery-Lab-52-A-More-Intuitive-way-of-reading-an-RDF-document.aspx

    commented on Feb 25 2010 4:16AM  .  Report Abuse This post is not formatted correctly
    Jacob Sebastian
    1 · 100% · 16868

Your Comment


Sign Up or Login to post a comment.

Copyright © Beyondrelational.com