7

使用 tinkerpop blueprints API,找出两个顶点之间是否存在边的最佳方法是什么?我想避免vertex.getEdges()和迭代,直到找到合适的。

例如:检查是否v1是朋友v2

Vertex v1 = g.addVertex(null);
Vertex v2 = g.addVertex(null);
Edge edge = g.addEdge(null, v1, v2, "friends");
Edge edge = g.addEdge(null, v1, v2, "follows");

// Node with lots of edges - Supernode - problem?
List<Edge> edges = new ArrayList<Edge>();
for(Edge edge : g.getVertex(v1.getId()).getEdges(Direction.OUT, "friends")){
   if(edge.getVertex(Direction.IN).getId().equals(v2.getId()){
      edges.add(edge);
  }
}

我应该使用顶点查询吗?


通过 gremlin 我可以这样做:

g.v(v1.getID()).outE("friends").inV.filter{it.id == v2.getID}

Neo4j方式:

IndexHits<Relationship> relationships = relationshipIndex().get("type", edgeType, node1, node2);

谢谢您的帮助!我对此还是陌生的。

4

4 回答 4

4
gremlin> g.v(1).bothE.as('x').bothV.retain([g.v(3)]).back('x')
于 2014-12-06T04:21:41.857 回答
4

Tinkerpop 中不再提供 Huangmao Quanback答案中使用的步骤。正如我已经回答过这个问题,以下请求可能适用于 tinkerpop 堆栈的更新版本。

g.V().has('propertykey','value1').outE('thatlabel').as('e').inV().has('propertykey','value2').select('e')
于 2016-05-27T08:49:44.693 回答
1

尝试这个:

if (g.v(1).out('follows').retain([g.v(2)]).hasNext())
{
    println('v(1) follows v(2)')
}

注意:这里的边缘是单向的,即您无法推断 v2 是否遵循 v1。

来源https ://groups.google.com/forum/#!msg/gremlin-users/Og7Xf8tYbx4/gqBArTw98sAJ

于 2015-02-02T21:54:05.580 回答
0
g.V(v1).bothE("edge_label").where(otherV().is(v2)
于 2019-12-11T07:28:56.080 回答