将Freebase MQL转换为TinkerPop3 gremlin?
尽管在2015年6月被弃用,我还是对它印象深刻。它直观、简洁、陈述性强,易于理解/编写 这些天我在学习TinkerPop3和gremlin。我认为小精灵有很多好的特征。我想知道是否可以将Freebase MQL转换为TinkerPop3 gremlin 比方说,我有TinkerPop3示例数据和以下MQL:将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",
[{
"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
方法很有帮助。非常感谢。请回答好吗?如果可以的话,我真的很感激。