图遍历名称到图名称映射

Graph traversal name to graph name mapping

是否有任何 API 可用于在脚本中定义 graphTraversalNamegraphName 的映射?

我正在使用下面的混乱代码,但如果两个图使用相同的底层存储,它很容易出错。

    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 中共享相同的命名空间,因此关系以编程方式丢失。你需要做一些像你正在做的事情,但我不会依赖 GraphtoString() 来实现平等。也许使用 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