【问题标题】:How to apply a static has step on all the visited nodes/edges for a given traversal gremlin query对于给定的遍历 gremlin 查询,如何在所有访问的节点/边上应用静态步骤
【发布时间】:2020-09-01 08:38:39
【问题描述】:

我们在每个节点和边上将用户权限标记为(SET 基数的)属性。想知道对于给定的遍历 gremlin 查询,在所有访问的节点/边上应用 has 步骤的最佳方法是什么。

就像一个非常简单的遍历查询: // 从伦敦希思罗机场 (LHR) 飞往美国机场的航班

g.V().has('code','LHR').out('route').has('country','US').values('code')

在使用上述查询进行遍历时,将has('permission', 'team1') 添加到所有访问的顶点和边。

【问题讨论】:

    标签: graph gremlin janusgraph gremlin-server


    【解决方案1】:

    您可以考虑两种方法。

    1. 写一个custom TraversalStrategy
    2. 开发Gremlin DSL

    对于TraversalStrategy,您将开发一个类似于SubgraphStrategyPartitionStrategy 的方法,这将获取您的用户构建权限,然后在out() / in() 各种步骤之后自动注入必要的has() 步骤.这里的缺点是您的TraversalStrategy 必须用 JVM 语言编写,并且如果使用 Gremlin Server,则必须在服务器上安装。如果您打算以任何方式从客户端配置此 TraversalStrategy,则需要构建自定义序列化程序才能实现。

    对于 DSL,您将为 out() / in() 类型的步骤创建新的导航步骤,它们将插入导航步骤和 has() 步骤的适当组合。 DSL 方法很好,因为您可以用任何编程语言编写它并且它可以工作,但它不允许服务器端配置,并且您必须始终确保客户端在查询图形时使用 DSL。

    我们在每个节点和边上将用户权限标记为(SET 基数的)属性。

    作为最后一点,“SET 基数”我假设您的意思是multi-properties。边不允许这些,因此您只能在顶点上标记这样的属性。

    【讨论】:

    • 感谢 Stephen,即计划使用 CustomUserPermissionStrategy。注意:我们目前提供用户通过 HttpChannelizer 运行 gremlin 查询,因此我们应该在 empty-sample.groovy 中使用新的 CustomUserPermissionStrategy,例如 global
    • 您将不得不编写一些自定义代码来实现这一点。你会想看看github.com/apache/tinkerpop/blob/… 并根据你的需要进行修改。
    • 然后您将使用您的自定义处理程序并构建您自己的 Channelizer 来构建您自己的管道并将其插入 Gremlin 服务器:github.com/apache/tinkerpop/blob/…
    • 好的。再次感谢。看来我需要更深入地了解完整的工作流程。任何文档参考我也可以参考这些自定义类需要如何插入在一起。注意:我们使用janusgraph。顺便说一句..你介意用即时通讯工具说话吗?
    • 恐怕在这方面没有太多文档,因为它是 API(和 netty)的相当高级的用法。如果您还有其他问题,gremlin-users 邮件列表可能是一种更好的聊天方式……比 IM 好一点,因为我们的讨论可能会帮助其他用户。事实上,如果你在那里搜索一下,你可能会发现过去的讨论提供了一些指导。 groups.google.com/g/gremlin-users
    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多