我正在尝试在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;
到目前为止我见过的所有例子,在关系中都有两个不同的角色(例如老师/学生)。
答案 0 :(得分:1)
角色必须是不同的,因此您不能在一个关系中拥有两个friend
角色。
如果您描述的关系是对称的,则应该引入两个角色friend1
和friend2
。如果您愿意,这些都可以是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;