5

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 プラットフォームがそれをサポートしていますか?

4

3 に答える 3

5

Gremlin (http://gremlin.tinkerpop.com) では、データ内の明示的なものから抽象的な/暗黙的な/推測された関係を作成できます。したがって、この方法で推論を定義できます。

https://github.com/tinkerpop/gremlin/wiki/User-Defined-Steps

Gremlin は、TinkerGraph、Neo4j、OrientDB、DEX、および RDF Sail ストアで動作します。

お役に立てば幸いです、マルコ。

于 2011-05-04T16:07:15.483 に答える
2

これは、データベース レベルの問題ではなく、UI レベルの問題のように思えます。有向関係をわかりやすい名前にマッピングしようとしています。

Neo4j の場合、この情報をカスタム RelationshipType に入れることができます。

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;
        }
    }
}
于 2011-05-03T09:10:09.230 に答える
1

InfoGridには、無向リレーションシップの概念がありますたとえば、「HasMet」: 人物 A が人物 B に会った場合、必然的に B も A に会い、A と B は関係において同じ役割を果たします。

一方向性は名前付けを超えていることに注意してください。これは、データベースまたはモデリング言語によって理解される場合と理解されない場合があるコアのセマンティック概念です。

また、InfoGrid では、いくつかの TraversalSpecifications を自分で定義し、基本的なトラバーサル (特定のタイプの関係によって関連付けられた隣人に移動する) や複数ステップのトラバーサル (たとえば、母親の側の叔父に移動する) など、好きなものにそれらをエイリアスすることができます。 .

于 2011-05-03T16:54:15.210 に答える