这是一个示例图
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”具有相同值的边缘。我无法找到适合它的好例子
这是我到达的地方;而不是每个我想使用过滤器来创建只有符合条件的边的图形。我使用的是带有Titan(1.0.0-hadoop)的Germlin shell
g.V(1).outE('test').each{ it.property('srving_rsrp').value == it.property('nbr_rsrp').value}
我可以使用Python中的NetworK轻松完成此操作;这是我想要使用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 :(得分: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]
但是使用lambda,如果可能的话最好避免使用lambda。我不确定以下是否适用于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”属性值并过滤它们所在的位置{{ 1}}(等于)。
这是TinkerPop食谱中讨论的Traversal Induced Values模式的一个例子。
更新:遍历诱导值在3.2.3中更加出色(截至本文撰写时尚未发布):
eq
不再讨厌gremlin> g.V(1).outE('test').as('x','y').
where('x',eq('y')).
by('srving_rsrp').by('nbr_rsrp')
==>e[4][1-test->2]
。
答案 1 :(得分: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