2011-05-03 65 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

相关问题