从随机种子节点遍历图数据库

Traverse graph database from random seed nodes

我的任务是为可视化 Neptune Graph 数据库的前端应用程序编写查询。假设第一个顶点是项目,而第二个顶点是用户。用户可以创建项目。存在项目到项目的关系以显示从另一个项目派生的项目,就像从原始媒体剪辑中剪切出的媒体剪辑的情况一样。创建的第一组项目应该在顶点中创建,例如 SERVER,它们在 UI.

中分组。

要求如下:

    Find (Y) seed nodes that are not connected by any ITEM-ITEM relationships on the graph (relationships via USERs etc... are fine)
    Populate the graph with all relationships from these (Y) seed nodes with no limits on the relationships that are followed (relationships through USERs for example is fine).
    Stop populating the graph once the number of nodes (not records limit) hits the limit specified by (X)

这是图表的直观表示。

https://drive.google.com/file/d/1YNzh4wbzcdC0JeloMgD2C0oS6MYvfI4q/view?usp=sharing

重现此图的示例代码如下。该图甚至可以变得更深。这只是一个简单的例子。请看图:

g.addV('SERVER').property(id, 'server1')
g.addV('SERVER').property(id, 'server2')
g.addV('ITEM').property(id, 'item1')
g.addV('ITEM').property(id, 'item2')
g.addV('ITEM').property(id, 'item3')
g.addV('ITEM').property(id, 'item4')
g.addV('ITEM').property(id, 'item5')
g.addV('USER').property(id, 'user1')


g.V('item1').addE('STORED IN').to(g.V('server1'))
g.V('item2').addE('STORED IN').to(g.V('server2'))
g.V('item2').addE('RELATED TO').to(g.V('item1'))
g.V('item3').addE('DERIVED FROM').to(g.V('item2') )
g.V('item3').addE('CREATED BY').to(g.V('user1'))
g.V('user1').addE('CREATED').to(g.V('item4'))
g.V('item4').addE('RELATED TO').to(g.V('item5'))

如果可能的话,结果应该是下面的形式:

[
 [
   {
     "V1": {},
     "E": {},
     "V2": {}
   }
 ]
]

我们有一个 API,其端点允许开放式 gremlin 查询。我们在客户端应用程序中调用此端点以获取可视化呈现的数据。我写了一个我认为不太正确的查询。另外,我想知道如何过滤遍历的节点数,停在X个节点。

g.V().hasLabel('USER','SERVER').sample(5).aggregate('v1').repeat(__.as('V1').bothE().dedup().as('E').otherV().hasLabel('USER','SERVER').as('V2').aggregate('x').by(select('V1', 'E', 'V2'))).until(out().count().is(0)).as('V1').bothE().dedup().as('E').otherV().hasLabel(without('ITEM')).as('V2').aggregate('x').by(select('V1', 'E', 'V2')).cap('v1','x','v1').coalesce(select('x').unfold(),select('v1').unfold().project('V1'))

如果可能的话,如果我能得到一个将获取此数据集的查询,我将不胜感激。如果结果中的顶点没有连接到任何东西,我想检索它们并像在 UI.

上那样渲染它们

我又看了一遍,想出了这个查询

g.V().hasLabel(without('ITEM')).sample(2).aggregate('v1').
  repeat(__.as('V1').bothE().dedup().as('E').otherV().as('V2').
      aggregate('x').by(select('V1', 'E', 'V2'))).
    until(out().count().is(0)).
  as('V1').bothE().dedup().as('E').otherV().as('V2').
  aggregate('x').
    by(select('V1', 'E', 'V2')).
  cap('v1','x','v1').
  coalesce(select('x').unfold(),select('v1').unfold().project('V1')).limit(5)

为了满足节点数而不是记录数(或限制)的条件,我可以通过限制用户输入的一半数量作为节点数的输入,然后排除边E和顶点V2将在 UI.

上呈现的最后一条记录

我会以更好的方式处理任何建议。