Gremlin DSE图在具有多个属性的边/顶点上查找路径
我有一个例子,也许这里的任何人都可以帮我找出DSE图中的gremlin查询,找到边/顶点上具有多个属性的路径 这是我在DSE图中的代码Gremlin DSE图在具有多个属性的边/顶点上查找路径,gremlin,tinkerpop,dse,Gremlin,Tinkerpop,Dse,我有一个例子,也许这里的任何人都可以帮我找出DSE图中的gremlin查询,找到边/顶点上具有多个属性的路径 这是我在DSE图中的代码 schema.propertyKey("id").Uuid().ifNotExists().create()` schema.propertyKey("name").Text().single().create() schema.propertyKey("vlan").Text().multipl
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", "name", "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', 'vlan', '3563', 'vlan', '2467')
BB = graph.addVertex(T.label, 'site', 'id', UUID.randomUUID(), 'name', 'BB', 'vlan', '3353', 'vlan', '3563')
CC = graph.addVertex(T.label, 'site', 'id', UUID.randomUUID(), 'name', 'CC', 'vlan', '2467')
DD = graph.addVertex(T.label, 'site', 'id', UUID.randomUUID(), 'name', 'CC', 'vlan', '3353', 'vlan', '3563', 'vlan', '2467')
AA.addEdge('linkTo', BB, 'id', UUID.randomUUID(), 'name', 'AA-BB', 'vlan', '3353', 'vlan', '3563')
AA.addEdge('linkTo', CC, 'id', UUID.randomUUID(), 'name', 'AA-CC', 'vlan', '2467')
BB.addEdge('linkTo', DD, 'id', UUID.randomUUID(), 'name', 'BB-DD', 'vlan', '3353', 'vlan', '3563')
CC.addEdge('linkTo', DD, 'id', UUID.randomUUID(), 'name', 'CC-DD', 'vlan', '2467')`enter code here
--------------------
g.V().
has("site", "name", "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', 'vlan', '3563', 'vlan', '2467')
其次,在Gremlin中,不能将多属性()添加到边,它们仅在顶点上有效。因此,您需要更改加载脚本以添加并行边缘,每个vlan
属性对应一个并行边缘,如下所示:
AA.addEdge('linkTo', BB, 'id', UUID.randomUUID(), 'name', 'AA-BB', 'vlan', '3353')
AA.addEdge('linkTo', BB, 'id', UUID.randomUUID(), 'name', 'AA-BB', 'vlan', '3563')
AA.addEdge('linkTo', CC, 'id', UUID.randomUUID(), 'name', 'AA-CC', 'vlan', '2467')
BB.addEdge('linkTo', DD, 'id', UUID.randomUUID(), 'name', 'BB-DD', 'vlan', '3353')
BB.addEdge('linkTo', DD, 'id', UUID.randomUUID(), 'name', 'BB-DD', 'vlan', '3563')
CC.addEdge('linkTo', DD, 'id', UUID.randomUUID(), 'name', 'CC-DD', 'vlan', '2467')
g.V().
has("site", "name", "AA").
repeat(
timeLimit(200).
both("linkTo").
has("vlan","3353").
simplePath()
).until(has("name", "DD")).
path().by('name').dedup()
g.V().
has("site", "name", "AA").
repeat(
timeLimit(200).
bothE("linkTo").
otherV().
has("vlan","3353").
simplePath()
).until(has("name", "DD")).
path().by('name').dedup()
由于您没有详细说明您试图获得的答案,我推断您正在查找从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获得该属性,如下所示:
AA.addEdge('linkTo', BB, 'id', UUID.randomUUID(), 'name', 'AA-BB', 'vlan', '3353')
AA.addEdge('linkTo', BB, 'id', UUID.randomUUID(), 'name', 'AA-BB', 'vlan', '3563')
AA.addEdge('linkTo', CC, 'id', UUID.randomUUID(), 'name', 'AA-CC', 'vlan', '2467')
BB.addEdge('linkTo', DD, 'id', UUID.randomUUID(), 'name', 'BB-DD', 'vlan', '3353')
BB.addEdge('linkTo', DD, 'id', UUID.randomUUID(), 'name', 'BB-DD', 'vlan', '3563')
CC.addEdge('linkTo', DD, 'id', UUID.randomUUID(), 'name', 'CC-DD', 'vlan', '2467')
g.V().
has("site", "name", "AA").
repeat(
timeLimit(200).
both("linkTo").
has("vlan","3353").
simplePath()
).until(has("name", "DD")).
path().by('name').dedup()
g.V().
has("site", "name", "AA").
repeat(
timeLimit(200).
bothE("linkTo").
otherV().
has("vlan","3353").
simplePath()
).until(has("name", "DD")).
path().by('name').dedup()
这样做的缺点是,路径
将不包含边。如果您还想在路径中获得边缘信息,可以将both()
步骤更改为bothE()/otherV()
模式,如下所示:
AA.addEdge('linkTo', BB, 'id', UUID.randomUUID(), 'name', 'AA-BB', 'vlan', '3353')
AA.addEdge('linkTo', BB, 'id', UUID.randomUUID(), 'name', 'AA-BB', 'vlan', '3563')
AA.addEdge('linkTo', CC, 'id', UUID.randomUUID(), 'name', 'AA-CC', 'vlan', '2467')
BB.addEdge('linkTo', DD, 'id', UUID.randomUUID(), 'name', 'BB-DD', 'vlan', '3353')
BB.addEdge('linkTo', DD, 'id', UUID.randomUUID(), 'name', 'BB-DD', 'vlan', '3563')
CC.addEdge('linkTo', DD, 'id', UUID.randomUUID(), 'name', 'CC-DD', 'vlan', '2467')
g.V().
has("site", "name", "AA").
repeat(
timeLimit(200).
both("linkTo").
has("vlan","3353").
simplePath()
).until(has("name", "DD")).
path().by('name').dedup()
g.V().
has("site", "name", "AA").
repeat(
timeLimit(200).
bothE("linkTo").
otherV().
has("vlan","3353").
simplePath()
).until(has("name", "DD")).
path().by('name').dedup()