我有一个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的工作?
答案 0 :(得分: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
对所有边缘进行分组。从那里你可以下到标准的groovy函数,如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次,并且您只想知道不同{{1}的多少次}值出现。使用Faunus,你可以得到这样的分布:
property1