2016-08-25 42 views
0

我想沿着給定的邊緣關係去除一組頂點及其所有後代。在我的情況,圖中有一些頂點,其類型爲會議,和其他類型爲事件。從事件到會話的弧線有標籤in_session刪除泰坦圖中的後代

似乎有沒有快速的方法在一個通做到這一點。這裏是我使用的代碼:

// First, select all event descendants of sessions with r < 700 
GraphTraversal<Vertex, Vertex> t = g.V() 
    .has("type", "session") 
    .has("r", P.lt(700)) 
    .in("in_session"); 

// And remove those events 
while (t.hasNext()) 
    t.next().remove(); 

// Then, using the first part of the query again, 
// select the same sessions as before 
t = g.V().has("type", "session").has("r", P.lt(700)); 

// And delete them as well 
while (t.hasNext()) 
    t.next().remove(); 

對我來說這似乎很笨拙。此外,如果我想刪除低層次的後代,我必須寫更多的重複步驟(一直到底部,然後刪除,然後備份一個級別,然後刪除,然後再次備份一個級別,等等。 ..)。另外我注意到TitanGraph中沒有removeVertex方法。

回答

2

一種方法是使用sideEffect()。比方說,我要刪除所有「知道」在TinkerPop有關toy「現代」圖從「馬爾科」頂點頂點:

gremlin> graph = TinkerFactory.createModern() 
==>tinkergraph[vertices:6 edges:6] 
gremlin> g = graph.traversal() 
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard] 
gremlin> g.V().has('name','marko').outE() 
==>e[9][1-created->3] 
==>e[7][1-knows->2] 
==>e[8][1-knows->4] 
gremlin> g.V().has('name','marko').sideEffect(out('knows').drop()).drop() 
gremlin> g.V().has('name','marko') 
gremlin> g.V(2) 
gremlin> g.V(4) 
gremlin> g.V(3) 
==>v[3] 

注意使用drop()而不是迭代遍歷調用remove()每個元素。

+0

我用GV()。具有( 「類型」, 「會話」)。具有( 「R」,P.lt(700))。sideEffect(在( 「in_session」)。降())。降( )但沒有頂點被刪除。另外drop()沒有記錄在thinkerpop javadoc中。 – Totem

+1

第一個'drop()'是GraphTraversal類中的一個方法。請參閱http://tinkerpop.apache.org/docs/current/reference/#drop-step - 接下來你必須遍歷你的遍歷(控制檯爲你做),所以如果你正在用java寫代碼,你必須終止用'iterate()'遍歷 - 見http://tinkerpop.apache.org/docs/current/tutorials/the-gremlin-console/#result-iteration –