http://www.k6k4.com/blog/show/aaapamn4v1547604938237
还是上次的例子 FirstTest
:
public class FirstTest {
public static void main(String[] args) {
/*
* The example below will open a JanusGraph graph instance and load The Graph of the Gods dataset diagrammed above.
* JanusGraphFactory provides a set of static open methods,
* each of which takes a configuration as its argument and returns a graph instance.
* This tutorial calls one of these open methods on a configuration
* that uses the BerkeleyDB storage backend and the Elasticsearch index backend,
* then loads The Graph of the Gods using the helper class GraphOfTheGodsFactory.
* This section skips over the configuration details, but additional information about storage backends,
* index backends, and their configuration are available in
* Part III, “Storage Backends”, Part IV, “Index Backends”, and Chapter 13, Configuration Reference.
*/
// Loading the Graph of the Gods Into JanusGraph
JanusGraph graph = JanusGraphFactory
.open("janusgraph-dist/src/assembly/cfilter/conf/janusgraph-berkeleyje-es.properties");
GraphOfTheGodsFactory.load(graph);
GraphTraversalSource g = graph.traversal();
/*
* The typical pattern for accessing data in a graph database is to first locate the entry point into the graph
* using a graph index. That entry point is an element (or set of elements)
* — i.e. a vertex or edge. From the entry elements,
* a Gremlin path description describes how to traverse to other elements in the graph via the explicit graph structure.
* Given that there is a unique index on name property, the Saturn vertex can be retrieved.
* The property map (i.e. the key/value pairs of Saturn) can then be examined.
* As demonstrated, the Saturn vertex has a name of "saturn, " an age of 10000, and a type of "titan."
* The grandchild of Saturn can be retrieved with a traversal that expresses:
* "Who is Saturn’s grandchild?" (the inverse of "father" is "child"). The result is Hercules.
*/
// Global Graph Indices
Vertex saturn = g.V().has("name", "saturn").next();
GraphTraversal<Vertex, Map<String, Object>> vertexMapGraphTraversal = g.V(saturn).valueMap();
GraphTraversal<Vertex, Object> values = g.V(saturn).in("father").in("father").values("name");
/*
* The property place is also in a graph index. The property place is an edge property.
* Therefore, JanusGraph can index edges in a graph index.
* It is possible to query The Graph of the Gods for all events that have happened within 50 kilometers of Athens
* (latitude:37.97 and long:23.72).
* Then, given that information, which vertices were involved in those events.
*/
System.out.println(g.E().has("place", geoWithin(Geoshape.circle(37.97, 23.72, 50))));
System.out.println(g.E().has("place", geoWithin(Geoshape.circle(37.97, 23.72, 50)))
.as("source").inV()
.as("god2")
.select("source").outV()
.as("god1").select("god1", "god2")
.by("name"));
}
}
删除 db 文件夹,打上断点,开始debug,首先进入:JanusGraphFactory.open
JanusGraphFactory is used to open or instantiate a JanusGraph graph database.
Opens a {@link JanusGraph} database configured according to the provided configuration.
public static JanusGraph open(ReadConfiguration configuration, String backupName) {
final ModifiableConfiguration config = new ModifiableConfiguration(ROOT_NS, (WriteConfiguration) configuration, BasicConfiguration.Restriction.NONE);
final String graphName = config.has(GRAPH_NAME) ? config.get(GRAPH_NAME) : backupName;
final JanusGraphManager jgm = JanusGraphManagerUtility.getInstance();
if (null != graphName) {
Preconditions.checkState(jgm != null, JANUS_GRAPH_MANAGER_EXPECTED_STATE_MSG);
return (JanusGraph) jgm.openGraph(graphName, gName -> new StandardJanusGraph(new GraphDatabaseConfiguration(configuration)));
} else {
if (jgm != null) {
log.warn("...");
}
return new StandardJanusGraph(new GraphDatabaseConfiguration(configuration));
}
}
前面的部分先跳过,然后进入:
1. return new StandardJanusGraph(new GraphDatabaseConfiguration(configuration));
// 构造方法,分为静态代码和构造方法,这部分目前是跳过,但是后续是重点和核心。
1. 父类:JanusGraphBlueprintsGraph
static {
TraversalStrategies graphStrategies = TraversalStrategies.GlobalCache.getStrategies(Graph.class).clone()
.addStrategies(AdjacentVertexFilterOptimizerStrategy.instance(), JanusGraphLocalQueryOptimizerStrategy.instance(), JanusGraphStepStrategy.instance());
//Register with cache
TraversalStrategies.GlobalCache.registerStrategies(StandardJanusGraph.class, graphStrategies);
TraversalStrategies.GlobalCache.registerStrategies(StandardJanusGraphTx.class, graphStrategies);
}
2. 新建配置,A graph database configuration is uniquely associated with a graph database and must not be used for multiple databases
new GraphDatabaseConfiguration(configuration)
1. storeManager
final KeyColumnValueStoreManager storeManager = Backend.getStorageManager(localBasicConfiguration);
final StoreFeatures storeFeatures = storeManager.getFeatures();
2. 检查参数,配置等
3. 然后是构造方法
1. 成员变量
private final SchemaCache.StoreRetrieval typeCacheRetrieval = new SchemaCache.StoreRetrieval() {}
2. backend
this.backend = configuration.getBackend();
1. Backend backend = new Backend(configuration);
1. KeyColumnValueStoreManager manager = getStorageManager(configuration);
2. indexes = getIndexes(configuration);
3. //这里的 KCVS 是 keycolumnvaluestorageManager
managementLogManager = getKCVSLogManager(MANAGEMENT_LOG);
txLogManager = getKCVSLogManager(TRANSACTION_LOG);
userLogManager = getLogManager(USER_LOG);
4. scanner = new StandardScanner(storeManager);
2. backend.initialize(configuration);
1. store 新建
KeyColumnValueStore idStore = storeManager.openDatabase(config.get(IDS_STORE_NAME));
KeyColumnValueStore edgeStoreRaw = storeManagerLocking.openDatabase(EDGESTORE_NAME);
KeyColumnValueStore indexStoreRaw = storeManagerLocking.openDatabase(INDEXSTORE_NAME);
2. cacheEnabled
edgeStore = new NoKCVSCache(edgeStoreRaw);
indexStore = new NoKCVSCache(indexStoreRaw);
3. storeFeatures = backend.getStoreFeatures();
3. 初始化
this.idAssigner = config.getIDAssigner(backend);
this.idManager = idAssigner.getIDManager();
this.serializer = config.getSerializer();
StoreFeatures storeFeatures = backend.getStoreFeatures();
this.indexSerializer = new IndexSerializer(configuration.getConfiguration(), this.serializer,
this.backend.getIndexInformation(), storeFeatures.isDistributed() && storeFeatures.isKeyOrdered());
this.edgeSerializer = new EdgeSerializer(this.serializer);
this.vertexExistenceQuery = edgeSerializer.getQuery(BaseKey.VertexExists, Direction.OUT, new EdgeSerializer.TypedInterval[0]).setLimit(1);
this.queryCache = new RelationQueryCache(this.edgeSerializer);
this.schemaCache = configuration.getTypeCache(typeCacheRetrieval);
this.times = configuration.getTimestampProvider();
然后是open完成后:GraphOfTheGodsFactory.load(graph);
http://www.k6k4.com/blog/show/aaapamn4v1547604938237