[Zope3-dev] Yet Another Relations (aka Reference) Engine...
Jean-Marc Orliaguet
jmo at ita.chalmers.se
Fri Nov 11 11:26:07 EST 2005
Reinoud van Leeuwen wrote:
>On Fri, Nov 11, 2005 at 04:44:47PM +0100, Jean-Marc Orliaguet wrote:
>
>
>>Reinoud van Leeuwen wrote:
>>
>>
>>
>>>On Fri, Nov 11, 2005 at 03:50:25PM +0100, Helmut Merz wrote:
>>>
>>>
>>>
>>>
>>>>A relation is an object providing the IRelation interface. This
>>>>has got two attributes ('first', 'second' - dyadic relation) or
>>>>
>>>>
>>>>
>>>>
>>>I've done this kind of thing in relational databases. Problem with 'first'
>>>and 'second' is that it seems to imply some order. And if I try to find
>>>all relations from an object I allways have to compare my ID to either
>>>first or second.
>>>
>>>I solved my problem by chopping a relation into three parts: the relation
>>>itself and both endpoints. In my database this generated an extra table
>>>(and some more work when writing queries), but the solution became more
>>>generic and flexible in the end.
>>>
>>>(See the database diagram on
>>>http://www.drbob.org/datamodel/drbob_datamodel.htm . The two endpoints of
>>>a relation are stored in two object_link records, the relation itself in
>>>one link record.)
>>>
>>>
>>>
>>>
>>>
>>Hi!
>>
>>I think that you want 1 relation that consists of:
>>- the elements in the relation (the relates)
>>- the predicate
>>
>>then you can chop the relations into piece when you index it, but not
>>before.
>>
>>a relation is by definition 1 entity, if you start storing 2 items to
>>represent a single relation, you will have problems looming ahead when
>>it comes to managing the different "parts" of the relation. For instance
>>if you store A -> B and B -> A to represent A <-> B, you will have to
>>destroy A -> B if you remove B -> A.
>>
>>This is why I use real triadic relations to avoid having complicated
>>constructions based on dyadic relations that only make sense when
>>they're taken together. When I destroy a triadic relation between 3
>>objects, this is done in one take, not three takes.
>>
>>then order in a relation is important:
>>
>> A kills B
>>
>>is not the same as:
>>
>> B kills A
>>
>>of course if the predicate is :
>>
>> __ is like __
>>
>>it appears as though order is not important, but it is a question of
>>semantics, not a question of logic. A relation engine is not supposed to
>>know about semantics.
>>
>>
>
>OK. In a relational database you can solve the 'one entity stored in
>different tables' with triggers. But this discussion is not about a RDBMS
>";-)
>
>As long as the relations you propose have a direction ('kills') it makes
>sense to stored them as 'first' and 'second' somewhere. But when the
>direction is symetrical ('is like') this implementation does not feel
>right. Of course it is possible in Python to make a class around it, but
>still if a piece of code wants to find all related objects it has to
>search both the 'first' and the 'second' field.
>
>That sounds less generic than it could be in my opinion.
>
>
In any case it is the responsibility of the application to define its
ontology. The relation engine shouldn't make any assumptions in that area.
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.
Then most of the relations do have a direction ( __ has author __, __
was modified by __, ...)
/JM
More information about the Zope3-dev
mailing list