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 は「人を見つける」ことを意味し、各人について「自分が開発した 2 つのソフトウェアと使用したソフトウェアを印刷する」ことを意味します。上記の MQL はテスト用の例にすぎないことに注意してください。

MQL を単一の gremlin に変換しようとしました。しかし、変換できませんでした。だから私はあなたに尋ねています。出来ますか?不可能な場合は、なぜ変換するのですか?(可能であれば、生成されたグレムリンが最適化と実行の点で効率的であるとよいでしょう。)

単一のグレムリンが不可能な場合、2 つ以上のグレムリンを組み合わせて、パフォーマンスを損なうことなく 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 に答える