2016-09-14 3 views
4

Ниже приведен пример графаКак выбрать ребра, которые имеют одинаковое значение атрибутов

gremlin> v1 = graph.addVertex(id, 1, label,"cell_1") 
gremlin> v2 = graph.addVertex(id, 2, label,"cell_2") 
gremlin> v1.addEdge("test",v2,id,3,"srving_rsrp",20,"nbr_rsrp",30) 
gremlin> v1.addEdge("test",v2,id,4,"srving_rsrp",30,"nbr_rsrp",30) 
gremlin> v1.addEdge("test",v2,id,5,"srving_rsrp",10,"nbr_rsrp",40) 

Мне нужно, чтобы край, где «srving_rsrp» и «nbr_rsrp» имеют одинаковое значение. Я не могу найти хороший пример, который его подгоняет

Здесь я добрался; Вместо каждого из них я хотел бы использовать фильтр для создания графика только с краями, соответствующими критериям. Я использую Germlin оболочку, которая поставляется с Титана (1.0.0-Hadoop)

g.V(1).outE('test').each{ it.property('srving_rsrp').value == it.property('nbr_rsrp').value} 

Я могу сделать это легко с Сетью в Python; Вот код, который, который я хочу достичь с помощью Germlin

G = nx.MultiDiGraph() # Create a network Graph 

G.add_edge(2,3, time=10,srvingcell=20,neighbourcell=50) 
G.add_edge(2,3, time=20,srvingcell=30,neighbourcell=30) 
G.add_edge(2,3, time=30,srvingcell=28,neighbourcell=40) 
G.add_edge(2,3, time=5,srvingcell=27,neighbourcell=85) 
G.edges(data=True) 

cutoff = 25 

SG=nx.Graph([ (u,v,d) for u,v,d in G.edges(data=True) if d['srvingcell'] == d['neighbourcell']]) 

SG.edges(data=True) 

nx.write_gml(SG, "test.gml") 
+0

Вы заинтересованы в поиске какого-либо ребра с соответствующими свойствами графика ширина, или только те ребра с общей вершиной и соответствующими свойствами? –

+0

В основном я хочу отфильтровать края, которые не соответствуют правилу/соответствуют условию –

ответ

2

Простой ответ будет просто изменить ваш each к filter:

gremlin> g.V(1).outE('test').filter{ it.get().property('srving_rsrp').value == it.get().property('nbr_rsrp').value} 
==>e[4][1-test->2] 

но использует лямбда и что лучше избегайте их, если это возможно. Я не уверен, если следующий будет работать с Gremlin 3.0.x (который является то, что Titan 1.0.0 основан на), но вы могли бы избавиться от labmda с этим:

gremlin> g.V(1).outE('test').as('x','y'). 
       filter(select('x','y'). 
         by('srving_rsrp').by('nbr_rsrp'). 
         where('x',eq('y'))) 
==>e[4][1-test->2] 

Вы в основном обеспечивают два метки «x» и «y» к краям, а затем применить фильтр. В фильтре вы выбираете метки «x» и «y», а для «x» вы берете значение свойства «srving_rsrp», а для «y» вы берете значение свойства «nbr_rsrp» и фильтруете те, где они находятся eq (равны).

Это пример шаблона Traversal Induced Values, который обсуждается в Рецептах TinkerPop's.

UPDATE: Traversal индуцированных значений еще лучше в пункте 3.2.3 (еще не выпущена на момент написания):

gremlin> g.V(1).outE('test').as('x','y'). 
       where('x',eq('y')). 
        by('srving_rsrp').by('nbr_rsrp') 
==>e[4][1-test->2] 

не более противный select().

0

Работая с Scala, потратьте некоторое время, чтобы получить синтаксис вышеуказанных утверждений в Groovy вправо;

Вот как пример для других

val v0 = graph + "cell_1" 
val v2 = graph + "cell_2" 
val v3 = graph + "cell_3" 

val srving_rsrp = Key[Int]("srving_rsrp") 
val nbr_rsrp = Key[Int]("nbr_rsrp") 

//v0.addEdge("test",v2,T.id,3,"srving_rsrp",20,"nbr_rsrp",30) 
//v0.addEdge("test",v2,T.id,4,"srving_rsrp",30,"nbr_rsrp",30) 
//v0.addEdge("test",v2,T.id,5,"srving_rsrp",10,"nbr_rsrp",40) 

// create edge with typed properties 
v0 ---("test", srving_rsrp → 20, nbr_rsrp → 30) --> v2 
v0 ---("test", srving_rsrp → 30, nbr_rsrp → 30) --> v2 
v0 ---("test", srving_rsrp → 10, nbr_rsrp → 40) --> v2 

//v2.addEdge("test",v3,T.id,6,"srving_rsrp",40,"nbr_rsrp",40) 
//v2.addEdge("test",v3,T.id,7,"srving_rsrp",15,"nbr_rsrp",45) 

v2 ---("test", srving_rsrp → 40, nbr_rsrp → 40) --> v3 
v2 ---("test", srving_rsrp → 15, nbr_rsrp → 45) --> v3 

//v3.addEdge("test",v2,T.id,8,"srving_rsrp",15,"nbr_rsrp",15) 

v3 ---("test", srving_rsrp → 15, nbr_rsrp → 15) --> v2 

val g = graph.traversal() 
println(v0.outE("test").value(nbr_rsrp).head) 
val r = graph.V.outE.filter { it: Edge => 
    (it.property(nbr_rsrp).value() == it.property(srving_rsrp).value()) 
} 
println("value= " + r.count().head()) --> result is 3 
Смежные вопросы