[Zope3-dev] Yet Another Relations (aka Reference) Engine...

Helmut Merz helmutm at cy55.de
Fri Nov 11 14:05:44 EST 2005


Am Freitag, 11. November 2005 17:26 schrieb Jean-Marc Orliaguet:

> if the relation is symmetrical, there are 2 relations:
>
>     A is like B
>
> means:
>
>    A resembles B
>
> and
>
>    B resembles A    ( or A __ is resembled by __ B )
>
> which you can express as a compound predicate:
>
>     is_like = CompoundPredicate(Predicate('_ resembles _', '_
> is resembled by _'))
>
> and do a query with:
>
>     relations.search(predicate=is_like, first=A)
>
> to get all the B:s in relation with A independently of the
> position.

Interesting, maybe I should learn more about predicate logic...

Nevertheless let me try it "my way":

Let's have an interface ISymmetricalRelation(IDyadicRelation) 
that is implemented by a class 
SymmetricalRelation(PredicateRelation) (PredicateRelation is an 
example from the README.txt 
http://svn.cy55.de/viewcvs/Zope3/src/cybertools/trunk/relation, 
Concept is some imaginary class used for conceptual modelling).

  >>> isSynonym = Predicate('__ is a synonym of __')
  >>> crazy = Concept('crazy')
  >>> mad = Concept('mad')

Then the contract for ISymmetricalRelation would look like this 
(this is not strictly necessary but makes it easier to 
understand):

  >>> SymmetricalRelation(isSynonym, crazy, mad) == 
SymmetricalRelation(isSynonym, mad, crazy)
  True

Now we register such a relation:

  >>> relations.register(SymmetricalRelation(isSynonym, crazy, 
mad))

and query in two ways:

  >>> rels1 = relations.query(relationship=isSynonym, 
  ...                         first=crazy) 
  >>> rels2 = relations.query(relationship=isSynonym, 
  ...                         second=crazy) 

then all the found relations must be identical:

  >>> [r1 in rels2 for r1 in rels1]
  [True]

(When I'd query for 'mad' I'd get the same results; I could also 
omit the relationship parameter on the query() call.)

In addition to the standard IDyadicRelation interface, 
ISymmetricalRelation has a method getOther():

  >>> [r.getOther(crazy) for r in rels1]
  [<Concept 'mad'>]

This is all I need to find all the synonyms of 'mad'.

Don't ask me about the implementation now - I just don't care at 
the moment...

> Then most of the relations do have a direction ( __ has author
> __, __ was modified by __,  ...)

Yes, a symmetrical relationship is a special case, and one could 
even handle it on the application layer. Nevertheless I think 
it's a good idea to consider it.

Helmut




More information about the Zope3-dev mailing list