如何找到两个顶点之间的正确边缘?

8
使用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 way:

的翻译结果是:

{{链接1:Neo4j方式:}}

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

感谢帮助!我还是新手。

看起来你可以使用核心API获取它。为什么在这种情况下要使用蓝图API的“开销”呢? - tstorms
核心API可以使用Neo4j,但例如对于Titan,我需要直接使用Blueprints。 - Luccas
1
我认为你走在了正确的道路上。如果可能的话,请使用顶点查询和顶点中心索引来提高查询时间。https://github.com/thinkaurelius/titan/wiki/Vertex-Centric-Indices - stephen mallette
我也在寻找类似于 graphContext.testIncidence(projectVertex(), archiveVertex, "uses"); 这样的东西。 - Ondra Žižka
这是Jira链接:https://issues.apache.org/jira/browse/TINKERPOP-1270。 - Ondra Žižka
4个回答

4

在回答者Huangmao Quan的答案中使用的back步骤已不再适用于Tinkerpop。正如我已经回答过这个问题,以下请求可能适用于更近期的Tinkerpop版本。

g.V().has('propertykey','value1').outE('thatlabel').as('e').inV().has('propertykey','value2').select('e')

4
gremlin> g.v(1).bothE.as('x').bothV.retain([g.v(3)]).back('x')

1

0
g.V(v1).bothE("edge_label").where(otherV().is(v2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接