我试图弄清楚如何匹配非线性模式/蓝图的重复实例,如下面的示例用例:
顶点类型(每个都具有属性“name”):
边缘类型(没有任何属性)
我正在考虑的用户用户体验和用户UY之间的complex repeating pattern是5个必需关系的组合:
具体来说,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查询答案 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)。