【发布时间】:2020-02-20 05:46:02
【问题描述】:
请您帮我编写一个查询,将遍历中的每个源顶点及其关联的边和顶点作为每个此类源顶点上的数组返回?简而言之,我需要一个包含 3 元组数组的结果集,每个元组的第 1 项是源顶点,第 2 项和第 3 项是关联数组。
谢谢!
编辑 1:扩展了图形数据并添加了我当前的问题查询。 编辑 2:改进的 Gremlin 示例图形代码(抱歉,认为没有人会真正运行它。)
示例图
g.addV("blueprint").property("name","Mall").
addV("blueprint").property("name","HousingComplex").
addV("blueprint").property("name","Airfield").
addV("architect").property("name","Tom").
addV("architect").property("name","Jerry").
addV("architect").property("name","Sylvester").
addV("buildingCategory").property("name","Civil").
addV("buildingCategory").property("name","Commercial").
addV("buildingCategory").property("name","Industrial").
addV("buildingCategory").property("name","Military").
addV("buildingCategory").property("name","Resnameential").
V().has("name","Tom").addE("designed").to(V().has("name","HousingComplex")).
V().has("name","Tom").addE("assisted").to(V().has("name","Mall")).
V().has("name","Jerry").addE("designed").to(V().has("name","Airfield")).
V().has("name","Jerry").addE("assisted").to(V().has("name","HousingComplex")).
V().has("name","Sylvester").addE("designed").to(V().has("name","Mall")).
V().has("name","Sylvester").addE("assisted").to(V().has("name","Airfield")).
V().has("name","Sylvester").addE("assisted").to(V().has("name","HousingComplex")).
V().has("name","Mall").addE("classification").to(V().has("name","Commercial")).
V().has("name","HousingComplex").addE("classification").to(V().has("name","Resnameential")).
V().has("name","Airfield").addE("classification").to(V().has("name","Civil"))
请注意,以上是我们数据的非常简化的呈现。
需要的查询结果
我需要将每个蓝图顶点作为基础,并将其关联的每个边/顶点作为数组。
我目前的解决方案
目前我执行这个非常繁琐的查询,获取蓝图并分配标签,获取架构师并分配标签,然后选择两个标签。解决方法还可以;但是,当我需要包含边或需要获取蓝图分类顶点(工业、军事、住宅、商业等)时,它会变得混乱。实际上,我需要为每个蓝图拉回的关联数据越多,我的解决方案就会变得越草率。
我当前的查询看起来像这样:
g.V().hasLabel("blueprint").as("blueprints").
outE().or(hasLabel("designed"),hasLabel("assisted")).inV().as("architects").
select("blueprints").coalesce(out("classification"),constant()).as("classifications").
select("blueprints","architects","classifications")
以上产生了很多重复。如果:blueprints 为 b,architects 为 a,classifications 为 c,则结果集包含 b * a * c 结果。我想要一个蓝图,其中包含一组相关的架构师和一组相关的分类(如果有的话)。
并发症
我正在尝试在一个查询中执行此操作,以便我可以从图表中获取所有蓝图数据以填充过滤列表。一旦我有了包含所有顶点、边及其属性的列表,用户就可以单击指向 blob 的链接、浏览到项目站点等。因此,我需要考虑分页和过滤,我会每次我得到一个新页面或过滤器发生变化时,我宁愿去一次服务器。
【问题讨论】:
-
您可能想要添加更多关于您的数据的示例,以便查询变得更加相关,就像您将
industrial、military引用为blueprint的类型一样,所以您可以延长它。您还可以提供一个查询示例以供使用,因此其他人不会遵循您的路径。 -
我已经按要求完成了。
-
请测试您的数据加载脚本。它不是一个有效的语法。最值得注意的问题是将“id”作为属性键与代表实际图形元素标识符的
T.id混合。此外,您的addE()语句不正确 -from()和to()调制器需要指向步骤标签或顶点(在某些情况下,您有后者“正确”但由于T.id问题我提到了他们将不返回任何顶点)。 -
我已经按要求完成了。
-
不确定是否有助于添加我正在寻找的结果是一组 3 元组,其中每个元组:第 1 项是蓝图,第 2 项是蓝图的架构师数组,第 3 项是蓝图的分类数组。
标签: gremlin azure-cosmosdb-gremlinapi