【问题标题】:Is it possible to show search result in graph viewer是否可以在图形查看器中显示搜索结果
【发布时间】:2016-04-16 00:12:05
【问题描述】:

我有文档集合 dc1dc2 以及边缘集合 ec1ec2。我使用 dc1ec1 来创建图 g1 并使用 dc2ec2 来创建图g2

我执行了一些搜索请求并获得了结果集,其中包含来自集合 dc1 的文档 d1 和来自集合 dc2d2强>。

我想将图形查看器中的搜索结果集表示为 2 个图形,以便能够以图形方式探索 d1 与集合 dc1 中的其他文档之间的可能关系,等等d2 和来自 dc2 的文档。

我可以在当前版本的 ArangoDB 中执行此操作吗?您是否知道任何现有的附加应用程序(服务、foxx 应用程序)?

现在,作为肮脏的把戏,我创建了第三个文档集合 DC,其中包含来自集合 dc1dc2 的文档以及对应的边缘集合 EC 包含两个集合 ec1ec2 的边,将新节点 search result 添加到 DCEC 的关系表示找到的 dc1dc2 以及如何基于 DCEC 以顶点搜索结果开头。它让我从对应的初始集合中探索找到的结果和文档之间的任何关系。

如果还不存在的话,我会考虑为它创建自己的 foxx 应用程序(可能使用临时集合或其他东西)。

【问题讨论】:

  • 当前版本的图表查看器一次只能显示一个图表集。
  • @dothebart,你有计划很快实现多图查看器吗?如果是这样,什么时候?否则我们将尝试自己实现它。另外,我的主要问题是关于显示为图表的搜索结果。目前,我尝试使用多集合图创建存根。
  • 不,我们目前不打算添加第二张图表。通常浏览器往往已经很忙于第一个;-) 但是 - 源就在那里,所以你可以帮助自己。我是否正确地理解了您的用例类似于 the city routing example graph 所使用的 in the Graph Functions documentation
  • 对不起,我把 2 个问题混为一谈。我的主要问题是“如果结果集包含来自多个集合的文档并且这些文档在其对应的边缘集合中有一些关系,如何在图形查看器中显示搜索结果”。目前我使用多集合图来表示它和我自己的javascript函数,但它只是hack。我没有在文档中找到这样的功能,我很感兴趣你是否有开发计划来实现这样的功能,如果有,什么时候?在其他情况下,我们将尝试自己实现它。
  • 你可能会intersect two AQL queries using an inner join - 喜欢FILTER f.friendOf == u.userId && f.type == "friend"

标签: arangodb


【解决方案1】:

目前无法在图形查看器中直接显示图形遍历的结果。

但是,您可以将遍历的结果复制到一个临时图表中,然后您可以显示该图表。我们将使用City graph

例如,我们从柏林开始,只想查看不是首都的城市。使用此过滤器的原始 AQL 遍历将是:

FOR v, e IN 1..1 OUTBOUND 'germanCity/Berlin' GRAPH 'routeplanner'
  FILTER v.isCapital == false
  RETURN {City: v, Highway: e}

我们现在创建临时图表:

db._createEdgeCollection('temporaryEdgeCollection', {volatile: true})
db._create('temporaryVertexCollection', {volatile: true})
db._graphs.save({
   "_key": "tempgraph",
  "orphanCollections" : [ ], 
  "edgeDefinitions" : [ 
  {
    "collection": "temporaryEdgeCollection",
    "from": ["temporaryVertexCollection"],
    "to": ["temporaryVertexCollection"]
    }
    ]
})

现在我们编辑上面的查询,将图表实际复制到我们在上面创建的临时集合中。挑战在于我们实际上也需要那里的 startnode,因为我们想要显示它。

我们可能不会对同一个集合执行多个INSERT 语句,因此我们需要将顶点重新组合到一个还包含起始顶点的列表中:

db._query(`
LET startVertex = DOCUMENT('germanCity/Berlin')
LET traversalResult = (
  FOR v, e IN 1..1 OUTBOUND startVertex GRAPH 'routeplanner'
    FILTER v.isCapital == false
    LET newEdge = MERGE(e, {
      _from: CONCAT(@tv, '/', SPLIT(e._from, '/')[1]),
      _to: CONCAT(@tv, '/', SPLIT(e._to, '/')[1])
     })
    LET newV = UNSET(v, '_id')
    RETURN {v: newV, e: newEdge}
  )
LET x=(
  FOR vertex in PUSH(traversalResult[*].v, UNSET(startVertex, '_id'))
    INSERT vertex INTO temporaryVertexCollection)
LET y=(
  FOR edge in traversalResult[*].e
    INSERT edge INTO temporaryEdgeCollection)
RETURN 1
`,
{tv : 'temporaryVertexCollection'})

现在您可以实际点击网页界面中的临时图,查看实际结果。

请注意,我们使用了 volatile 集合,因此我们不会为此浪费磁盘空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-20
    • 2021-09-24
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多