将 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")
尽管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")