Gremlin 查询遍历多个节点和边

问题描述 投票:0回答:1

知识共享 --> 下面的查询从A(节点)开始遍历<--W(edge)<--B(node)-->X(边)--> C(节点)-->Y(边)--> D(节点)<--Z(edge)<--E(node)

    g.V().hasLabel("A").as("A").
    inE("W").as("W").
    outV().
    hasLabel("B").as("B").
    outE("X").as("X").
    inV().
    hasLabel("C").as("C").
    outE("Y").
    has("Y propery","10000").as("Y").
    inV().
    hasLabel("D").as("D").
    inE("Z").as("Z").
    outV().
    hasLabel("E").as("E").
    select("A","W","B","X","C","Y","Y","D","Z","E")
    .by(valueMap()).toList()
gremlin tinkerpop
1个回答
0
投票

这个查询有一些事情......

首先,标签应用作图中节点和边的较低基数组。如果您从关系数据库的角度来看,请将标签视为表名称(即客户、产品、电影、演员等)。如果您的计划是查找单个节点或边,则应该为每个节点和边使用唯一的 ID 值。

其次,我们尝试要求请求 Gremlin 查询帮助的用户提供一个示例图,以便将来偶然发现这个问题的人可以将一些东西导入到他们自己的 Gremlin 服务器、Gremlify 或其他方式来验证问题的结果。对于这个特定问题,您可以使用以下内容:

g.addV('nodeLabel').property(id,'A').as('A').
    addV('nodeLabel').property(id,'B').as('B').
    addV('nodeLabel').property(id,'C').as('C').
    addV('nodeLabel').property(id,'D').as('D').
    addV('nodeLabel').property(id,'E').as('E').
    addE('edgeLabel').property(id,'W').from('A').to('B').
    addE('edgeLabel').property(id,'X').from('B').to('C').
    addE('edgeLabel').property(id,'Y').from('C').to('D').
    addE('edgeLabel').property(id,'Z').from('D').to('E')

现在有了这张图,如果我们想返回从 A 到 E 的完整路径,我们可以这样做:

g.V('A').outE('W').inV().hasId('B').
    outE('X').inV().hasId('C').
    outE('Y').inV().hasId('D').
    outE('Z').inV().hasId('E').
    path().by(elemmentMap())

这将返回查询遍历的整个路径以及所有节点和交叉边的 elementMap()。

如果你只想从节点“A”遍历到最后一个叶节点,你可以这样做:

g.V('A').repeat(outE().inV().simplePath()).path().by(elementMap())

如果您在 Gremlin 控制台中运行这些查询,则不需要以

toList()
next()
结尾。但是,如果在代码中使用任何 Gremlin 客户端,您将需要使用这些客户端,因为它们是将查询发送到连接的支持 TinkerPop 的服务器所需的终端步骤。

用于学习 Gremlin 的好资源在这里:https://www.kelvinlawrence.net/book/PracticalGremlin.html

© www.soinside.com 2019 - 2024. All rights reserved.