图遍历名称到图名称的映射

时间:2020-07-22 18:49:48

标签: tinkerpop tinkerpop3 gremlin-server

有没有可以用来获取脚本中定义的graphTraversalNamegraphName映射的API?

我正在使用下面的凌乱代码,但是如果两个图形都使用相同的基础存储,则容易出错。

    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()是否提供订单保证?我可以对此进行迭代并填充地图

2 个答案:

答案 0 :(得分:1)

是否有任何API可以使脚本中定义的graphTraversalName映射到graphName?

不。它们在Gremlin Server中共享相同的名称空间,因此关系会以编程方式丢失。您将需要做与您正在做的事情类似的事情,但是我不会依靠toString()中的Graph来实现平等。也许使用Graph实例本身?尽管这可能都不起作用,这取决于您的情况和想要的相等性,因为您可能有两个不同的Graph配置指向同一数据,并希望将它们解析为同一图形。我也不确定任何方法通常都适用于所有图形系统。无论如何,我想我会针对您的情况尝试使用Map<Graph, String> graphTraversalToNameMap,然后看看效果如何。

gremlinExecutor.getScriptEngineManager()。getBindings()。entrySet()是否提供订单保证?

否,因为它由ConcurrentHashMap支持。您必须提供自己的订单。

答案 1 :(得分:0)

底层存储详细信息可以从配置对象中获取,并可用于映射示例代码:

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