1

我有一个 Titan 图形数据库,其中包含一组顶点,这些顶点通过一个名为“property1”的属性连接起来。

是否可以编写 Gremlin(或 Titan 支持的任何其他内容)查询以:

Find all edges that have a value for "property1" that is seen 5 or less times.

在 SQL 中我会使用“Group By”,在 MongoDB 中我会使用聚合函数之一。

我在想这可能是 Furnace/Faunus 的工作?

4

1 回答 1

1

您可以通过迭代所有边并使用groupBy. 这是一个使用weight代替的玩具图示例property1

gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> g.E.groupBy{it.weight}{it}.cap.next()                         
==>0.5=[e[7][1-knows->2]]
==>1.0=[e[8][1-knows->4], e[10][4-created->5]]
==>0.4=[e[11][4-created->3], e[9][1-created->3]]
==>0.2=[e[12][6-created->3]]

因此,所有边按它们的 . 分组weight。从那里你可以下拉到标准的常规功能,比如findAll过滤掉你不想要的东西(在这里我过滤掉有>1边缘的权重......在你的情况下它会是<5)。

gremlin> g.E.groupBy{it.weight}{it}.cap.next().findAll{k,v->v.size()>1}
==>1.0=[e[8][1-knows->4], e[10][4-created->5]]
==>0.4=[e[11][4-created->3], e[9][1-created->3]]

显然,在一个非常大的图上,这有点昂贵的操作,因为您需要对边进行大量迭代,并且您必须Map在内存中建立一个可能很大的内存,具体取决于property1. 如果您能找到使用其他过滤器限制边缘迭代的方法,那可能会有所帮助。

如果你有一个非常大的图表,这对 Faunus 来说将是一个很好的工作。我将在这里给出简单的答案,并简单地说您不一定希望特定边的property1值出现少于 5 次,而您只想知道不同property1值出现的次数。使用 Faunus,您可以获得这样的分布:

g.E.property1.groupCount()
于 2013-11-28T13:37:41.550 回答