# Example rule set showing how to implement just symmetric and
# transitive properties.


###############################################################              
# This version defines a specific property to be transitive
# and symmetric.
# It computes the property closure in forward mode - so everything
# is caculated when the graph is prepared - whether it is needed or not

[transitiveRule: (?A demo:p ?B), (?B demo:p ?C) -> (?A demo:p ?C) ]
              
[symmetricRule: (?Y demo:p ?X) -> (?X demo:p ?Y) ]

###############################################################              
# This approach allows a property to be declared symmetric transitive
# and computes the property closure in forward mode - so everything
# is caculated when the graph is prepared - whether it is needed or not

#[transitiveRule: (?P rdf:type demo:TransProp) 
#              (?A ?P ?B), (?B ?P ?C) -> (?A ?P ?C) ]
#              
#[symmetricRule: (?P rdf:type demo:TransProp) 
#              (?Y ?P ?X) -> (?X ?P ?Y) ]
                            
###############################################################              
# This appoach allows a property to be declared symmetric transitive
# and uses the hybrid rules to minimise overheads and only caculate
# the transitive closure on demand

#-> tableAll().
#
#[rule1: (?P rdf:type demo:TransProp) ->
#			[ (?X ?P ?Y) <- (?Y ?P ?X) ]
#			[ (?A ?P ?C) <- (?A ?P ?B), (?B ?P ?C) ] 
#]			
