2017-01-15 41 views
0

Gremlinクエリでif-elseを調べようとしています。 g.V({0})が下のグループ頂点であるとします。gremlin query if-else-thenグラフトラバーサル

var q = "g.V({0}).as('groupName', 'groupId', 'ownerId').inE(eIsAdminOf, eIsMemberOf).as('rel', 'joinDate').outV().hasLabel(userLabel).as('memberId')"; 
    //TODO:var q = "g.V({0}).as('groupName', 'groupId', 'ownerId').inE(eIsAdminOf"; 
    //if .has('mCanList',true).inE(eIsAdminOf, eIsMemberOf) 
    //if .has('mCanList',false).inE(eIsAdminOf) 

    //, eIsMemberOf).as('rel', 'joinDate').outV().hasLabel(userLabel).as('memberId')"; 

私は.inE(eIsAdminOf, eIsMemberOf)は、上記のコメントのように、真または偽のプロパティ値mCanListに基づくようにします。

は無駄に選択しようとしている:私はグレムリンライブラリとグレムリンのクエリを構築するためにNode.jsのを使用しています

var q = "g.V({0}).as('groupName', 'groupId', 'ownerId','mCanList'); 
    q += ".by(values('mCanList').choose(is(true),.inE(eIsAdminOf, eIsMemberOf), .inE(eIsAdminOf))"; 
    q += '.as('rel', 'joinDate').outV().hasLabel(userLabel).as('memberId')”; 

。私にとっては最悪の選択肢は別に、私はあなたがそう持っているすべてのステップのラベルの背後にある理由に従っていることはよく分からない

if .has('mCanList',true).inE(eIsAdminOf, eIsMemberOf) or 
if .has('mCanList',false).inE(eIsAdminOf) 

TIA

答えて

4

に基づいて結果を構築する2つの別々の非同期クエリを構築することです私はほとんどあなたの質問の焦点と思われるchoose()の使用を実証するためにそれを省略しました。私はあなたのグラフ構造があなたの問題の記述方法に基づいているとおおよそ近似しました(将来の質問がある場合は、Gremlin Consoleセッションに簡単にカット/ペーストできるサンプルグラフ作成コードを提供することを検討してください)。いずれにせよ、ここで私はあなたが必要だと思うものです:

gremlin> g = TinkerGraph.open().traversal() 
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard] 
gremlin> g.addV(id,1).property("mCanList",true).as('a'). 
......1> addV(id,2).as('b'). 
......2> addV(id,3).as('c'). 
......3> addE("isAdminOf").from("b").to("a"). 
......4> addE("isMemberOf").from("c").to("a").iterate() 
gremlin> g.V(1).choose(has('mCanList',true),inE("isAdminOf","isMemberOf"),inE("isAdminOf")) 
==>e[1][2-isAdminOf->1] 
==>e[2][3-isMemberOf->1] 
gremlin> 
gremlin> g.V(1).property('mCanList',false) 
==>v[1] 
gremlin> g.V(1).choose(has('mCanList',true),inE("isAdminOf","isMemberOf"),inE("isAdminOf")) 
==>e[1][2-isAdminOf->1] 

私が直接あなたのグレムリンを編集しようとする場合、私はあなたのトラバーサルが基本的にはこのように見える必要があると思う:

var q = "g.V({0}); 
    q += ".choose(has('mCanList',true),inE(eIsAdminOf, eIsMemberOf), inE(eIsAdminOf))"; 
    q += ".outV().hasLabel(userLabel)"; 

私はeIsAdminOf」と推定"、" eIsMemberOf "、" userLabel "はJS変数です。そうでなければ実際のラベル名である場合には引用符を必要とします。繰り返しますが、私はas()のすべての用途で何をしているのかはっきりしていません。あなたの質問に基づいてトラバーサルに関係するようには思えませんでした。

関連する問題