2016-09-16 3 views
1

Я пытаюсь смоделировать современный набор данных (http://www.tinkerpop.com/docs/3.0.0.M7/images/tinkerpop-modern.png) в Граче. Марко знает, что Вадас и Вадас знают Марко - для целей этого примера я предполагаю, что они друзья.Как определить симметричное отношение в Graql

Могу ли я это сделать?

insert friendship isa relation-type; 
    insert friend isa role-type; 
    insert friendship has-role friend, has-role friend; 

Все примеры, которые я видел до сих пор, есть две разные роли в отношениях (например, учитель/студент).

ответ

1

Роли должны быть разными, поэтому вы не можете иметь две роли friend в одном отношении.

Если отношение, которое вы описываете, является симметричным, вы должны ввести две роли: friend1 и friend2. Если вы хотите, они могут быть как ako friend.

Учитывая набор данных вы используете, может быть, лучше не описать это как симметричные отношения, а вместо этого использует knows отношений, где одна роли является knower и другая роль known-about.

0

Как указал Феликс Чепмен, типы ролей уникальны, поэтому истинное симметричное отношение невозможно.

Существует несколько способов обойти его; говорят, что вы определили ваше отношение, как

insert 
friendship isa relation-type 
    has-role friend1 
    has-role friend2; 

Первая возможность заключается в использовании ako и абстрактные роли:

friend isa role-type is abstract; 
friend1 ako friend; 
friend2 ako friend; 

person isa entity-type plays-role friend; 

Вторая возможность с помощью inference rules:

SymmetricFriendship isa inference-rule, 
    lhs {match (friend1 $x, friend2 $y) isa friendship; 
     select $x, $y}, 
    rhs {match (friend1 $y, friend2 $x} isa friendship;}; 

Второй способ марки отношение дружбы - истинное симметричное отношение с математической точки зрения, но учитывая синтаксис соответствия Graql и по соображениям производительности, там i редко требуется явно сделать соотношение симметричным, поэтому я лично предпочитаю первый способ.

Смежные вопросы