Gremlin查询用于查找重复的复杂非线性模式

时间:2017-09-06 15:06:53

标签: graph neo4j orientdb graph-databases gremlin

我试图弄清楚如何匹配非线性模式/蓝图的重复实例,如下面的示例用例:

顶点类型(每个都具有属性“name”):

  • 用户
  • 关系
  • 作用
  • 角色类型

边缘类型(没有任何属性)

  • InRelation,从用户到关系
  • OwnsRole,从用户到角色
  • HasRole,从关系到角色
  • IsOfType,从Role到RoleType

我正在考虑的用户用户体验和用户UY之间的complex repeating pattern是5个必需关系的组合:

  • 用户用户体验是关系RE的InRelation
  • 用户UY与关系RE(与UY!= UX)的InRelation
  • 用户UX OwnsRole角色RO
  • Relation RE HasRole Role RO
  • 角色RO IsOfType RoleType RT

具体来说,RT具有特定的右顶点,例如名称为“Child”的顶点,因此整个模式的含义变为用户UX与用户UY的RE关系,用户UX定义了一个角色RO他们将用户UY分配给他们的关系RE,并且他们给了角色类型“Child”。

例如OrientDB的SQL方言使用它们的MATCH语法,可以使用以下语句找到此模式的所有单独匹配:

SELECT ux.name, uy.name FROM (
MATCH
    {class: User, as: ux} -InRelation-> {class: Relation, as: re} <-InRelation- {class: User, as: uy, where: ($matched.ux != $currentMatch)},
    {class: User, as: ux} -OwnsRole-> {class: Role, as: ro} <-HasRole- {class: Relation, as: re},
    {class: Role, as: ro} -HasType-> {class: RoleType, as: rt, where: (name = 'Child')}
RETURN ux, re, uy, ro, rt).

在Neo4j的CypherQL中,可以构建类似的声明。

我还没有设法编写一个等效的Gremlin查询(主要是因为使用Back()子句似乎搞乱了我的遍历),但我明白,一旦我设法这样做,重写它以便它可以找到重复的模式实例应该是可行的。

所以:给定this graph,如何编写

的gremlin查询
  1. 找到名为'jim'的用户顶点的所有直接子节点(即名为'jeff'的用户顶点?
  2. 找到名为'jim'的用户顶点的所有直接和间接子节点(即名称为'jeff','jill'和'john'的用户顶点)?

1 个答案:

答案 0 :(得分:0)

重建示例图表的一些Gremlin语句会有所帮助,但这是我的猜测:

g.V().hasLabel("User").match(
    __.as("ux").out("InRelation").as("re"),
    __.as("re").in("InRelation").as("uy"),
    __.as("ux").out("OwnsRole").as("ro"),
    __.as("re").out("OwnsRole").as("ro"),
    __.as("ro").out("HasType").has("name", "Child")).
  where("ux", neq("uy")).
  select("ux","uy").by("name")

然而,正如斯蒂芬在评论中指出的那样,你似乎正在使用Gremlin 2.我的遍历是针对Gremlin 3的(但说实话,我并不是真正意识到任何图形数据库,那就是&#39;仍在使用TinkerPop 2)。