当前位置: 首页 > 知识库问答 >
问题:

如何使用Gremlin收集路径沿线的所有顶点和边属性

莫兴言
2023-03-14

这里有一个非常简单的查询:

g.V('customerId').out().path()

它的JSON输出是

{  
   "requestId":"96b26c1d-d032-2004-d36e-c700bd6db2a2",
   "status":{  
      "message":"",
      "code":200,
      "attributes":{  
         "@type":"g:Map",
         "@value":[  

         ]
      }
   },
   "result":{  
      "data":{  
         "@type":"g:List",
         "@value":[  
            {  
               "@type":"g:Path",
               "@value":{  
                  "labels":{  
                     "@type":"g:List",
                     "@value":[  
                        {  
                           "@type":"g:Set",
                           "@value":[  

                           ]
                        },
                        {  
                           "@type":"g:Set",
                           "@value":[  

                           ]
                        }
                     ]
                  },
                  "objects":{  
                     "@type":"g:List",
                     "@value":[  
                        {  
                           "@type":"g:Vertex",
                           "@value":{  
                              "id":"customerId",
                              "label":"customer"
                           }
                        },
                        {  
                           "@type":"g:Vertex",
                           "@value":{  
                              "id":"e:customerIdemail@email.com",
                              "label":"email"
                           }
                        }
                     ]
                  }
               }
            }
         ]
      },
      "meta":{  
         "@type":"g:Map",
         "@value":[  

         ]
      }
   }
}

现在,客户顶点还包含属性名称和年龄。我想了解的是,如何(简单地说,如果可能的话)形成我的小精灵查询,使其在图中嵌套顶点属性。注意,当我刚刚运行g.V(“customerId”)时,响应确实包含这些属性。

共有1个答案

颜阳炎
2023-03-14

您应该始终准确地指定要在遍历中返回的数据。即使是像这样简单的事情:

g.V('customerId')

你真的应该更喜欢:

g.V('customerId').valueMap('name','age')

在SQL中,这与您可能不会做的事情没有什么不同

SELECT * FROM customer

但是相反

SELECT name, age FROM customer

至于你的问题,你只需要指定你想要返回的数据,所以对路径()使用调制器:

g.V('customerId').
  out().
  path().
    by(valueMap('name','age'))

当然,这假设您的out()也是一个“客户”,如果不是,只需添加第二个by(),并带有该字段所需的特定字段。by()调制器以循环方式应用。如果您希望处理稍微干净一点的JSON,您可以使用类似以下的project()

g.V('customerId').
  out().
  path().
    by(project('name','age').
         by('name').
         by('age'))

因为这将消除value eMap()添加以正确考虑多属性的嵌入式列表。

从TinkerPop 3.4.4开始,您还需要考虑包含更多图形元素结构的步骤。

gremlin> g.V().has('person','name','marko').elementMap()
==>[id:1,label:person,name:marko,age:29]
gremlin> g.V().has('person','name','marko').elementMap('name')
==>[id:1,label:person,name:marko]
gremlin> g.V().has('person','name','marko').properties('name').elementMap()
==>[id:0,key:name,value:marko]
gremlin> g.E(11).elementMap()
==>[id:11,label:created,IN:[id:3,label:software],OUT:[id:4,label:person],weight:0.4]
 类似资料:
  • 我发现下面的查询非常适合获取给定单个顶点的所有子顶点和边及其属性 然而,我如何递归地执行上述操作,即对于给定的顶文,它将遍历其所有子级并返回每个(顶点)及其传出边(s)及其所有属性(顶点和边)......即类似于上面的内容,但在循环中为它找到的每个子顶点......有没有办法使用gremlin做到这一点?

  • 如何在Gremlin查询中检索从根顶点开始的所有顶点属性? 我们有以下结构: 根顶点:Employee 边缘:EdCompany,EdDepartment,EdRole顶点:公司,部门,角色 我们试图接收与根顶点连接的其他顶点的数据。有人这样想: 我们尝试了该查询,但返回了一个复杂的JSON: 编辑: 我们还尝试了Kelvin建议的查询: 堆栈跟踪:提交查询失败:g.V().hasLabel(“E

  • 我有一个有向图,有大约1000个顶点和3000条边,其中包含圈。 我试图从给定顶点找到所有下游(外)路径。 使用以下Gremlin查询时 对于某些路径,由于周期的原因,需要花费很长时间才能得到结果,尽管simplePath步骤应该可以防止这种情况发生。 我尝试优化查询,并使用“聚合”步骤和“不使用”步骤两次遍历同一顶点,但现在跳过了一些顶点。 谢谢

  • 假设我们有一个已知的最小生成树。 我们的任务是找到存在于每对顶点之间的路径的最大边缘。 举个例子, 我们有以下最小生成树: 在顶点1和2之间,我们有一个成本为10的边。在顶点1和3之间,我们有一个成本为5的边。在顶点3和4之间,我们有一个成本为4的边。 每个路径的最大边缘: 路径1-2:它只包含代价为10的边。所以答案是10。 路径1-3:它只包含代价为5的边缘。所以答案是5。 路径1-4:从顶点

  • 我试图组合一个查询来获取所有传入和传出的顶点,包括它们的边和方向,但这也会返回那些没有边的顶点。 我现在可以通过强制所有东西都至少有一个边缘来解决这个问题,但这是我想要避免的。 也许值得注意的是,我使用Azure CosmosDB的图形API:https://docs.microsoft.com/en-us/azure/cosmos-db/gremlin-support 这是我用来返回所有顶点及其

  • 我需要从一个顶点开始,找到所有相关的顶点,直到结束。标准是匹配边inV顶点中的任何一个边属性(属性)。如果边缘属性“value”与inV顶点“attribute”名称不匹配,我应该跳过该顶点。边的属性值作为属性名称传播到inV顶点中 我使用下面的查询,但这给了我父节点、下一个节点和之间的边的json输出。通过输出am写入逻辑,仅拾取与边缘属性匹配的下一个属性。如果属性匹配可以通过gremlin查询