如何在Graql中定义对称关系

时间:2016-09-16 10:55:15

标签: graql

我正在尝试在Graql中对Modern数据集(http://www.tinkerpop.com/docs/3.0.0.M7/images/tinkerpop-modern.png)进行建模。 Marko知道Vadas和Vadas都知道Marko - 出于这个例子的目的,我假设他们是朋友。

我可以这样做吗?

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

到目前为止我见过的所有例子,在关系中都有两个不同的角色(例如老师/学生)。

4 个答案:

答案 0 :(得分:1)

角色必须是不同的,因此您不能在一个关系中拥有两个friend角色。

如果您描述的关系是对称的,则应该引入两个角色friend1friend2。如果您愿意,这些都可以是ako friend

考虑到您正在使用的数据集,最好不要将其描述为对称关系,而是使用knows关系,其中一个角色是knower,另一个角色是{ {1}}。

答案 1 :(得分:0)

正如Felix Chapman指出的那样,角色类型是独一无二的,因此真正的对称关系是不可能的。

有几种方法可以解决它;说你已经将你的关系定义为

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的匹配语法和性能原因,很少需要明确地使关系对称,所以我个人更喜欢第一种方式

答案 2 :(得分:0)

您可以添加模拟一组朋友的entity来做对称的事情:

friendship sub relation,
  relates friend,
  relates friend-group;

person sub entity,
  plays friend;

group sub entity,
  plays friend-group;

这感觉就像是在跳动。 friendship关系实际上只是表达子集关系。我使用group代替了pair,因为现在friendship不再是二进制了,因为我不知道如何限制{{1 }}。此外,相同的两个朋友可以成为多个friend的一部分。

Graql作为建模语言,如果可以指定可变参数关系(例如,为每个角色使用角色球员人数范围。这也将涵盖此用例:

friend-group

答案 3 :(得分:0)

您可以使用在关系实例中可以重复任何角色的事实:

friendship sub relation,
  relates friend;

name sub attribute,
  datatype string;

person sub entity,
  has name,
  plays friend;

那你可以说

insert $x isa Person, has name "X";
insert $y isa Person, has name "Y";
match
  $x isa Person, has name "X";
  $y isa Person, has name "Y";
insert $xy (friend: $x, friend: $y) isa friendship;