我知道实施细节是这个问题的因素,但是我也意识到我在这里可能做错了什么。如果是这样,我能做得更好吗?如果Gremlin具有一些我不知道的多结果集提交查询批处理功能,则可以解决该问题。就像Gremlin一样,并行运行这三个查询并将结果提供给我。
从本质上讲,我需要知道某个顶点何时具有一定的边缘,如果它没有该边缘,则需要拉一个空白。所以...
g.V().as("v").coalesce(outE("someLabel").has("someProperty","someValue"),constant()).as("e").select("v","e")
该查询比简单地使用以下方法获得优势要高 10倍:
g.V().outE("someLabel").has("someProperty","someValue")
因此,如果我想获得一组具有其边缘或空白占位符的顶点,则有两个选择:进行两个离散查询并“联接” API中的数据或进行一个非常昂贵的查询。
我的假设是,在Gremlin中,我们“ 一次旅行” ,实际上这可能是完全错误的。也就是说,我也知道在API中撤回大量数据并有效地进行联接是不好的做法,因为它破坏了封装主体。这还会增加往返开销。
答案 0 :(得分:0)
好的,所以我找到了一个荒谬但快速的解决方案。它涉及遍历遍历,因此,如果有更好的方法,让我先道歉...
g.inject(true).
union(
__.V().not(outE("someLabel")).constant().as("ridiculous"),
__.V().outE("someLabel").as("ridiculous")
).
select("ridiculous")
本质上,我必须编写两次查询。一次用于我想要的边缘遍历,再一次用于缺少边缘的遍历。因此,如果我有n个存在/不存在的检查,我将需要2 ^ n个查询副本,每个副本都有其自己的检查组合,以便获得最佳性能。不幸的是,采用这种方法会带来堆栈溢出的风险,更不用说使代码无法可靠地管理了。
答案 1 :(得分:0)
您的原始查询返回了顶点边对,而答案只返回边。
您可以运行g.E().hasLabel("somelabel")
以获得相同的结果。
可能比原始查询更快的替代方法是:
g.E().hasLabel("somelabel").as("e").outV().as("v").select("v","e")
或
g.V().as("v").outE("somelabel").as("e").select("v","e")
答案 2 :(得分:0)
如果Gremlin有一些我不知道的多结果提交查询批处理功能,那就可以解决问题
Gremlin / TinkerPop没有内置这种功能。至少有一个图形确实具有某种形式的Gremlin批处理-DataStax图形...对其他图形不确定。
我也不确定我是否真的有任何答案可能对您有用,但是我不希望这两个遍历之间的性能差异达到10倍,但我希望第一个遍历在大多数图形数据库上会更差。基本上,将命名步骤与as()
一起使用可对遍历进行路径计算要求,从而增加了成本。优化Gremlin时,我最早的步骤之一就是尝试寻找方法来排除可能会做的任何事情。
这个问题似乎与您在Jagged Result Array上的另一个问题有关,但是我无法将上下文从一个问题保留到另一个问题,以了解如何进一步阐述。