0

请您帮我编写一个查询,该查询将遍历中的每个源顶点及其关联的边和顶点作为每个此类源顶点上的数组返回?简而言之,我需要一个包含 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 的链接、浏览到项目站点等。因此,我需要考虑分页和过滤,我会每次我得到一个新页面或过滤器发生变化时,我宁愿去一次服务器。

4

1 回答 1

0

我想出了一个答案;但是,它使查询的计算费用翻了两番。不确定这是否可以进一步优化。

g.V().hasLabel("blueprint").
project("blueprints","architects").
by().
by(outE().or(hasLabel("designed"),hasLabel("assisted")).inV().dedup().fold())

我刚刚解决了蓝图和架构师,但分类只需要另一个 by(...traversal...) 和投影标签。

我可能只需要在一个查询中获取蓝图,在并行查询中获取它们的每个关联项,然后将它们全部放在 API 中。对于 API 数据层来说,这将是非常糟糕的设计,但出于性能原因可能是必要的。

于 2019-10-24T20:23:13.070 回答