0

我有这种情况,其中每个(源)Entity都有Properties一个指向另一个的目标Entity。这些属性映射组合在一起。我想要做的是查询那些具有相应目标的特定属性但在同一组下的实体。

超图会这样(矩形是超边):

超图版

JSON看起来像这样:

{ 
    id: 1, label: "Entity", 
    propertyGroups: [
    { 
        propertyGroupUuid: GroupUuid1, 
        property: {id: 1, label: "Property", name: "aName1"},
        target: {id: 2, label: "Entity"}
    },
    { 
        propertyGroupUuid: GroupUuid2, 
        property: {id: 2, label: "Property", name: "aName2"},
        target: {id: 3, label: "Entity"}
    },
    { 
        propertyGroupUuid: GroupUuid2, 
        property: {id: 3, label: "Property", name: "aName3"},
        target: {id: 4, label: "Entity"}
    }]
}

图数据库中最平坦的版本可能如下所示:

最扁平的版本

虽然它的最扩展版本可能看起来像这样:

最扩展的版本

所以如果我想:

  • 获取所有Entities具有相同 PropertyGroupUuid“目标” Property 2和下的所有内容,我应该分别返回Property 3Entity 3Entity 4Entity 1
  • 获取所有Entities具有相同 PropertyGroupUuidProperty 1Property 2在同一 PropertyGroupUuid 下的“目标” Entity 2Entity 3我不应该回来Entity 1

如何使用 gremlin 对图形的两个版本做到这一点,以及使用正确的索引(如 DSE Graph 合并的索引),哪一个更灵活/性能更好?有没有我没有想到的更好的选择?如果答案详细且解释清楚,我将提供至少 50 的赏金 :)

谢谢!

4

1 回答 1

1

我不了解您的第一个具有解耦属性节点的模型,但这是模型 2 的遍历:

g.V().has("Property", "name", "Property 2").in("hasProperty"). /* start at any of the property 2  */
  filter(out("hasTarget").has("name", "Entity 3")).            /*   with target entity 3          */
  in("hasSubGroup").filter(                                    /* traverse to the property group  */
    out("hasSubGroup").and(                                    /* traverse to all sub-groups      */
      out("hasProperty").has("name", "Property 3"),            /* filter those that are linked to */
      out("hasTarget").has("name", Entity 4")                  /*   property 3 w/ target entity 4  */
    )
  ).in("hasGroup")                                             /* traverse to all entities that match the above criteria */

对图表中的数据一无所知,很难预测此遍历的性能。但总的来说,如果 a) 属性名称被索引并且 b) 分支因子较低,则性能应该没问题。

于 2017-01-09T20:21:26.643 回答