module Data.RDF.TriplesGraph(TriplesGraph, empty, mkRdf, triplesOf, select, query)
where
import Data.RDF
import Data.RDF.Namespace
import qualified Data.Map as Map
newtype TriplesGraph = TriplesGraph (Triples, Maybe BaseUrl, PrefixMappings)
instance RDF TriplesGraph where
baseUrl = baseUrl'
prefixMappings = prefixMappings'
addPrefixMappings = addPrefixMappings'
empty = empty'
mkRdf = mkRdf'
triplesOf = triplesOf'
select = select'
query = query'
prefixMappings' :: TriplesGraph -> PrefixMappings
prefixMappings' (TriplesGraph (_, _, pms)) = pms
addPrefixMappings' :: TriplesGraph -> PrefixMappings -> Bool -> TriplesGraph
addPrefixMappings' (TriplesGraph (ts, baseUrl, pms)) pms' replace =
let merge = if replace then flip mergePrefixMappings else mergePrefixMappings
in TriplesGraph (ts, baseUrl, merge pms pms')
baseUrl' :: TriplesGraph -> Maybe BaseUrl
baseUrl' (TriplesGraph (_, baseUrl, _)) = baseUrl
empty' :: TriplesGraph
empty' = TriplesGraph ([], Nothing, PrefixMappings Map.empty)
mkRdf' :: Triples -> Maybe BaseUrl -> PrefixMappings -> TriplesGraph
mkRdf' ts baseUrl pms = TriplesGraph (ts, baseUrl, pms)
triplesOf' :: TriplesGraph -> Triples
triplesOf' (TriplesGraph (ts, _, _)) = ts
select' :: TriplesGraph -> NodeSelector -> NodeSelector -> NodeSelector -> Triples
select' (TriplesGraph (ts, _, _)) s p o = removeDupes $ filter (matchSelect s p o) ts
query' :: TriplesGraph -> Maybe Subject -> Maybe Predicate -> Maybe Object -> Triples
query' (TriplesGraph (ts, _, _)) s p o = removeDupes $ filter (matchPattern s p o) ts
matchSelect :: NodeSelector -> NodeSelector -> NodeSelector -> Triple -> Bool
matchSelect s p o t =
match s (subjectOf t) && match p (predicateOf t) && match o (objectOf t)
where
match Nothing _ = True
match (Just fn) n = fn n
matchPattern :: Maybe Subject -> Maybe Predicate -> Maybe Object -> Triple -> Bool
matchPattern subj pred obj t = smatch t && pmatch t && omatch t
where
smatch trp = matchNode subj (subjectOf trp)
pmatch trp = matchNode pred (predicateOf trp)
omatch trp = matchNode obj (objectOf trp)
matchNode :: Maybe Node -> Node -> Bool
matchNode Nothing _ = True
matchNode (Just n1) n2 = n1 == n2