我正在尝试实现一个查询和图形可视化框架,允许用户输入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代码以接受这个新输出,但目前对查询的类型/复杂性没有限制,因此每次键/值对都不一定相同。
感谢。
答案 0 :(得分:1)
你已经达到了我认为可视化Gremlin结果的关键问题之一。它们可以是任何东西。 Gremlin结果可能不仅仅是顶点和边的列表。没有办法真正控制我能想到的。在一天结束时,您实际上只能看到与D3期望的模式匹配的结果。我首先尝试检测该模式并仅在这些情况下进行可视化(可能只是将未识别的模式显示为JSON)。
考虑您的具体示例:
attr_b1: {value1, value2, value3}
attr_b2: {value4}
attr_b3: {value6, value7}
你想让D3在那里想象什么?遍历的顶点/边缘以获得该结果?如果是这样,你可能会陷入困境。 Gremlin没有给你一种方法来反省管道,看看它是通过它的。换句话说,除非用户明确收集管道中被触摸的顶点和边缘,否则您将无法访问它们。以这种方式能够“监视”管道会很好,但目前它不会这样做。 TinkerPop内部已经进行了内部讨论,以创建一种新的管道实现,这将有助于实现这一目标,但目前它并不存在。
因此,如果没有“间谍”能力,我认为您唯一的解决方法是: