Gremlin 查询将顶点与不相关的顶点 CosmosDB 结合起来

Gremlin query combine vertices with unrelated vertices CosmosDB

我想获得几个顶点,例如标签“用户”与顶点相结合,它们不相关,但例如标签为“电影”。

我知道,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 不支持它们。

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。