如果我在应用程序中使用graph示例添加顶点和边,然后查询这些顶点和边,有时查询结果会向我发送顶点和边,有时不会,但是如果我创建一个指向服务器的junit测试,我就能够看到顶点和边。如果我掉一个顶点或边,也会发生同样的情况
What I'm missing?
============= Class to work with Vertex and Edge =================
public class JanusGraphRepository implements GraphRepository {
private Graph graph;
private GraphTraversalSource g;
public JanusGraphRepository(Graph janusGraph) {
this.graph = janusGraph;
this.g = graph.traversal();
}
@Override
public void dropE(Object id) {
g.E(id).drop().iterate();
g.tx().commit();
}
@Override
public void dropV(Object id) {
g.V(id).drop().iterate();
g.tx().commit();
}
@Override
public Vertex addV(final Object... keyValues) {
Vertex v = graph.addVertex(keyValues);
graph.tx().commit();
return v;
}
@Override
public Edge addE(String edgeLabel, Object fromVertex, Object toVertex,
Object... keyValues) {
Edge e = graph.vertices(fromVertex).next().addEdge(edgeLabel,
graph.vertices(toVertex).next(), keyValues);
graph.tx().commit();
return e;
}
}
======================== Code to get vertices and edges ======================
JanusGraphFactory.Builder config = JanusGraphFactory.build();
config.set("storage.backend", "cql");
config.set("storage.hostname", "10.2.1.134");
config.set("storage.cql.keyspace", "janusgraph");
config.set("index.search.backend", "elasticsearch");
config.set("index.search.hostname", "10.2.1.134");
// config.set("index.search.elasticsearch.client-only", "true");
// ip address where cassandra is installed
// config.set("storage.username", "cassandra");
// config.set("storage.password", "cassandra");
// config.set("storage.port", "8182");
// Get the instance of graph
JanusGraph graph = config.open();
graph.vertices().forEachRemaining(x -> {
System.out.println(x.id());
});
System.out.println("------ Edges -------");
graph.edges().forEachRemaining(x -> {
System.out.println(x.toString());
});
Thanks
1条答案
按热度按时间brgchamk1#
Cassandra的突变并不能保证立即可见。
我看到您使用的是janus的cql存储后端,它告诉我您使用的是cassandra节点/集群。在cassandra中,写入需要传播到每个节点,而且可能不会立即发生。听起来你可能正经历着这种情况。
特别是在某个特定的写操作需要传递给拥有其索引范围的节点的情况下,并且随后的读取操作最终从该节点读取数据,那么就有可能进入这样一种情况,即先写入,然后立即读取,而不显示刚写入的数据。
写操作出现所需的时间取决于cassandra集群中的各种因素;一般来说,即使在非常高的规模下也不应该超过几分钟,但这并不能保证。Cassandra将可用性优先于突变的一致性。只要集群保持在线和可操作性,突变最终会使它访问集群中的所有副本,但不一定是在写调用返回时。这种行为称为最终一致性。
为了避免这种情况,你必须调整你的期望;您不能期望刚刚写入集群的数据(因此当使用cassandra作为后端时,janusgraph)立即可用。
如果您的用例不能使用cassandra的一致性模型,我建议您查看hbase或janusgraph手册的storage backends部分中列出的其他后端之一。