首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Freebase MQL转换为TinkerPop3 gremlin?

将Freebase MQL转换为TinkerPop3 gremlin?
EN

Stack Overflow用户
提问于 2015-12-03 09:22:57
回答 1查看 86关注 0票数 0

尽管自由基在2015年6月遭到反对,但自由基MQL给我留下了深刻的印象。它直观、简洁、声明性强,易于理解/编写。

这些天我正在学习TinkerPop3和gremlin。我觉得格里姆林有很多好的特征。我想知道是否可以将Freebase转换为TinkerPop3 gremlin。

比方说,我有TinkerPop3示例数据“船员”,下面是MQL:

代码语言:javascript
复制
[{
    "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是否可以产生与MQL输出相同的性能损失?

谢谢你的进阶。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-03 13:02:12

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

代码语言:javascript
复制
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()步骤,您可能可以增强可读性(尽管它包含相同的步骤):

代码语言:javascript
复制
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]),所以可以添加一个简单的筛选条件:

代码语言:javascript
复制
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")
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34062087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档