Azure cosmosdb Gremlin 3-获取所有传入和传出顶点,包括它们的边和方向,包括没有边的顶点

Azure cosmosdb Gremlin 3-获取所有传入和传出顶点,包括它们的边和方向,包括没有边的顶点,azure-cosmosdb,graph-databases,gremlin,tinkerpop3,Azure Cosmosdb,Graph Databases,Gremlin,Tinkerpop3,我正在尝试组合一个查询来获取所有传入和传出的顶点,包括它们的边和方向,但这也会返回那些没有边的顶点 我现在可以通过强迫每件事至少有一个优势来解决这个问题,但这是我想要避免的 也许值得注意的是,我使用Azure CosmosDB的图形API: 这是我用来返回所有顶点及其边和相关顶点的查询: g.V().hasLabel('User').as('User').bothE().as('Edge').otherV().as('RelatedObject').path() 我是从以下方面得到的: 这个查

我正在尝试组合一个查询来获取所有传入和传出的顶点,包括它们的边和方向,但这也会返回那些没有边的顶点

我现在可以通过强迫每件事至少有一个优势来解决这个问题,但这是我想要避免的

也许值得注意的是,我使用Azure CosmosDB的图形API:

这是我用来返回所有顶点及其边和相关顶点的查询:

g.V().hasLabel('User').as('User').bothE().as('Edge').otherV().as('RelatedObject').path()
我是从以下方面得到的:

这个查询生成的结果我以后可以在C应用程序中轻松解析,但是这个查询不会返回没有边的顶点

有什么想法吗

编辑

我得到的最接近的结果是:

g.V().hasLabel("User").as("User").map(bothE().otherV().fold()).as("RelatedObjects").select("User", "RelatedObjects")
但是,这种方法不会显示用户和相关对象之间的边。我还需要边,以便能够正确地将这些相关对象映射到父对象。

试试这个


g、 V.hasLabelUser.asUser.bothE.as“edges”。mapselect“edges”。inV.fold.as RelatedObjects.selectUser,RelatedObjects,“edges”

我没有您要测试的图形,但我认为这种通用模式应该适合您

g.withSideEffect('x', [] as Set).                        
     V().hasLabel("user").store('x').                                    
     bothE().store('x').                                  
     otherV().store('x').                                 
     cap('x')
编辑为不使用集合

g.withSideEffect('x', []).                        
     V().has('code',"AUS").store('x').                                    
     bothE().store('x').                                  
     otherV().store('x').                                 
     cap('x').unfold().dedup().fold() 

这就是CosmosDB的工作方式:

g.V().hasLabel("User")
    .as('Vertex') <------------------- alias for all users
    .map(bothE().fold())
    .as('Edges')
    .map(select('Vertex') <----------- this was the key. Map from the first step
        .bothE().otherV().fold())
    .as('RelatedVertices')
    .select('User', 'Edges', 'RelatedVertices')

我认为您可以删除所有步骤标签并使用副作用-只需使用project:


有趣的方法,但它只显示了每个用户的一个优势。我尝试一步一步地添加.fold。这两步都是,但这在Microsoft.Azure.Graphs库中导致了一个异常。实际上它可以工作,它只为每个边缘显示一个用户,但已经足够好了!抱歉,它实际上仍然忽略没有边的顶点。。。我试过这个:。作为“用户”。两者都作为“边缘”。映射选择“边缘”。其他v.as“相关顶点”。选择“顶点”、“边缘”、“相关顶点”。一定太累了。似乎无法与Microsoft.Azure一起使用。图形:Gremlin查询编译错误:脚本编译错误:不支持的groovy语言规则:“type”text:“Set”@第1行,第29列。我认为withSideEffect也不受支持。那太糟糕了。我用TinkerGraph/Gremlin控制台在我的笔记本电脑上用我自己的图形在3.3级运行了它,它完成了任务。如果碰巧支持SideEffect,你可以使用一个列表,而不是一组“g.WithideEffect'x”,[]。V.有'code',AUS.store'x'。两个都是。存储“x”。其他的商店'x'。不幸的是,这是我在第一次失败后尝试的第一件事。。。但我必须给你+1的努力。
g.withSideEffect('x', [] as Set).                        
     V().hasLabel("user").store('x').                                    
     bothE().store('x').                                  
     otherV().store('x').                                 
     cap('x')
gremlin> g.V().hasLabel('person').
......1>   project('user','edges','relatedVertices').
......2>     by().
......3>     by(bothE().fold()).
......4>     by(both().fold())
==>[user:v[1],edges:[e[9][1-created->3],e[7][1-knows->2],e[8][1-knows->4]],relatedVertices:[v[3],v[2],v[4]]]
==>[user:v[2],edges:[e[7][1-knows->2]],relatedVertices:[v[1]]]
==>[user:v[4],edges:[e[10][4-created->5],e[11][4-created->3],e[8][1-knows->4]],relatedVertices:[v[5],v[3],v[1]]]
==>[user:v[6],edges:[e[12][6-created->3]],relatedVertices:[v[3]]]