Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gremlin DSE图在具有多个属性的边/顶点上查找路径_Gremlin_Tinkerpop_Dse - Fatal编程技术网

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

我有一个例子,也许这里的任何人都可以帮我找出DSE图中的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", "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()