将Freebase MQL转换为TinkerPop3 gremlin?

将Freebase MQL转换为TinkerPop3 gremlin?,gremlin,tinkerpop3,Gremlin,Tinkerpop3,尽管在2015年6月被弃用,我还是对它印象深刻。它直观、简洁、陈述性强,易于理解/编写 这些天我在学习TinkerPop3和gremlin。我认为小精灵有很多好的特征。我想知道是否可以将Freebase MQL转换为TinkerPop3 gremlin 比方说,我有TinkerPop3示例数据和以下MQL: [{ "type": "person", "name": null, "develops": { "type": "software",

尽管在2015年6月被弃用,我还是对它印象深刻。它直观、简洁、陈述性强,易于理解/编写

这些天我在学习TinkerPop3和gremlin。我认为小精灵有很多好的特征。我想知道是否可以将Freebase MQL转换为TinkerPop3 gremlin

比方说,我有TinkerPop3示例数据和以下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是否可能生成与MQL相同的输出而不损失性能


感谢使用advanced。

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

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()
步骤可能可以增强可读性(尽管它包含相同的步骤):

更新

由于您不想在结果集中看到我(
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")

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

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()
步骤可能可以增强可读性(尽管它包含相同的步骤):

更新

由于您不想在结果集中看到我(
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")

谢谢你有时间。即使您的小精灵的工作原理与MQL相同(顶点9(您!)没有
developments
edge,因此不应打印v[9]),
map/fold
方法很有帮助。非常感谢。请回答好吗?如果可以的话,我真的很感激。谢谢你有时间。即使您的小精灵的工作原理与MQL相同(顶点9(您!)没有
developments
edge,因此不应打印v[9]),
map/fold
方法很有帮助。非常感谢。请回答好吗?如果可以的话,我真的很感激。