- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在构建一个基于 d3 力导向图并在后端使用 ArangoDB 的应用程序,我希望能够尽可能高效地从 Arango 动态加载节点和链接数据。
我不是 d3 方面的专家,但总的来说力布局似乎希望将其数据作为节点数组和链接数组,这些节点对象作为其源和目标,如下所示:
var nodes = [
{id: 0, reflexive: false},
{id: 1, reflexive: true },
{id: 2, reflexive: false}
],
links = [
{source: nodes[0], target: nodes[1], left: false, right: true },
{source: nodes[1], target: nodes[2], left: false, right: true }
];
目前我正在使用以下 AQL 查询来获取相邻节点,但它非常麻烦。部分困难在于,即使未遍历这些边,我也想包含节点的边信息(以便在从数据库加载这些链接之前显示节点所具有的链接数)。
LET docId = "ExampleDocClass/1234567"
// get data for all the edges
LET es = GRAPH_EDGES('EdgeClass',docId,{direction:'any',maxDepth:1,includeData:true})
// create an array of all the neighbor nodes
LET vArray = (
FOR v IN GRAPH_TRAVERSAL('EdgeClass',docId[0],'any',{ maxDepth:1})
FOR v1 IN v RETURN v1.vertex
)
// using node array, return inbound and outbound for each node
LET vs = (
FOR v IN vArray
// inbound and outbound are separate queries because I couldn't figure out
// how to get Arango to differentiate inbout and outbound in the query results
LET oe = (FOR oe1 IN GRAPH_EDGES('EdgeClass',v,{direction:'outbound',maxDepth:1,includeData:true}) RETURN oe1._to)
LET ie = (FOR ie1 IN GRAPH_EDGES('EdgeClass',v,{direction:'inbound',maxDepth:1,includeData:true}) RETURN ie1._from)
RETURN {'vertexData': v, 'outEdges': oe, 'inEdges': ie}
)
RETURN {'edges':es,'vertices':vs}
最终输出如下所示: http://pastebin.com/raw.php?i=B7uzaWxs...几乎可以直接读入 d3(我只需要删除一些重复数据)。
我的图形节点有大量链接,因此性能很重要(无论是服务器和客户端的负载,还是两者之间通信的文件大小)。除了简单地扩展相邻节点之外,我还计划创建各种命令来与图形进行交互。有没有办法更好地构造此 AQL 查询(例如,通过避免四个单独的图形查询)或完全避免使用 arangojs 函数或 FOXX 应用程序的 AQL,同时仍以我需要的 d3 格式构造响应(包括每个节点的链接数据) )?
最佳答案
抱歉回复晚了,我们正忙于构建 v2.8 ;)我建议在数据库端做尽可能多的事情,因为通过网络复制和序列化/反序列化 JSON 通常很昂贵,因此传输尽可能少的数据应该是一个很好的目标。
首先,我使用了您的查询并在我创建的示例数据集上执行了它(我的数据集中命中了约 800 个顶点和 800 条边)作为基准,我使用了您查询的执行时间,在我的例子中是 ~5.0s
因此,我尝试仅在 AQL 中创建与您需要的完全相同的结果。我在您的查询中发现了一些改进:1. GRAPH_NEIGHBORS
比 GRAPH_EDGES
快一点。2. 如果不需要数据,请尽可能避免使用 {includeData: true}
特别是如果你只需要从 vertices._id 到/从 GRAPH_NEIGHBORS
和 {includeData: false}
优于 GRAPH_EDGES
一个数量级。3. GRAPH_NEIGHBORS 是去重的,GRAPH_EDGES 不是。在您的情况下,这似乎是需要的。3. 你可以在那里去掉几个子查询。
所以这是我能想到的纯 AQL 查询:
LET docId = "ExampleDocClass/1234567"
LET edges = GRAPH_EDGES('EdgeClass',docId,{direction:'any',maxDepth:1,includeData:true})
LET verticesTmp = (FOR v IN GRAPH_NEIGHBORS('EdgeClass', docId, {direction: 'any', maxDepth: 1, includeData: true})
RETURN {
vertexData: v,
outEdges: GRAPH_NEIGHBORS('EdgeClass', v, {direction: 'outbound', maxDepth: 1, includeData: false}),
inEdges: GRAPH_NEIGHBORS('EdgeClass', v, {direction: 'inbound', maxDepth: 1, includeData: false})
})
LET vertices = PUSH(verticesTmp, {
vertexData: DOCUMENT(docId),
outEdges: GRAPH_NEIGHBORS('EdgeClass', docId, {direction: 'outbound', maxDepth: 1, includeData: false}),
inEdges: GRAPH_NEIGHBORS('EdgeClass', docId, {direction: 'inbound', maxDepth: 1, includeData: false})
})
RETURN { edges, vertices }
这会产生与您的查询相同的结果格式,并且具有连接到 docId 的每个顶点在顶点中仅存储一次的优点。 docId 本身也只在顶点中存储一次。客户端不需要重复数据删除。但是,在每个顶点的 outEdges/inEdges 中,所有连接的顶点也恰好一次,我不知道您是否需要知道此列表中的顶点之间是否也有多个边。
此查询在我的数据集上使用 ~0.06s。
但是,如果您付出更多努力,您还可以考虑在 Foxx 应用程序中使用手工制作的遍历。这有点复杂,但在您的情况下可能会更快,因为您执行的子查询更少。其代码可能如下所示:
var traversal = require("org/arangodb/graph/traversal");
var result = {
edges: [],
vertices: {}
}
var myVisitor = function (config, result, vertex, path, connected) {
switch (path.edges.length) {
case 0:
if (! result.vertices.hasOwnProperty(vertex._id)) {
// If we visit a vertex, we store it's data and prepare out/in
result.vertices[vertex._id] = {
vertexData: vertex,
outEdges: [],
inEdges: []
};
}
// No further action
break;
case 1:
if (! result.vertices.hasOwnProperty(vertex._id)) {
// If we visit a vertex, we store it's data and prepare out/in
result.vertices[vertex._id] = {
vertexData: vertex,
outEdges: [],
inEdges: []
};
}
// First Depth, we need EdgeData
var e = path.edges[0];
result.edges.push(e);
// We fill from / to for both vertices
result.vertices[e._from].outEdges.push(e._to);
result.vertices[e._to].inEdges.push(e._from);
break;
case 2:
// Second Depth, we do not need EdgeData
var e = path.edges[1];
// We fill from / to for all vertices that exist
if (result.vertices.hasOwnProperty(e._from)) {
result.vertices[e._from].outEdges.push(e._to);
}
if (result.vertices.hasOwnProperty(e._to)) {
result.vertices[e._to].inEdges.push(e._from);
}
break;
}
};
var config = {
datasource: traversal.generalGraphDatasourceFactory("EdgeClass"),
strategy: "depthfirst",
order: "preorder",
visitor: myVisitor,
expander: traversal.anyExpander,
minDepth: 0,
maxDepth: 2
};
var traverser = new traversal.Traverser(config);
traverser.traverse(result, {_id: "ExampleDocClass/1234567"});
return {
edges: result.edges,
vertices: Object.keys(result.vertices).map(function (key) {
return result.vertices[key];
})
};
这种遍历的想法是访问从起始顶点到最多两条边的所有顶点。0 - 1 深度的所有顶点都将与数据一起添加到顶点对象中。来自起始顶点的所有边都将与数据一起添加到边列表中。深度为 2 的所有顶点只会在结果中设置 outEdges/inEdges。
这样做的好处是,vertices
是去重的。和 outEdges/inEdges 多次包含所有连接的顶点,如果它们之间有多个边。
此遍历在 ~0.025s 内在我的数据集上执行,因此它的速度是仅 AQL 解决方案的两倍。
希望这仍然有帮助;)
关于javascript - 使用 AQL(或 arangojs)从 ArangoDB 获取 d3 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33855799/
我无法停止 arangodb docker 容器中的 arangodb 服务器。 当我执行低于一个时, $/etc/init.d/arangod 停止 $service arangodb 状态 ara
我在 java 中查询 ArangoDB 以获取数组值时遇到问题。我尝试过使用 String[] 和 ArrayList,都没有成功。 我的查询: FOR document IN documents
我想计算 ArangoDB 的服务器要求。 我知道 ArangoDB 将索引存储在 RAM 中,但是索引使用了多少空间? 最佳答案 这取决于您使用的索引类型。 您可以使用“数字”来查看需要多少内存:
我是 Arango DB 的新用户,目前正在为我的项目评估它。有人可以告诉我,您可以在 Arango DB 中创建的最大数据库数量是多少吗? 谢谢。 最佳答案 据我所知,ArangoDB 中的数据库数
我尝试从我的电脑连接到位于另一台服务器上的 ArangoDB,但似乎不成功。然后,我尝试使用输入服务器 ip http://x.x.x.x:8529 提供的 Web UI 来访问它。但也失败了。我在本
我有一个这样的文件: { "baths": 2, "beds": 3, "id": "3225C", "addrs": [ { "line2": "",
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
检索相关edge_collection中没有边的所有顶点的最佳方法是什么 我尝试使用以下代码,但自 arangodb 2.8 以来,它变得非常慢(在以前的版本中并不是很快,但比现在快了大约 10 倍)
我有许多节点通过其他类型的中间节点连接。如图所示,中间节点可以有多个。我需要找到给定数量的节点的所有中间节点,并按初始节点之间的链接数量对其进行排序。在我的示例中,给定 A、B、C、D,它应该返回节点
我有一个存储在 arangodb 中的对象,该对象具有其他内部对象,我当前的用例要求我仅更新其中一个元素。 存储对象 { "status": "Active", "physicalCode":
我正在尝试与 Arango 组合一个单元测试设置。为此,我需要能够在每次测试时重置测试数据库。 我知道我们可以直接从 REST API 删除数据库,但文档中提到创建和删除可能“需要一段时间”。 这是否
我有某种类型的事件列表,其结构如下: { createdAt: 123123132, type: STARTED, metadata: { emailAddress: "foo@bar
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 3 年前。
我发现使用 Web UI 在 arangodb 上创建新用户时遇到了麻烦。首先,我可以创建一个新用户,但无法为该用户分配一个数据库。另外,你能帮忙提供一个使用 arangodb Shell 的方法吗?
我在本地运行 ArangoDB,其中包含来自多个不同项目的数据库、集合、数据和图表。我想备份所有内容,以便重建我的系统。我知道如何备份单个数据库,但因为我有很多数据库,所以我希望一次性完成。 本质上,
应该很容易操作,但我找不到如何实现这一点。我有两个来自不同集合的文档,现在我想使用现有集合中的新 Edge 链接它们。我正在尝试像这样使用 edge-collection.save 函数:edge-c
在我解决 1000 个客户端的任务中,每个客户端都有单独的 ArangoDB,在运行时记录单独的信息......我们需要将这些信息聚合回单个主节点服务器中的集合,以便可以进行查询和报告在上面。研究 J
具有以下结构的文档: { path: String, enabled: Long, disabled: null || Long, // other fields... } 我想通过路
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 3 年前。
我想从 ArangoDB 的文档中删除一个属性。 我认为正确的方法是使用函数 UNSET(doc, attributeName1, ..., attributeNameN) .然而,仅凭这一点,数据库
我是一名优秀的程序员,十分优秀!