Python 3.x arangosh和arango http中ArangoDB图形遍历结果的差异
我将Arangodbv3.0.7与Python3.4一起使用 我正在arango shell中运行一个图形遍历,并通过使用“POST/_api/traversal”(从python使用python arango库)调用遍历器来运行。我对这两个调用使用相同的参数/config,以及相同的用户定义的扩展器和访问者函数 虽然shell中的遍历按预期工作,但根据expander函数的指示,通过http api调用的遍历不会返回应该访问的所有顶点 在python/http方面,我正在执行: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
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代码中) 因此,您可以很容易地比较它们在调用遍历时使用的方法
比较这两者,您可能会得到一组非常少的信息,其中应该有什么不同。肯定有很多代码!对此很抱歉,但通常当我阅读其他人的问题时,他们会被要求输入更多代码,尤其是配置。此外,这是重现问题所需的代码。我相信您可以将其简化。不是答案。这是一个评论。