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)

并使用定向或非定向遍历/查询

例如,我可能想问:

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 Stores 上工作。

希望有帮助,马尔科。

于 2011-05-04T16:07:15.483 回答
2

这听起来像是 UI 级别的问题,而不是数据库级别的问题。您正在尝试将定向关系映射到一个人性化的名称。

对于 Neo4j,您可以将此信息放入您的自定义关系类型中:

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 回答