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

Gremlin 查询将顶点与不相关的顶点 CosmosDB 组合在一起

羊舌琛
2023-03-14

我想获得几个顶点,例如,带有标签“user”的顶点与顶点组合在一起,它们与之无关,但带有标签“movie”的顶点。

我知道,Gremlin的力量是遍历顶点,组合不相关的对象并不是图形的最佳用例。我正在为我的应用程序使用 Azure CosmosDB,所以如果知道如何提高性能,请随时告诉我。如果你可以用 gremlin 做到这一点,我需要一些查询方面的帮助。我在这里举一个例子:

有4个用户:bob、jose、frank、peter和4部电影:电影1、电影2、电影3、电影4

在用户和电影之间可以有一个边缘“观看”

我的示例数据如下:

watched:
[bob, [movie1,movie2]]
[jose, [movie3]]
[frank, []]
[peter, [movie]]

我希望得到的结果和格式如下:

not watched:
[bob, movie3]
[bob, movie4]
[jose, movie1]
[jose, movie2]
[jose, movie4]
[frank, movie1]
[frank, movie2]
[frank, movie3]
[frank, movie4]
[peter, movie1]
[peter, movie2]
[peter, movie3]

设置图形的脚本(使用 /partition_key作为分区键):

g.addV("user").property("partition_key", 1).property("id", "bob")
g.addV("user").property("partition_key", 1).property("id", "jose")
g.addV("user").property("partition_key", 1).property("id", "frank")
g.addV("user").property("partition_key", 1).property("id", "peter")

g.addV("movie").property("partition_key", 1).property("id", "movie1")
g.addV("movie").property("partition_key", 1).property("id", "movie2")
g.addV("movie").property("partition_key", 1).property("id", "movie3")
g.addV("movie").property("partition_key", 1).property("id", "movie4")

g.V("bob").addE("watched").to(g.V("movie1"))
g.V("bob").addE("watched").to(g.V("movie2"))
g.V("jose").addE("watched").to(g.V("movie3"))
g.V("peter").addE("watched").to(g.V("movie4"))

请考虑,我不能使用lambda,因为Azure CosmosDB不支持它们。

共有1个答案

冯鸿哲
2023-03-14

gremlin中的join可以通过重复V()步骤来实现。意识到这一点后,gremlin查询读起来几乎就像普通的SQL查询,见下文。

g.V().has("id", "bob").addE("watched").to(__.V().has("id", "movie1"))
g.V().has("id", "bob").addE("watched").to(__.V().has("id", "movie2"))
g.V().has("id", "jose").addE("watched").to(__.V().has("id", "movie3"))
g.V().has("id", "peter").addE("watched").to(__.V().has("id", "movie4"))

g.V().hasLabel("user").as("u").
  V().hasLabel("movie").as("m").
  in("watched").where(neq("u")).
  select("u", "m").by("id").
  order().by("u").by("m")

==>[u:bob,m:movie3]
==>[u:bob,m:movie4]
==>[u:frank,m:movie1]
==>[u:frank,m:movie2]
==>[u:frank,m:movie3]
==>[u:frank,m:movie4]
==>[u:jose,m:movie1]
==>[u:jose,m:movie2]
==>[u:jose,m:movie4]
==>[u:peter,m:movie1]
==>[u:peter,m:movie2]
==>[u:peter,m:movie3]

你说得对,这个查询在gremlin中表现不佳,我建议你使用CosmosDb的SQL API。

 类似资料:
  • 在遍历图时,我想保存起始顶点,再进一步遍历一点,并将具有特定边的任何顶点移回保存的顶点。 这是我目前的尝试,但显然是不正确的: 如何检查Gremlin中的顶点相等?如何过滤掉存在此类相等的所有路径?

  • 我是新的gremlin和有一个非常简单的情况下,我需要检查: 如果顶点存在 更新属性 添加带有属性的顶点 我正在为此使用Java API。 我的代码: 我知道这是一个非常简单的案例,我参考了[CosmosDB Graph:"upert"查询模式中给出的示例 但它不起作用。如果顶点不存在,则会将其与属性一起添加,但属性也会更新。

  • 我需要从一个顶点开始,找到所有相关的顶点,直到结束。标准是匹配边inV顶点中的任何一个边属性(属性)。如果边缘属性“value”与inV顶点“attribute”名称不匹配,我应该跳过该顶点。边的属性值作为属性名称传播到inV顶点中 我使用下面的查询,但这给了我父节点、下一个节点和之间的边的json输出。通过输出am写入逻辑,仅拾取与边缘属性匹配的下一个属性。如果属性匹配可以通过gremlin查询

  • 如何在Gremlin查询中检索从根顶点开始的所有顶点属性? 我们有以下结构: 根顶点:Employee 边缘:EdCompany,EdDepartment,EdRole顶点:公司,部门,角色 我们试图接收与根顶点连接的其他顶点的数据。有人这样想: 我们尝试了该查询,但返回了一个复杂的JSON: 编辑: 我们还尝试了Kelvin建议的查询: 堆栈跟踪:提交查询失败:g.V().hasLabel(“E

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

  • 我有一个用户名数组(例如,)要添加到图中的“user”标签下。 现在我首先要检查用户名是否已经存在(),然后仅在“user”标签下添加username属性不匹配的内容。 此外,这可以在单个gremlin查询或groovy脚本中完成吗? 我正在使用titan graph数据库、tinkerpop3和gremlin REST服务器。

  • 我有一个这样的图表 也就是说,每个“事件”顶点有两条传入边:一条终止于“工程师”顶点,另一条终止于“生产者”顶点。但生产者顶点的函数因边缘标签而异。 我想得到原始制作人,事件,工程师和终止制作人。 我有一个小精灵的密码: 也就是说,我选择了一个给定的生产者,获取事件和工程师,然后返回关于每个顶点的一些细节。 我还希望生产者与同一查询中的事件对齐,但不确定如何做到这一点。 非常感谢您的帮助。

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