【问题标题】:ORM for Titan graph exposed through gremlin server通过 gremlin 服务器公开的用于 Titan 图形的 ORM
【发布时间】:2016-01-21 11:14:34
【问题描述】:

我有一个使用以下配置运行的 Titan 服务器

  1. 以 Cassandra 作为存储后端的 Titan Graph
  2. 带有 WebSocketChannelizer 的 Gremlin 服务器
  3. 泰坦版本:titan-1.0.0-hadoop1

我有一个带有 Gremlin Driver 3.0.1-incubating 的 Java 应用程序,它可以打开一个客户端以连接到远程 gremlin 服务器。

我能够提交 gremlin 查询以创建顶点并使用 g.V() 之类的查询返回结果。

CompletableFuture<ResultSet> submitAsync = client.submitAsync("g.V()");
List<Result> list = submitAsync.get().all().get();

现在我想将这些列表转换为List&lt;Person&gt;

是否有任何对象映射器可用于 gremlin 驱动程序/gremlin 服务器?

【问题讨论】:

    标签: java orm titan gremlin tinkerpop


    【解决方案1】:

    据我所知,没有这样的映射器。密切关注这个问题:

    https://issues.apache.org/jira/browse/TINKERPOP3-575

    完成后,现有的 ORM 将在 Gremlin Server 上运行。现在,您必须自己将Vertex 转换为“人”。但通常,该模式不一定返回原始顶点,而是将这些顶点的一些转换返回到 Map 构造,您可以在客户端上更通用地使用它。

    【讨论】:

    • 感谢您的回复能否请您提供一个将行顶点转换为 Map 的示例 gremlin 查询?
    • 我发现这可以帮助g.V().hasLabel('person').valueMap(true)
    • 是的 - valueMap() 是一个很好的方法。您可以使用 gremlin 的转换函数将数据转换为您的客户可能希望使用的形式。
    • 谢谢斯蒂芬先生。编写了一个有点通用的映射器来将List&lt;Result&gt; 转换为public static &lt;T&gt; List&lt;T&gt; fromResults(List&lt;Result&gt; results, Class&lt;T&gt; classOfT) 的 List
    【解决方案2】:

    是的,有。请查看 Github 上的 Peapod library。您可以使用它来创建自己的类来映射所有顶点和边。 Peapod 使用代码生成来实现带框的顶点和边类。

    例如,

    @Vertex
    public abstract class Person {
      public abstract String getName();
      public abstract void setName(String name);
    
      public abstract List<Knows> getKnows();
      public abstract Knows getKnows(Person person);
      public abstract Knows addKnows(Person person);
      public abstract Knows removeKnows(Person person);
    }
    
    @Edge
    public abstract class Knows {
      public abstract void setYears(int years);
      public abstract int getYears();
    }
    

    然后,你可以这样使用它:

    public void testClassic() {
        Graph g = TinkerFactory.createClassic();
        FramedGraph graph = new FramedGraph(g, Person.class.getPackage());
    
        Person marko = graph.v(1, Person.class);
        assertEquals("marko", marko.getName());
    
        Person vadas = graph.v(2, Person.class);
        Person josh = graph.v(4, Person.class);
    
        List<Person> result = graph.V(Person.class).has("name", "josh").toList();
        assertThat(result, contains(josh));
    
        assertThat(marko.getKnows(), containsInAnyOrder(vadas, josh));
    }
    

    享受吧。

    顺便说一句,看看 here 了解其他有用的 Tinkerpop 很棒的非官方库。

    免责声明:我是Peapod 的贡献者和awesome-tinkerpop 库的所有者。

    【讨论】:

    • 感谢您的回复。是的,我读过有关 Peopod 的文章。但是使用它我们无法使用远程 gremlin 服务器。
    猜你喜欢
    • 2017-03-11
    • 2013-04-30
    • 2017-10-17
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 2017-11-30
    • 2020-09-26
    • 2016-09-14
    相关资源
    最近更新 更多