将 Freebase MQL 转换为 TinkerPop3 gremlin?

converting Freebase MQL to TinkerPop3 gremlin?

尽管Freebase was deprecated in Jun. 2015, I was impressed by Freebase's MQL。它直观、简洁、声明式,并且易于 understand/write。

最近我在学习 TinkerPop3 和 gremlin。我认为 gremlin 有很多好的特性。我想知道我是否可以将 Freebase MQL 转换为 TinkerPop3 gremlin。

比方说,我有 TinkerPop3 示例数据 "The Crew" 和以下 MQL:

[{
    "type": "person",
    "name": null,
    "develops": {
        "type": "software",
        "release_date": null, // release_date is not in the crew data.
                              // Just added for test
        "name": null,
        "sort": "-name",      // descending sort
        "limit": 2            // print only two software
    },
    "uses": {
        "type": "software",
        "release_date": null,
        "name": null,
        "sort": "name",       // ascending sort
        "limit": 2
    }
}]

以上 MQL 表示 "find person",每个人 "print his two developed software and used software"。请记住,上面的 MQL 只是一个测试示例。

我尝试将 MQL 转换为单个 gremlin。但我无法转换它。所以我问你。可能吗?那么如何转换,如果不可能,为什么? (如果可能的话,如果生成的 gremlin 在优化和执行方面是有效的会更好。)

如果单个 gremlin 是不可能的,那么有没有可能组装两个或更多 gremlin 可以生成与 MQL 的输出相同而没有性能损失?

在此先致谢。

解决这个问题最快的查询应该是:

gremlin> g.V().hasLabel("person").as("person").
gremlin>   map(out("develops").order().by("name", decr).limit(2).fold()).as("develops").select("person").
gremlin>   map(out("uses").order().by("name", incr).limit(2).fold()).as("uses").
gremlin>   select("person","develops","uses")
==>[person:v[1], develops:[v[11], v[10]], uses:[v[10], v[11]]]
==>[person:v[7], develops:[v[11], v[10]], uses:[v[10], v[11]]]
==>[person:v[8], develops:[v[10]], uses:[v[10], v[11]]]
==>[person:v[9], develops:[], uses:[v[10], v[11]]]

但是,使用 match() 步骤,您可能可以增强可读性(尽管它包含相同的步骤):

g.V().hasLabel("person").match(
    __.as("person").out("develops").order().by("name", decr).limit(2).fold().as("develops"),
    __.as("person").out("uses").order().by("name", incr).limit(2).fold().as("uses")).
  select("person","develops","uses")

更新

既然不想在结果集中看到我(v[9]),可以加个简单的过滤条件:

g.V().hasLabel("person").as("person").
  filter(outE("develops").and().outE("uses")).
  map(out("develops").order().by("name", decr).limit(2).fold()).as("develops").select("person").
  map(out("uses").order().by("name", incr).limit(2).fold()).as("uses").
  select("person","develops","uses")