packages feed

hxt-7.1: doc/cookbook/RDFDataTypes.hs

{- |
   Module     : RDFDataTypes 
   Author     : Manuel Ohlendorf

   Maintainer : Manuel Ohlendorf
   Stability  : experimental
   Portability: portable
   Version    : 

The core data types for RDF processing. 

The constructor functions for the data types are also listed hier. 

Some of the data types are also used by the SPARQL parser.

-}
module RDFDataTypes 
    (RDFStore 
    ,showRDFStore
    ,Triple (..) 
    ,Object (..)
    ,Predicate (..)
    ,Subject (..)
    ,RDFTerm (..)
    ,URI
    ,Var
    ,mkPredicate
    ,mkTriple
    ,mkResource
    ,mkLangLiteral
    ,mkLiteral
    ,mkTypedLiteral
    ,mkSubjectBlankNode
    ,mkURIRef
    ,mkObjectBlankNode
    ,equalRDFTermURI)
where

import Char (toLower)

 
{- | 
    Represents an RDF triple. The Show-implementation returns it in N-Triples syntax.
    Subject, Predicate and Object are shared by the SPARQParser and RDFParser.
    That's why every data type can hold a 'Var' which is needed by the SPARQL Parser
-}
data Triple = Triple Subject Predicate Object deriving (Ord,Eq)


-- | returns the triples in N-Triples syntax
instance Show Triple
  where
  show (Triple s p o)   = show s ++ " "++ show p ++" " ++ show o++" ."


-- | Represents a Subject or a Subject variable 
data Subject = Subject RDFTerm -- ^ used by RDF parser and SPARQL parser
                | SubjectVar Var -- ^ used only by SPARQL parser, represents the variable of a query
                deriving (Ord,Eq)

instance Show Subject
    where
    show (Subject r)    = show r
    show (SubjectVar v) = show v

-- | Represents a Predicate or a Predicate variable  
data Predicate = Predicate URI -- ^ used by RDF parser and SPARQL parser
                | PredicateVar Var -- ^ used only by SPARQL parser, represents the variable of a query
                deriving (Ord,Eq)

instance Show Predicate
    where
    show (Predicate u)    = '<' : u ++ ">"
    show (PredicateVar v) = show v

-- | Represents a Object or a Object variable
data Object = Object RDFTerm -- ^ used only by SPARQL parser, represents the variable of a query
              | ObjectVar Var -- ^ used only by SPARQL parser, represents the variable of a query
              deriving (Ord,Eq)

instance Show Object 
    where
    show (Object r)    = show r
    show (ObjectVar v) = show v

-- | The variable in SPARQL query
type Var = String


-- | Represents all logical units of a Subject or Object 
data RDFTerm = URIRef URI                       -- ^ a URI reference
               | RDFLiteral String              -- ^ a plain literal
               | RDFLangLiteral String String   -- ^ a literal with language extension (literal, language)
               | RDFTypedLiteral String URI     -- ^ a typed literal (literal, type uri)
               | BlankNode String               -- ^ a blank node with blank node identifier
                 deriving (Ord,Eq)

-- | A Uniform Resource Identifier
type URI = String

instance Show RDFTerm
  where
  show (URIRef uri)              = '<' : uri ++ ">"
  show (BlankNode i)             = '_' : ':' : i
  show (RDFLiteral lit)          = '"' : lit ++ "\"" 
  show (RDFLangLiteral lit lang) = '"' : lit ++ "\"" ++ "@" ++ lang
  show (RDFTypedLiteral l u)     = '\"' : l ++ "\"^^" ++"<"++ u ++">"


-- the different construtor functions

-- | 'Subject' constructor with URIref
mkURIRef :: URI -> Subject
mkURIRef u = Subject (URIRef u)

-- | 'Subject' constructor with blank node identifier
mkSubjectBlankNode :: String -> Subject
mkSubjectBlankNode i = Subject (BlankNode i)

-- | 'Predicate' constructor with URIref
mkPredicate :: URI -> Predicate
mkPredicate u = Predicate u 

-- | 'Object' constructor with blank node identifier
mkObjectBlankNode :: String -> Object
mkObjectBlankNode i = Object (BlankNode i)

-- | 'Object' constructor with URIref (a resource)
mkResource :: String -> Object
mkResource r  = Object (URIRef r)

-- | 'Object' constructor with plain literal
mkLiteral :: String -> Object
mkLiteral l  = Object (RDFLiteral l) 

-- | 'Object' constructor with literal and language information
mkLangLiteral :: String -> String -> Object
mkLangLiteral lang lit = Object (RDFLangLiteral  lit ((map $ toLower) $ lang)) 

-- | 'Object' constructor with typed literal
mkTypedLiteral :: URI -> String -> Object
mkTypedLiteral t l  = Object (RDFTypedLiteral l t) 

-- | Equal function for 'RDFTerm' and 'URI'
equalRDFTermURI :: RDFTerm -> URI -> Bool
equalRDFTermURI (URIRef u) uri = u == uri
equalRDFTermURI _ _ = False

-- | A list of triples
type RDFStore = [Triple]

-- | show function for 'RDFStore'
showRDFStore ::  RDFStore ->  String
showRDFStore []  = ""
showRDFStore (x:xs) =  show x ++ "\n" ++ showRDFStore xs

--printResult :: RDFStore -> String
--printResult xs = show (length xs) ++" Triples found\n"

-- | constructor function for 'Triple'
mkTriple :: Subject -> Predicate -> Object -> Triple
mkTriple s p o = Triple s p o