Python 3.x arangosh和arango http中ArangoDB图形遍历结果的差异

Python 3.x arangosh和arango http中ArangoDB图形遍历结果的差异,python-3.x,arangodb,Python 3.x,Arangodb,我将Arangodbv3.0.7与Python3.4一起使用 我正在arango shell中运行一个图形遍历,并通过使用“POST/_api/traversal”(从python使用python arango库)调用遍历器来运行。我对这两个调用使用相同的参数/config,以及相同的用户定义的扩展器和访问者函数 虽然shell中的遍历按预期工作,但根据expander函数的指示,通过http api调用的遍历不会返回应该访问的所有顶点 在python/http方面,我正在执行: query_r

我将Arangodbv3.0.7与Python3.4一起使用

我正在arango shell中运行一个图形遍历,并通过使用“POST/_api/traversal”(从python使用python arango库)调用遍历器来运行。我对这两个调用使用相同的参数/config,以及相同的用户定义的扩展器和访问者函数

虽然shell中的遍历按预期工作,但根据expander函数的指示,通过http api调用的遍历不会返回应该访问的所有顶点

在python/http方面,我正在执行:

query_result = dl_graph.traverse(
        start_vertex=start_vertex,
        strategy="dfs",
        max_depth=8,
        order="preorder",
        vertex_uniqueness="global",
        edge_uniqueness="global",
        filter_func=None,
        expander_func=expander,  // string containing function body, see def below
        visitor_func=visitor  // string containing function body, see def below
    )
在arango外壳下运行时,配置为:

{
  "datasource" : {
    "graph" : [ Graph kraken EdgeDefinitions: [
      "Owns: [Account] -> [Account, Building]",
      "Services: [BSObject] -> [BSObject, SpatialObject]",
      "Employs: [Account] -> [Account, User]",
      "WorksIn: [Project, Role, Team, TeamMember, User] -> [Building, Project, SpatialO...",
      "IsIn: [SpatialObject] -> [Building, SpatialObject]",
      "AccessControl: [Project, Role, Team, TeamMember, User] -> [BSObject, Building, C...",
      "Instantiation: [BSObject] -> [Class]",
      "Supply: [BSObject] -> [BSObject, SpatialObject]",
      "HasRole: [TeamMember, User] -> [Role]",
      "Contracts: [Account] -> [Account, Contract, Service]",
      "can_read: [Team] -> [message_exchange]",
      "can_write: [Team] -> [message_exchange]",
      "Context: [message_exchange] -> [BSObject, Building, SpatialObject]",
      "has_authority_over: [Team] -> [Team]",
      "Provides: [Contract, ContractSchedule, Role] -> [Service]",
      "To: [Service] -> [Team]",
      "Under: [Role] -> [Contract, ContractSchedule]",
      "Leases: [Account] -> [Building, SpatialObject]",
      "Partof: [ContractSchedule] -> [Contract]",
      "Manages: [testA] -> [Account]"
    ] VertexCollections: [
      "Contract",
      "ContractSchedule",
      "Group",
      "Service",
      "test1",
      "testdialog",
      "GraphViews",
      "GraphViewPositions",
      "testBuilding",
      "test5",
      "test6",
      "test7",
      "test10",
      "test11",
      "test123",
      "test134567",
      "testA"
    ] ],
    "getVertexId" : function (vertex) { ... },
    "getPeerVertex" : function (edge, vertex) { ... },
    "getInVertex" : function (edge) { ... },
    "getOutVertex" : function (edge) { ... },
    "getEdgeId" : function (edge) { ... },
    "getEdgeFrom" : function (edge) { ... },
    "getEdgeTo" : function (edge) { ... },
    "getLabel" : function (edge) { ... },
    "getAllEdges" : function (vertex) { ... },
    "getInEdges" : function (vertex) { ... },
    "getOutEdges" : function (vertex) { ... }
  },
  "order" : 0,
  "itemOrder" : 0,
  "strategy" : 1,
  "uniqueness" : {
    "vertices" : 2,
    "edges" : 2
  },
  "visitor" : function (config, result, vertex, path, connected) { ... },
  "filter" : function maxDepthFilter (config, vertex, path) { ... },
  "expander" : function (config, vertex, path) { ... },
  "maxIterations" : 10000000,
  "minDepth" : 0,
  "maxDepth" : 8,
  "buildVertices" : true,
  "messages" : [
    "in edge, gedID:525147be-ebec-11e5-9e42-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca",
    "in edge, gedID:525147be-ebec-11e5-9e42-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca",
    "in edge, gedID:525147be-ebec-11e5-9e42-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca",
    "in edge, gedID:525147be-ebec-11e5-9e42-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca",
    "in edge, gedID:525147be-ebec-11e5-9e42-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca",
    "in edge, gedID:cfa4fa2e-ef0e-11e5-8377-80193436fdca"
  ]
}
请注意,末尾的“messages”数组是由下面的expander函数添加的。这是我试图在http api下运行时将一些诊断输出返回给python客户端的尝试。这种技术也只有在外壳下运行时才有效。设置messages数组的原因是,在使用http api时,我无法找到“require(“internal”).print(…)输出的位置

扩展器的功能如下所示。关键部分是,该函数将遍历图形,直到它到达一个gedID为“30dd37a6-ec18-11e5-81b7-80193436fdca”的顶点。当visitor函数收到该顶点时,它将创建一个从该顶点的路径到该顶点的ID列表

function (config, vertex, path) {
if (!config.messages) config.messages = [];

var connections = [ ];
if (vertex.gedID == '67a59b76-efc3-11e5-9c6f-80193436fdca' 
 || vertex.gedID == '2df65d4a-ef3f-11e5-b2f8-80193436fdca' 
 || vertex.gedID == 'eb529db8-453e-11e6-b430-80193436fdca'
 || vertex.gedID == 'd38d7148-5ccd-11e6-b863-80193436fdca'
 || vertex.gedID == 'e6dc9d00-5ccd-11e6-9362-80193436fdca')  // follow out edges for these vertices only
{
  config.datasource.getOutEdges(vertex).forEach(function (e) {
  require("internal").print("vertex, name:" + vertex.name);
  require("internal").print("out edge, gedID:" + e.gedID);
  var toVertex = require("internal").db._document(e._to)

  if (toVertex.gedID != 'c1da8df6-2731-11e6-9aba-80193436fdca'         //     Block traversal through this vertex
   && (e.gedID != '525147be-ebec-11e5-9e42-80193436fdca' || e.Update ==  'afd34490-ef35-11e5-b18e-80193436fdca')      // not equal to edges of this type, and update has the specified value
   && !(vertex.gedID == '67a59b76-efc3-11e5-9c6f-80193436fdca' && toVertex.gedID == '67a59b76-efc3-11e5-9c6f-80193436fdca'))   // ignore connections between vertices of this type
    connections.push({vertex: toVertex, edge: e});
  });
}
else
{
  config.datasource.getInEdges(vertex).forEach(function (e) {
    require("internal").print("vertex, name:" + vertex.name);
    require("internal").print("in edge, gedID:" + e.gedID);
    config.messages.push("in edge, gedID:" + e.gedID);

    if (vertex.gedID != "30dd37a6-ec18-11e5-81b7-80193436fdca"   //  Terminating vertex
     && e.gedID != '1605c270-269e-11e6-9b64-80193436fdca'    // Avoid traversal in this direction
     && e.gedID != 'a50f19d8-efdc-11e5-a5bf-80193436fdca'   // Avoid traversal in this direction
     && e.gedID != '8e327408-5e45-11e6-8c9a-80193436fdca')  // Avoid traversal in this direction
      connections.push({ vertex: require("internal").db._document(e._from),  edge: e});
  });
  require("internal").print("messages:" + config.messages);
}
return connections;
}
访客功能是:

function (config, result, vertex, path, connected) {    
  if (! result || ! result.visited) {
    return;
  }

  require("internal").print("messages:" + config.messages);

  if (!result.visited.pathVertices) {result.visited.pathVertices = []}

  result.visited.messages = config.messages;

  if (result.visited.vertices) {
    result.visited.vertices.push(vertex);
  }

  if (result.visited.paths) {
    if (vertex.gedID == "30dd37a6-ec18-11e5-81b7-80193436fdca")
    {
      for (var e = 0; e < path.edges.length; e++)
      {
        result.visited.paths.push(path.edges[e]._id)
      }
      for (var v = 0; v < path.vertices.length; v++)
      {
        result.visited.pathVertices.push(path.vertices[v]._id)
      }
    }
  }
}
函数(配置、结果、顶点、路径、连接){
如果(!result | |!result.visitored){
返回;
}
要求(“内部”).print(“消息:“+config.messages”);
如果(!result.visted.pathVertices){result.visted.pathVertices=[]}
result.visted.messages=config.messages;
if(result.visted.vertices){
结果.访问.顶点.推送(顶点);
}
if(结果访问路径){
如果(vertex.gedID==“30dd37a6-ec18-11e5-81b7-80193436fdca”)
{
对于(var e=0;e
其目的是,当找到id为“30dd37a6-ec18-11e5-81b7-80193436fdca”的顶点时,PathVertexs数组将填充id

在arango shell下运行时,最终顶点('30dd37a6-ec18-11e5-81b7-80193436fdca')将传递给访问者函数,并填充PathVertexs数组。但是,当通过http api运行时,pathVertices数组返回为空

此外,在shell下运行时,“result.visted.vertices”数组包含最终顶点(30dd37a6-ec18-11e5-81b7-80193436fdca),但在使用http api运行时,该顶点丢失


可能有更好的方法可以做到这一点,我欢迎您对此提供意见,但这里的关键问题是为什么arango shell和http api之间的遍历操作方式存在差异(以及如何将缺少的顶点/路径顶点数组返回到python代码中)

因此,您可以很容易地比较它们在调用遍历时使用的方法


比较这两者,您可能会得到一组非常少的信息,其中应该有什么不同。

肯定有很多代码!对此很抱歉,但通常当我阅读其他人的问题时,他们会被要求输入更多代码,尤其是配置。此外,这是重现问题所需的代码。我相信您可以将其简化。不是答案。这是一个评论。