swish-0.8.0.0: src/Swish/RDF/VarBinding.hs
{-# LANGUAGE OverloadedStrings #-}
--------------------------------------------------------------------------------
-- See end of this file for licence information.
--------------------------------------------------------------------------------
-- |
-- Module : VarBinding
-- Copyright : (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011, 2012 Douglas Burke
-- License : GPL V2
--
-- Maintainer : Douglas Burke
-- Stability : experimental
-- Portability : OverloadedStrings
--
-- This module instantiates the `VarBinding` types and methods for use
-- with RDF graph labels.
--
--------------------------------------------------------------------------------
-- See module RDFQueryTest for test cases.
module Swish.RDF.VarBinding
( RDFVarBinding
, RDFVarBindingModify, RDFOpenVarBindingModify, RDFOpenVarBindingModifyMap
, RDFVarBindingFilter
, nullRDFVarBinding
, rdfVarBindingUriRef, rdfVarBindingBlank
, rdfVarBindingLiteral
, rdfVarBindingUntypedLiteral, rdfVarBindingTypedLiteral
, rdfVarBindingXMLLiteral, rdfVarBindingDatatyped
, rdfVarBindingMemberProp
)
where
import Swish.Namespace (ScopedName)
import Swish.VarBinding (VarBinding(..), VarBindingModify(..), OpenVarBindingModify, VarBindingFilter(..))
import Swish.VarBinding (nullVarBinding, applyVarBinding, makeVarTestFilter)
import Swish.RDF.Graph
( RDFLabel(..)
, isLiteral, isUntypedLiteral, isTypedLiteral, isXMLLiteral
, isDatatyped, isMemberProp, isUri, isBlank
)
import Swish.RDF.Vocabulary (swishName)
import qualified Data.Map as M
------------------------------------------------------------
-- Types for RDF query variable bindings and modifiers
------------------------------------------------------------
-- |@RDFVarBinding@ is the specific type type of a variable
-- binding value used with RDF graph queries.
type RDFVarBinding = VarBinding RDFLabel RDFLabel
-- | maps no query variables.
nullRDFVarBinding :: RDFVarBinding
nullRDFVarBinding = nullVarBinding
-- |Define type of query binding modifier for RDF graph inference
type RDFVarBindingModify = VarBindingModify RDFLabel RDFLabel
-- |Open variable binding modifier that operates on RDFLabel values
--
type RDFOpenVarBindingModify = OpenVarBindingModify RDFLabel RDFLabel
-- |Define type for lookup map of open query binding modifiers
type RDFOpenVarBindingModifyMap = M.Map ScopedName RDFOpenVarBindingModify
-- |@RDFVarBindingFilter@ is a function type that tests to see if
-- a query binding satisfies some criterion, and is used to
-- create a variable binding modifier that simply filers
-- given variable bindings.
--
-- Queries often want to apply some kind of filter or condition
-- to the variable bindings that are processed. In inference rules,
-- it sometimes seems desirable to stipulate additional conditions on
-- the things that are matched.
--
-- This function type is used to perform such tests.
-- A number of simple implementations are included.
--
type RDFVarBindingFilter = VarBindingFilter RDFLabel RDFLabel
------------------------------------------------------------
-- Declare some query binding filters
------------------------------------------------------------
-- |This function generates a query binding filter that ensures
-- an indicated variable is bound to a URI reference.
rdfVarBindingUriRef :: RDFLabel -> RDFVarBindingFilter
rdfVarBindingUriRef =
makeVarTestFilter (swishName "rdfVarBindingUriRef") isUri
-- |This function generates a query binding filter that ensures
-- an indicated variable is bound to a blank node.
rdfVarBindingBlank :: RDFLabel -> RDFVarBindingFilter
rdfVarBindingBlank =
makeVarTestFilter (swishName "rdfVarBindingBlank") isBlank
-- |This function generates a query binding filter that ensures
-- an indicated variable is bound to a literal value.
rdfVarBindingLiteral :: RDFLabel -> RDFVarBindingFilter
rdfVarBindingLiteral =
makeVarTestFilter (swishName "rdfVarBindingLiteral") isLiteral
-- |This function generates a query binding filter that ensures
-- an indicated variable is bound to an untyped literal value.
rdfVarBindingUntypedLiteral :: RDFLabel -> RDFVarBindingFilter
rdfVarBindingUntypedLiteral =
makeVarTestFilter (swishName "rdfVarBindingUntypedLiteral") isUntypedLiteral
-- |This function generates a query binding filter that ensures
-- an indicated variable is bound to a typed literal value.
rdfVarBindingTypedLiteral :: RDFLabel -> RDFVarBindingFilter
rdfVarBindingTypedLiteral =
makeVarTestFilter (swishName "rdfVarBindingTypedLiteral") isTypedLiteral
-- |This function generates a query binding filter that ensures
-- an indicated variable is bound to an XML literal value.
rdfVarBindingXMLLiteral :: RDFLabel -> RDFVarBindingFilter
rdfVarBindingXMLLiteral =
makeVarTestFilter (swishName "rdfVarBindingXMLLiteral") isXMLLiteral
-- |This function generates a query binding filter that ensures
-- an indicated variable is bound to container membership property.
rdfVarBindingMemberProp :: RDFLabel -> RDFVarBindingFilter
rdfVarBindingMemberProp =
makeVarTestFilter (swishName "rdfVarBindingMemberProp") isMemberProp
-- |This function generates a query binding filter that ensures
-- an indicated variable is bound to a literal value with a
-- datatype whose URI is bound to another node
--
rdfVarBindingDatatyped ::
RDFLabel -- ^ variable bound to the required datatype.
-> RDFLabel -- ^ variable bound to the literal node to be tested.
-> RDFVarBindingFilter
rdfVarBindingDatatyped dvar lvar = VarBindingFilter
{ vbfName = swishName "rdfVarBindingDatatyped"
, vbfVocab = [dvar,lvar]
, vbfTest = \vb -> testDatatyped vb dvar lvar
}
testDatatyped :: RDFVarBinding -> RDFLabel -> RDFLabel -> Bool
testDatatyped vb dvar lvar = and
[ isUri dtype
, isDatatyped dqnam $ applyVarBinding vb lvar
]
where
dtype = applyVarBinding vb dvar
-- NOTE: dqnam is not evaluated unless (isUri dtype)
-- but add in a _ handler to appease -Wall
-- dqnam = case dtype of { (Res x) -> x }
dqnam = case dtype of
Res x -> x
_ -> error $ "dqnam should not be evaluated with " ++ show dtype
--------------------------------------------------------------------------------
--
-- Copyright (c) 2003, Graham Klyne, 2009 Vasili I Galchin,
-- 2011, 2012 Douglas Burke
-- All rights reserved.
--
-- This file is part of Swish.
--
-- Swish is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- Swish is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with Swish; if not, write to:
-- The Free Software Foundation, Inc.,
-- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
--
--------------------------------------------------------------------------------