2017-11-09 13 views
0
Group[code=a]->Choice[selected=true] 
Group[code=a]->Choice[selected=false] 
Group[code=a]->Choice[selected=false] 
Group[code=b]->Choice[selected=false] 
Group[code=b]->Choice[selected=false] 
Group[code=c]->Choice[selected=false] 
Group[code=c]->Choice[selected=true] 

与えられた頂点が与えられていると、グループに選択頂点がなく、選択された属性が真であるグループ頂点を照会しようとしています。グラフのトラバーサルとフィルタリング(OrientDBを使用)

したがって、結果はすべてのヘルプは高く評価され

Group[code=b] 

bのグループのみを返す必要があります。

答えて

2

ここにあなたのグラフだ - それは、このようにあなたのサンプルデータを提供するために、常に便利ですグレムリンに関する質問をするとき:あなたが望む答えを得るために

graph = TinkerGraph.open() 
g = graph.traversal() 
g.addV('group').property('code','a').as('a'). 
    addV('group').property('code','b').as('b'). 
    addV('group').property('code','c').as('c'). 
    addV('choice').property('selected',true). 
    addE('link').from('a'). 
    addV('choice').property('selected',false). 
    addE('link').from('a'). 
    addV('choice').property('selected',false). 
    addE('link').from('a'). 
    addV('choice').property('selected',false). 
    addE('link').from('b'). 
    addV('choice').property('selected',false). 
    addE('link').from('b'). 
    addV('choice').property('selected',false). 
    addE('link').from('c'). 
    addV('choice').property('selected',true). 
    addE('link').from('c').iterate() 

一つの方法は、このようなトラバースを行うことです。

gremlin> g.V().hasLabel('group'). 
......1> where(__.not(out('link').has('selected',true))). 
......2> values('code') 
==>b 

上記の答えはTinkerPop 3.xです。 TinkerPop 2.xでは、パターンは同じです。基本的には:

g.V().has('label','group').filter{ it._().out('link').has('selected',true).hasNext() } 
+0

ありがとう! - これはTinkerpop 3で動作しますが、Tinkerpop 2xを使用したソリューションを探していましたが、OrientDBコミュニティバージョンは古いTinkerpop仕様をサポートしています。 – DavSeq

+0

私の2.xの知識は不安定ですが、パターンはほぼ同じです。 2.xを含むように私の答えを更新し、さらに3.xの答えをさらに改善しました。トラバーサルは、すべての隣接する頂点を反復し、潜在的に複数の真を見つけるよりも、最初の「真」に当たるとすぐに停止します。 –

+0

多くのありがとうスティーブン! – DavSeq

関連する問題