0

尽管Freebase在 2015 年 6 月被弃用,但我对Freebase 的 MQL印象深刻。它直观、简洁、声明性且易于理解/编写。

这些天我正在学习 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 上面的意思是“找人”,并为每个人“打印他开发的两个软件和使用的软件”。请记住,上面的 MQL 只是一个测试示例。

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

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

提前致谢。

4

1 回答 1

3

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

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")
于 2015-12-03T13:02:12.483 回答