2011-05-03 63 views
5

在GraphDB平臺(Neo4j,OrientDB,FlockDB,HyperGraphDB ...)中,可以定義節點之間的關係。每個方向使用不同名稱的方向關係

我需要定義方向關係,這樣關係根據其方向有不同的名稱。

例如:

Parent(A,B) := Sibling(B,A). 

然後,我想遍歷或查詢同時使用的術語和方向的曲線圖。

當然,我不想定義兩個關係,但只有一個。

有時我甚至想使用非定向名稱,例如:

Call(A,B) := Answer(B,A); 
TalkWith(A,B) := Call(A,B) || Call(B,A) 

,並使用定向或indirectional遍歷/查詢

例如,我可能要問:

Get any X that TalkWith(A,X)) 

Get any X that Call(A,X)) 

Get any X that Answer(A,X)) 

哪些現有GraphDB平臺支持呢?

+1

在我看來,Gremlin可以支持這個,使用[用戶定義的步驟](https:// github。com/tinkerpop/gremlin/wiki /用戶定義的步驟) – nawroth 2011-05-04 12:47:29

回答

5

在Gremlin(http://gremlin.tinkerpop.com)中,您可以根據數據中明確的內容創建抽象/隱含/推斷關係。因此,您可以用這種方式定義推理。

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

小鬼工作過TinkerGraph,Neo4j的,OrientDB,DEX和RDF賽歐店。

希望有幫助, Marko。

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; 
     } 
    } 
} 
+1

我不知道這將是多麼有用,因爲你無論如何不得不做的MyRelationshipType.valueOf(relationshipRetrievedFromTheDb.name())或類似的東西時提取從數據庫。也就是說,我實際上使用了一個類似的模式:-)關於關係方向,你說得對,這不是一個數據庫問題:你可以檢索外向/外來關係或忽略Neo4j中的方向。 – nawroth 2011-05-04 08:31:44

1

InfoGrid,我們無向關係的概念。例如,「HasMet」:如果人A與人B相遇,則必然B也會遇到A,並且A和B在關係中扮演相同的角色。

請注意,單向性不僅限於命名,它是核心語義概念,可能會或可能不會被數據庫或建模語言理解。另外,在InfoGrid中,你可以定義自己的一些TraversalSpecifications,並將它們別名爲你喜歡的任何東西,包括基本遍歷(轉到與特定類型關係有關的鄰居),或者多步遍歷(例如,去找叔叔你母親的一面)。

+1

無向的關係很好,但仍然沒有做到我想要的。 – 2011-05-03 17:28:23

相關問題