当前位置: 首页 > 知识库问答 >
问题:

tinkerpop/gremlin:选择顶点和输出边计数

空枫涟
2023-03-14

我试图找到一个高效的gremlin查询,它返回顶点和输出边数的遍历。或者更好的是,如果存在或不存在传出边,则使用布尔值代替传出边的数量。

我的第一次尝试是:

gts.v(ids).as(“v”).选择(__.oute(),__.constant(true),__.constant(false)).as(“e”).选择(“v”,“e”);

第二个想法是:

两者似乎都有效,但是否有更好的解决方案,不需要底层图实现来获取或计数所有边?

(我们目前在Postgresql中使用Tinkerpop/Gremlin的sqlg实现,这两个查询似乎都从Postgresql中获取所有传出的边缘。这可能是缺少一些优化的情况。但我的问题不是sqlg特有的。)

共有1个答案

乔凯康
2023-03-14

如果您只需要知道边是否存在,那么您应该在by()调制器中limit()结果:

gremlin> g.V().project('v','e').by().by(outE().limit(1).count())
==>[v:v[1],e:1]
==>[v:v[2],e:0]
==>[v:v[3],e:0]
==>[v:v[4],e:1]
==>[v:v[5],e:0]
==>[v:v[6],e:1]

在这种方式下,你不计算所有的边,只计算第一个足够回答你的问题的边。您可以执行truefalse,如果您愿意的话,只需稍作修改:

gremlin> g.V().project('v','e').by().by(coalesce(outE().limit(1).constant(true),constant(false)))
==>[v:v[1],e:true]
==>[v:v[2],e:false]
==>[v:v[3],e:false]
==>[v:v[4],e:true]
==>[v:v[5],e:false]
==>[v:v[6],e:true]
 类似资料:
  • 在遍历图时,我想保存起始顶点,再进一步遍历一点,并将具有特定边的任何顶点移回保存的顶点。 这是我目前的尝试,但显然是不正确的: 如何检查Gremlin中的顶点相等?如何过滤掉存在此类相等的所有路径?

  • 我只是在玩Cosmos DB中的Graph API,它使用Gremlin语法进行查询。 我在图中有许多用户(顶点),每个用户对其他用户都有“知道”的属性。其中一些是外边缘(outE),另一些是内边缘(inE),具体取决于关系的创建方式。我现在尝试创建一个查询,该查询将返回给定用户(顶点)的所有“已知”关系。我可以通过以下方式轻松获取inE或outE的ID: 其中是我正在查询的用户的ID,但我无法提

  • 我正在使用Gremlin/Tinkerpop 3查询存储在TitanDB中的图形。 该图包含具有属性(例如“描述”)的用户顶点和表示用户之间关系的边。 我想使用Gremlin按属性获取1)用户和2)与其他用户(例如,id=123)的关系数(在这种情况下为任何类型)。为了实现这一点,我使用Gremlin 3中的操作,如下所示: 除非返回多个用户顶点,否则此查询工作正常,例如,因为多个用户的描述中有“

  • 我花了几个小时试图写一个小精灵语句来处理在它们之间插入两个顶点和一条边,但运气不太好。 在伪gremlin中,我想做的事情非常简单,如下所示: 此代码的问题是每个步骤,作为屏障步骤“删除”前面步骤的值。 有没有办法在一个声明中正确地做到这一点? 感谢开尔文的回答,这里是解决方案:)

  • GraphX暴露保存在图中的顶点和边的RDD。然而,因为GraphX包含的顶点和边拥有优化的数据结构,这些数据结构提供了额外的功能。顶点和边分别返回VertexRDD和EdgeRDD。这一章 我们将学习它们的一些有用的功能。 VertexRDDs VertexRDD[A]继承自RDD[(VertexID, A)]并且添加了额外的限制,那就是每个VertexID只能出现一次。此外,VertexRDD

  • 我试图组合一个查询来获取所有传入和传出的顶点,包括它们的边和方向,但这也会返回那些没有边的顶点。 我现在可以通过强制所有东西都至少有一个边缘来解决这个问题,但这是我想要避免的。 也许值得注意的是,我使用Azure CosmosDB的图形API:https://docs.microsoft.com/en-us/azure/cosmos-db/gremlin-support 这是我用来返回所有顶点及其