各方向の異なる名前を持つ方向関係
-
28-10-2019 - |
質問
GraphDBプラットフォーム(NEO4J、OrientDB、FlockDB、HyperGraphDB ...)では、ノード間の関係を定義することができます。
方向の関係を定義する必要があります。そうすれば、関係がその方向に応じて異なる名前を持つようにする必要があります。
例えば:
Parent(A,B) := Sibling(B,A).
次に、用語と指示の両方を使用して、グラフを通過またはクエリしたいと思います。
もちろん、私は2つの関係を定義したくありませんが、1つだけを定義したくありません。
たとえば、私は次のように、非方向の名前を使用したい場合もあります。
Call(A,B) := Answer(B,A);
TalkWith(A,B) := Call(A,B) || Call(B,A)
方向性または間接的なトラバーサル /クエリを使用します
たとえば、私は尋ねたいかもしれません:
Get any X that TalkWith(A,X))
また
Get any X that Call(A,X))
また
Get any X that Answer(A,X))
どの既存のGraphDBプラットフォームがそれをサポートしていますか?
解決
Gremlin(http://gremlin.tinkerpop.com)では、データの明示的なものから抽象的/暗黙的/推測された関係を作成できます。そのため、この方法で推論を定義できます。
https://github.com/tinkerpop/gremlin/wiki/user-defined-steps
Gremlinは、Tinkergraph、Neo4J、OrientDB、Dex、およびRDF Sail Storesで作業しています。
それが役立つことを願っています、マルコ。
他のヒント
これは、データベースレベルの問題ではなく、UIレベルの問題のように聞こえます。指示された関係を人間に優しい名前にマッピングしようとしています。
NEO4Jの場合、この情報をカスタムRelationssTypeに入れることができます。
public enum MyRelationshipType implements RelationshipType
{
CHILD("Parent Of", "Child Of");
public MyRelationshipType(final String forwardString, final String backwardString)
{
this.forwardString = forwardString;
this.backwardString = backwardString;
}
private final String backwardString;
private final String forwardString;
public String getDisplayString(final boolean forward)
{
if (forward)
{
return this.forwardString;
}
else
{
return this.backwardString;
}
}
}
の インフォグリッド, 、私たちは無向の関係の概念を持っています。たとえば、「Hasmet」:人Aが人Bに会った場合、Bは必然的にAにも出会い、AとBは関係で同じ役割を果たします。
単方向性は命名を超えていることに注意してください。これは、データベースまたはモデリング言語によって理解される場合と理解されない場合があるコアセマンティックコンセプトです。
また、Infogridでは、基本的なトラバーサル(特定のタイプの関係に関連する隣人に移動する)やマルチステップトラバーサル(母親の側の叔父に行く)など、いくつかのトラバーサルスピークを自分で定義し、好きなものにエイリアスすることができます。 。