GraqlでModernデータセット(http://www.tinkerpop.com/docs/3.0.0.M7/images/tinkerpop-modern.png)をモデル化しようとしています。 MarkoはVadasとVadasがMarkoを知っていることを知っています - この例では、私は彼らが友人であると仮定しています。Graqlで対称関係を定義する方法
私はこれを行うことができますか?
私がこれまで見たすべての例では、関係(例:教師/学生)に2つの異なる役割があります。
GraqlでModernデータセット(http://www.tinkerpop.com/docs/3.0.0.M7/images/tinkerpop-modern.png)をモデル化しようとしています。 MarkoはVadasとVadasがMarkoを知っていることを知っています - この例では、私は彼らが友人であると仮定しています。Graqlで対称関係を定義する方法
私はこれを行うことができますか?
私がこれまで見たすべての例では、関係(例:教師/学生)に2つの異なる役割があります。
ロールは別個である必要があります。したがって、1つのリレーションで2つのロールを持つことはできません。friend
説明している関係が対称である場合は、代わりにfriend1
とfriend2
の2つの役割を導入する必要があります。必要に応じて、これらは両方ともako friend
になります。あなたが使用しているデータセットを考えると
knower
であり、他の役割は
known-about
ある場合代わりに、
knows
関係を使用しています。
Felix Chapmanは、ロールタイプは一意であるため、真の対称関係は不可能であると指摘しています。
周りにはいくつかの方法があります。第二の可能性はを使用している
friend isa role-type is abstract;
friend1 ako friend;
friend2 ako friend;
person isa entity-type plays-role friend;
:
SymmetricFriendship isa inference-rule,
lhs {match (friend1 $x, friend2 $y) isa friendship;
select $x, $y},
rhs {match (friend1 $y, friend2 $x} isa friendship;};
第二の方法が作るあなたが最初の可能性がako
と抽象的役割を使用することです
insert
friendship isa relation-type
has-role friend1
has-role friend2;
としてあなたの関係を定義していると言います友情関係は数学的な観点から真の対称関係になりますが、Graqlのマッチ構文が与えられ、パフォーマンス上の理由から、私は明示的に関係を対称にする必要はほとんどないので、私は個人的に最初の方法を好む。