创建复杂的gremlin-java查询

时间:2013-10-28 22:03:11

标签: gremlin titan

我在titan graph数据库中实现了模型,关系如下:

[A] ---(e1)---> [B] <---(e2)--- [C] ---(e3)---> [D]
 |      |        |       |       |      |        |
prop:id |    prop:number |       | label:e3      |
        |                |    prop:id            |
   label:e1         label:e2                 prop:number
    prop:prop1

AB是&#34;主要顶点&#34; (例如用户),顶点BC是不太重要的顶点&#34;描述与用户相关的一些数据。

查询算法的输入是顶点id的属性A

我想找到所有这些顶点D,它们以上面显示的方式与A连接。还有什么我想要记住prop1e1之间边A的属性B

更准确地说,我想有效地检索对(prop1, numberD),其中prop1A -> B之间边缘的属性(如果边具有此属性),numberD是来自number的属性D

我不知道如何有效地实施此查询。

很容易只检索顶点D(使用GremlinPipes):

pipe
.start(startVertex)
.outE("e1")
.inV().hasProperty("number")
.inE("e2")
.outV().hasProperty("id")
.outE("e3")
.inV().hasProperty("number");

但是当我需要获得边e1并将它们与顶点D匹配时,会出现问题。 我试图分别计算所有这些步骤,但似乎非常低效。

您是否有任何建议如何使用gremlin-java或gremlin-groovy来实现(可能使用多个查询)? 谢谢!

1 个答案:

答案 0 :(得分:2)

看看这里描述的模式匹配模式:

https://github.com/tinkerpop/gremlin/wiki/Pattern-Match-Pattern

startVertex.outE('e1').as('e')
.inV().hasProperty('number').inE("e2")
.outV().hasProperty("id")
.outE("e3")
.inV().hasProperty("number").as('d')
.table(t)

这应该给出一个map的迭代器

[e:e1, d:D]

从这些地图中,您可以轻松提取您感兴趣的属性。