图遍历名称到图名称映射
Graph traversal name to graph name mapping
是否有任何 API 可用于在脚本中定义 graphTraversalName
到 graphName
的映射?
我正在使用下面的混乱代码,但如果两个图使用相同的底层存储,它很容易出错。
Map<String, String> graphTraversalToNameMap = new ConcurrentHashMap<String, String>();
while(traversalSourceIterator.hasNext()){
String traversalSource = traversalSourceIterator.next();
String currentGraphString = ( (GraphTraversalSource) graphManager.getAsBindings().get(traversalSource)).getGraph().toString();
graphNameTraversalMap.put(currentGraphString, traversalSource);
}
Iterator<String> graphNamesIterator = graphManager.getGraphNames().iterator();
while(graphNamesIterator.hasNext()){
String graphName = graphNamesIterator.next();
String currentGraphString = graphManager.getGraph(graphName).toString();
String traversalSource = graphNameTraversalMap.get(currentGraphString);
graphTraversalToNameMap.put(traversalSource, graphName);
}
gremlinExecutor.getScriptEngineManager().getBindings().entrySet()
是否提供订单保证?我可以遍历它并填充我的地图
Is there any API using which I can get graphTraversalName to graphName mapping defined in the script?
没有。它们在 Gremlin Server 中共享相同的命名空间,因此关系以编程方式丢失。你需要做一些像你正在做的事情,但我不会依赖 Graph
的 toString()
来实现平等。也许使用 Graph
实例本身?尽管根据您的情况和您想要的平等性,这可能不起作用,因为您可能有两个不同的 Graph
配置指向相同的数据并希望将它们解析为相同的图形。我也不确定任何方法是否普遍适用于所有图形系统。无论如何,我想我会尝试使用 Map<Graph, String> graphTraversalToNameMap
来处理你的情况,看看效果如何。
Does gremlinExecutor.getScriptEngineManager().getBindings().entrySet() provide order guarantee?
否,因为它有 ConcurrentHashMap
支持。您必须提供自己的订单。
底层存储的详细信息可以从配置对象中获取,可以用于映射,示例代码:
public class GraphTraversalMappingUtil {
public static void populateGraphTraversalToNameMapping(GraphManager graphManager){
if(graphTraversalToNameMap.size() != 0){
return;
}
Iterator<String> traversalSourceIterator = graphManager.getTraversalSourceNames().iterator();
Map<StorageBackendKey, String> storageKeyToTraversalMap = new HashMap<StorageBackendKey, String>();
while(traversalSourceIterator.hasNext()){
String traversalSource = traversalSourceIterator.next();
StorageBackendKey key = new StorageBackendKey(
graphManager.getTraversalSource(traversalSource).getGraph().configuration());
storageKeyToTraversalMap.put(key, traversalSource);
}
Iterator<String> graphNamesIterator = graphManager.getGraphNames().iterator();
while(graphNamesIterator.hasNext()) {
String graphName = graphNamesIterator.next();
StorageBackendKey key = new StorageBackendKey(
graphManager.getGraph(graphName).configuration());
graphTraversalToNameMap.put(storageKeyToTraversalMap.get(key), graphName);
}
}
}
完整代码请参考:https://pastebin.com/7m8hi53p
是否有任何 API 可用于在脚本中定义 graphTraversalName
到 graphName
的映射?
我正在使用下面的混乱代码,但如果两个图使用相同的底层存储,它很容易出错。
Map<String, String> graphTraversalToNameMap = new ConcurrentHashMap<String, String>();
while(traversalSourceIterator.hasNext()){
String traversalSource = traversalSourceIterator.next();
String currentGraphString = ( (GraphTraversalSource) graphManager.getAsBindings().get(traversalSource)).getGraph().toString();
graphNameTraversalMap.put(currentGraphString, traversalSource);
}
Iterator<String> graphNamesIterator = graphManager.getGraphNames().iterator();
while(graphNamesIterator.hasNext()){
String graphName = graphNamesIterator.next();
String currentGraphString = graphManager.getGraph(graphName).toString();
String traversalSource = graphNameTraversalMap.get(currentGraphString);
graphTraversalToNameMap.put(traversalSource, graphName);
}
gremlinExecutor.getScriptEngineManager().getBindings().entrySet()
是否提供订单保证?我可以遍历它并填充我的地图
Is there any API using which I can get graphTraversalName to graphName mapping defined in the script?
没有。它们在 Gremlin Server 中共享相同的命名空间,因此关系以编程方式丢失。你需要做一些像你正在做的事情,但我不会依赖 Graph
的 toString()
来实现平等。也许使用 Graph
实例本身?尽管根据您的情况和您想要的平等性,这可能不起作用,因为您可能有两个不同的 Graph
配置指向相同的数据并希望将它们解析为相同的图形。我也不确定任何方法是否普遍适用于所有图形系统。无论如何,我想我会尝试使用 Map<Graph, String> graphTraversalToNameMap
来处理你的情况,看看效果如何。
Does gremlinExecutor.getScriptEngineManager().getBindings().entrySet() provide order guarantee?
否,因为它有 ConcurrentHashMap
支持。您必须提供自己的订单。
底层存储的详细信息可以从配置对象中获取,可以用于映射,示例代码:
public class GraphTraversalMappingUtil {
public static void populateGraphTraversalToNameMapping(GraphManager graphManager){
if(graphTraversalToNameMap.size() != 0){
return;
}
Iterator<String> traversalSourceIterator = graphManager.getTraversalSourceNames().iterator();
Map<StorageBackendKey, String> storageKeyToTraversalMap = new HashMap<StorageBackendKey, String>();
while(traversalSourceIterator.hasNext()){
String traversalSource = traversalSourceIterator.next();
StorageBackendKey key = new StorageBackendKey(
graphManager.getTraversalSource(traversalSource).getGraph().configuration());
storageKeyToTraversalMap.put(key, traversalSource);
}
Iterator<String> graphNamesIterator = graphManager.getGraphNames().iterator();
while(graphNamesIterator.hasNext()) {
String graphName = graphNamesIterator.next();
StorageBackendKey key = new StorageBackendKey(
graphManager.getGraph(graphName).configuration());
graphTraversalToNameMap.put(storageKeyToTraversalMap.get(key), graphName);
}
}
}
完整代码请参考:https://pastebin.com/7m8hi53p