针对Titan db的嵌套遍历gremlin查询

时间:2016-04-16 06:21:46

标签: graph-databases titan gremlin tinkerpop3

我想知道如何有一个以嵌套格式返回结果的gremlin查询。假设有如下属性图:

USERPAGE个顶点,其中包含AGE USER顶点等属性的某些属性;

FOLLOWUSER之间的

PAGE边缘;

我正在寻找一个有效的查询,它可以为所有年龄超过20岁的用户提供所有跟随的用户。我可以使用来自应用程序端的简单循环来执行此操作,并且每次迭代都使用简单的遍历查询。不幸的是,这样的解决方案对我来说效率不高,因为它会产生大量查询,在这种情况下网络延迟可能会很大。

2 个答案:

答案 0 :(得分:5)

不确定您对"高效"的定义是的,但请记住,这是一个典型的OLAP用例,你不应该期望快速的OLTP实时响应。

也就是说,查询应该如下:

g.V().has("USER", "AGE", gt(20)).as("user").
  map(out("FOLLOW").fold()).as("pages").
  select("user", "pages")

使用现代样本图的一个小例子:

gremlin> g = TinkerFactory.createModern().traversal().withComputer()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], graphcomputer]
gremlin> g.V().has("person", "age", gt(30)).as("user").
           map(out("created").fold()).as("projects").
           select("user","projects")
==>[user:v[6], projects:[v[3]]]
==>[user:v[4], projects:[v[5], v[3]]]

答案 1 :(得分:0)

这很容易:

g.V().label('user').has('age',gt(20))
.match(__.as('user').out('follows').as('page'))
.select('user','page')

当您在gremlin中使用此查询时,只需注意,gremlin会为您提供空指针异常,您可以在代码中使用它并检查“页面”是否存在。