如何使用Tinkerpop框架将类绑定到Vertex并使用绑定到Edge属性的属性?

时间:2015-04-04 13:49:20

标签: neo4j tinkerpop tinkerpop-frames

我想要一个Java类来绑定这个关系:

顶点 - 关系 - 顶点 (A:条款) - [R:HasClause] - (B:条款)

问题是类“HasClause”的边缘应该在同一个类上有一个名为“alias”的属性 - 我不知道如何自动注释该类来自动执行此操作:

@JsonDeserialize(as = Clause.class)
public interface IClause extends VertexFrame {

    @Property("nodeClass")
    public String getNodeClass();

    @Property("nodeClass")
    public void setNodeClass(String str);

    /* that would be a property on the Vertex not on the Edge 
    @Property("alias")
    public void setAlias(String id);

    @Property("alias")
    public String getAlias();
    */

    @Adjacency(label = "HasClause", direction = Direction.OUT)
    public Iterable<IClause> getClauses();

    @Adjacency(label = "HasClause", direction = Direction.OUT)
    public void setClauses(Iterable<IClause> clauses);
}

由于

1 个答案:

答案 0 :(得分:1)

我不知道你是否可以使用@Adjacency注释做到这一点(我无法以任何方式看待)。

一种方法是使用@JavaHandlerClass。这基本上允许您自定义Frame方法的实现。在以下示例中,我们将加入两个Vertex,并添加自定义属性&#39;别名&#39;到Edge

为了让事情变得简单,我会使用您问题中的相同课程 - Why simple set and then get on Dynamic Proxy does not persist? (using TinkerPop Frames JavaHandler)

IVert

@JavaHandlerClass(Vert.class)
public interface IVert extends VertexFrame {

    @JavaHandler
    public void setTestVar(IVert vert);

}

Vert的

abstract class Vert implements JavaHandlerContext<Vertex>, IVert {

    public void setTestVar(IVert testVar){
        Edge edge = asVertex().addEdge('foobar', testVar.asVertex())
        edge.setProperty('alias', 'chickens')
    }

}

主要方法(Groovy)

IVert vert = framedGraph.addVertex('myuniqueid', IVert)
IVert vert2 = framedGraph.addVertex('myuniqueid2', IVert)
vert.setTestVar(vert2)
Edge e = g.getVertex('myuniqueid').getEdges(Direction.BOTH, 'foobar').iterator().next()
assert e.getProperty('alias') == 'chickens'