有没有可以用来获取脚本中定义的graphTraversalName
到graphName
映射的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()
是否提供订单保证?我可以对此进行迭代并填充地图
答案 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