Gremlin DSE图在具有多个属性的边/顶点上查找路径

问题描述

我有一个案例,也许这里的任何人都可以帮助我找出DSE Graph中的gremlin查询,以找到具有多个属性的边/顶点上的路径。

case

这是我在DSE图形中的代码

schema.propertyKey("id").Uuid().ifNotExists().create()`
schema.propertyKey("name").Text().single().create()  
schema.propertyKey("vlan").Text().multiple().create()  
schema.vertexLabel("site").partitionKey('id').properties("id","name","vlan").ifNotExists().create()
schema.edgeLabel("linkTo").multiple().properties("id","vlan").create()
schema.edgeLabel("linkTo").connection("site","site").add()

schema.vertexLabel("site").index("search").search().by("name").by("vlan").asText().add()
schema.vertexLabel("site").index("siteBySiteId").materialized().by("name").add()
schema.vertexLabel("site").index("toLink").outE("linkTo").by("vlan").add()
schema.vertexLabel("site").index("fromLink").inE("linkTo").by("vlan").add()

AA = graph.addVertex(T.label,'site','id',UUID.randomUUID(),'name','AA','vlan','3353','3563','2467')
BB = graph.addVertex(T.label,'BB','3563')
CC = graph.addVertex(T.label,'CC','2467')
DD = graph.addVertex(T.label,'2467')

AA.addEdge('linkTo',BB,'AA-BB','3563')
AA.addEdge('linkTo',CC,'AA-CC','2467')
BB.addEdge('linkTo',DD,'BB-DD','3563')
CC.addEdge('linkTo','CC-DD','2467')`enter code here

--------------------
g.V().
  has("site","AA").  
  emit().
  repeat(timeLimit(200).both("linkTo").        
   filter(bothE("linkTo").                   
     has("vlan",Search.tokenPrefix("3353"))). 
   simplePath()).                             
  has("name","DD").                     
  path().unfold()

但没有成功:)

解决方法

所以这里发生了几件事:

首先在您的创建脚本中,此行将name属性设置为CC,而不是DD

DD = graph.addVertex(T.label,'site','id',UUID.randomUUID(),'name','CC','vlan','3353','3563','2467')

第二,在Gremlin中,您不能向边缘添加多属性(described here),它们仅在顶点上有效。因此,您将需要更改加载脚本以添加平行边,每个vlan属性都应添加一条平行边,如下所示:

AA.addEdge('linkTo',BB,'AA-BB','3353')
AA.addEdge('linkTo','3563')
AA.addEdge('linkTo',CC,'AA-CC','2467')
BB.addEdge('linkTo',DD,'BB-DD','3353')
BB.addEdge('linkTo','3563')
CC.addEdge('linkTo','CC-DD','2467')

由于您没有给出详细的答案信息,因此我推断您正在寻找从AADD的所有路径,其中vlan3353。可以通过几种不同的方法来完成此操作。如果创建如上所述的平行边,则可以使用以下Gremlin遍历来实现:

g.V().
  has("site","name","AA").
  repeat(
    timeLimit(200).
    bothE("linkTo").
    has("vlan","3353").
    otherV().
    simplePath()
  ).until(has("name","DD")).
  path().by('name')

如果您决定只将vlan属性存储在顶点上,则可以通过Gremlin这样获得该属性:

g.V().
  has("site","AA").
  repeat(
    timeLimit(200).
    both("linkTo").
    has("vlan","3353").
    simplePath()
  ).until(has("name","DD")).
  path().by('name').dedup()

这样做的缺点是path将不包含边。如果您还希望在path中包含边缘信息,可以将both()步骤更改为bothE()/otherV()模式,如下所示:

g.V().
  has("site","AA").
  repeat(
    timeLimit(200).
    bothE("linkTo").
    otherV().
    has("vlan","DD")).
  path().by('name').dedup()