问题描述
我有一个案例,也许这里的任何人都可以帮助我找出DSE Graph中的gremlin查询,以找到具有多个属性的边/顶点上的路径。
这是我在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')
由于您没有给出详细的答案信息,因此我推断您正在寻找从AA
到DD
的所有路径,其中vlan
是3353
。可以通过几种不同的方法来完成此操作。如果创建如上所述的平行边,则可以使用以下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()