0

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

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 代码以接收这个新输出,但目前对查询的类型/复杂性没有限制,因此键/值对不一定每次都相同。

谢谢。

4

1 回答 1

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。
于 2013-12-16T13:45:59.173 回答