2014-05-24 47 views
3

我有我的第一次去与框架和我的Java很生锈。我坚持通过框架将信息写入数据库。我一直在关注文档并拥有一个Person界面。Tinkerpop帧写入数据库 - 新手

public interface Person { 
    @Property("name") 
    public String getName(); 

    @Adjacency(label="knows") 
    public Iterable<Person> getKnowsPeople(); 

    @Adjacency(label="knows") 
    public void addKnowsPerson(final Person person); 

    @GremlinGroovy("it.out('knows').out('knows').dedup") //Make sure you use the GremlinGroovy module! #1 
    public Iterable<Person> getFriendsOfAFriend() 
} 

这是从文档中提取的。 我可以使用这个简单的代码从图中获取数据。

TinkerGraph graph = TinkerGraphFactory.createTinkerGraph(); //This graph is pre-populated. 
FramedGraphFactory factory = new FramedGraphFactory(new GremlinGroovyModule()); //(1) Factories should be reused for performance and memory conservation. 

FramedGraph framedGraph = factory.create(graph); //Frame the graph. 

Person person = framedGraph.getVertex(1, Person.class); 
person.getName(); // equals "marko" 

我想知道的是我将如何创建一个新的Person对象并将其写入图形。因为人只有一个接口,我不能做的:

Person person2 = new Person(); 
person2.setName("John"); 
person2.setAge(36); 
framedGraph.addVertex(person2); 

所以我已经试过它实现了人,并添加以下代码

PersonImpl johnBoy = new PersonImpl(); 
johnBoy.setName("John"); 
johnBoy.setAge(36); 
johnBoy.addKnowsPerson(person); 
person.addKnowsPerson(johnBoy); 

但是我得到以下空指针一类PersonImpl的而我现在真的陷入困境。我希望有人能够帮助我。

Exception in thread "main" java.lang.NullPointerException 
    at com.tinkerpop.blueprints.impls.tg.TinkerGraph.addEdge(TinkerGraph.java:331) 
    at com.tinkerpop.frames.FramedGraph.addEdge(FramedGraph.java:310) 
    at com.tinkerpop.frames.annotations.AdjacencyAnnotationHandler.addEdges(AdjacencyAnnotationHandler.java:87) 
    at com.tinkerpop.frames.annotations.AdjacencyAnnotationHandler.processVertex(AdjacencyAnnotationHandler.java:53) 
    at com.tinkerpop.frames.annotations.AdjacencyAnnotationHandler.processElement(AdjacencyAnnotationHandler.java:26) 
    at com.tinkerpop.frames.annotations.AdjacencyAnnotationHandler.processElement(AdjacencyAnnotationHandler.java:15) 
    at com.tinkerpop.frames.FramedElement.invoke(FramedElement.java:89) 
    at com.sun.proxy.$Proxy4.addKnowsPerson(Unknown Source) 
    at com.elecrticdataland.utility.TinkerTest.main(TinkerTest.java:45) 

与许多感谢,

约翰

回答

1

无法除非代理的方式创建一个Person。换句话说,您不能使用该接口的具体实现,它必须由FramesGraph动态构建。

你的代码来创建这里Person

FramedGraph framedGraph = factory.create(graph); //Frame the graph. 

Person person = framedGraph.getVertex(1, Person.class); 
person.getName(); // equals "marko" 

没有这个,创建Person实施不会知道底层的东西,并注射给factory.create()

+0

非常感谢斯蒂芬Graph实例。我是否正确思考,因此无法通过接口向图中添加顶点,并且您需要使用这种类型的代码来实现:Graph graph = new Neo4jGraph(“/ tmp/my_graph”); Vertex a = graph.addVertex(null); Vertex b = graph.addVertex(null); a.setProperty(“name”,“marko”); b.setProperty(“name”,“peter”); Edge e = graph.addEdge(null,a,b,“knows”); e.setProperty(“since”,2006); graph.shutdown(); – user3672265

+1

我没有完全跟着你。如果你想添加一个新的Person,那么做:'Person p = g.addVertex(null,Person.class);' –

+0

非常感谢,Stephen。 – user3672265