复杂Gremlin查询输出节点/边

时间:2013-12-16 12:50:23

标签: output gremlin titan

我正在尝试实现一个查询和图形可视化框架,允许用户输入Gremlin查询,返回结果的D3图。 D3图是使用JSON构建的 - 这是使用Gremlin查询的单独顶点 edge 输出创建的。对于简单的查询,例如:

g.V.filter{it.attr_a == "foo"}

这很好用。但是,当我尝试执行更复杂的查询时,如下所示:

g.E.filter{it.attr_a == 'foo'}.groupBy{it.attr_b}{it.outV.value}.cap.next().findAll{k,e->e.size()<=3}

- Find all instances of *value*
- Grouped by unique *attr_b*
- Where *attr_a* = foo
- And *attr_b* is paired with no more than 2 other instances of *value*

相反,输出的格式如下:

attr_b1: {value1, value2, value3}
attr_b2: {value4}
attr_b3: {value6, value7}

我想知道Gremlin是否有办法将结果输出为节点和边缘列表,以便我可以将结果显示为图形。我知道我可以编辑我的D3代码以接受这个新输出,但目前对查询的类型/复杂性没有限制,因此每次键/值对都不一定相同。

感谢。

1 个答案:

答案 0 :(得分:1)

你已经达到了我认为可视化Gremlin结果的关键问题之一。它们可以是任何东西。 Gremlin结果可能不仅仅是顶点和边的列表。没有办法真正控制我能想到的。在一天结束时,您实际上只能看到与D3期望的模式匹配的结果。我首先尝试检测该模式并仅在这些情况下进行可视化(可能只是将未识别的模式显示为JSON)。

考虑您的具体示例:

attr_b1: {value1, value2, value3}
attr_b2: {value4}
attr_b3: {value6, value7}

你想让D3在那里想象什么?遍历的顶点/边缘以获得该结果?如果是这样,你可能会陷入困境。 Gremlin没有给你一种方法来反省管道,看看它是通过它的。换句话说,除非用户明确收集管道中被触摸的顶点和边缘,否则您将无法访问它们。以这种方式能够“监视”管道会很好,但目前它不会这样做。 TinkerPop内部已经进行了内部讨论,以创建一种新的管道实现,这将有助于实现这一目标,但目前它并不存在。

因此,如果没有“间谍”能力,我认为您唯一的解决方法是:

  1. 检测客户端的顶点/边缘列表,仅渲染那些带有d3的列表。如果他们想要可视化,这将迫使用户总是编写以这种格式返回数据的gremlin。把它放在用户手中。
  2. 可能为顶点/边缘列表提供服务器端绑定,如果用户的结果与可视化引擎预期的结果不一致,用户可以明确地将其顶点/边缘副作用。再次,如果他们想要可视化,这将迫使用户根据您的需要编写他们的gremlin。