每个方向具有不同名称的方向关系

时间:2011-05-03 08:34:31

标签: nosql neo4j graph-databases orientdb

在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)

使用定向或间接遍历/查询

例如,我可能想问:

Get any X that TalkWith(A,X))

Get any X that Call(A,X))

Get any X that Answer(A,X))

哪些现有的GraphDB平台支持它?

3 个答案:

答案 0 :(得分:5)

在Gremlin(http://gremlin.tinkerpop.com)中,您可以根据数据中的显式创建抽象/隐式/推断关系。因此,您可以通过这种方式定义推理。

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

Gremlin在TinkerGraph,Neo4j,OrientDB,DEX和RDF Sail Stores上工作。

希望有所帮助, 马尔科。

答案 1 :(得分: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;
        }
    }
}

答案 2 :(得分:1)

InfoGrid中,我们有无向关系的概念。例如,“HasMet”:如果A人遇到了B,B必然也会遇到A,A和B在关系中扮演相同的角色。

请注意,单向性超出了命名范围,它是一种核心语义概念,可能会被数据库或建模语言理解,也可能不会被理解。

此外,在InfoGrid中,您可以自己定义一些TraversalSpecifications并将它们替换为您喜欢的任何内容,包括基本遍历(转到与特定类型的关系相关的邻居),或者多步遍历(例如,转到您的叔叔)妈妈的一面)。