【问题标题】:Gremlin: Get all vertices hasLabel 'model' and their children with all propertiesGremlin:获取所有顶点 hasLabel 'model' 及其所有属性的子节点
【发布时间】:2021-12-24 00:05:17
【问题描述】:

我有一个图表,它应该具有以下 json 结构

{
    "models": [
    {
        "name": "Model1",
        "id": 19,
        "diagram": [
        {
            "name": "Diagram1",
            "id": "34"
        },
        {
            "name": "Diagram2",
            "id": "36"
        }
        ]
    },
    {
        "name": "Model2",
        "id": 14,
        "diagram": [
        {
            "name": "Diagram2",
            "id": "32"
        }
        ]
    }
    ]
}

这是我的示例图:

g.addV('org').property('name', 'Org_seppmed').as('org1').addV('org').property('name', 'Org_siemens').as('org2').addV('user').property('name', 'U_Sebastian').as('user1').addV('user').property('name', 'U_Jaroslaw').as('user2').addV('user').property('name', 'U_Jürgen').as('user3').addV('user').property('name', 'U_Carsten').as('user4').addV('user').property('name', 'U_DevUser').as('user5').addE('administratedBy').from('org1').to('user1').addE('hasEmployee').from('org1').to('user2').addE('hasEmployee').from('org1').to('user3').addE('hasEmployee').from('org2').to('user4').addE('hasEmployee').from('org1').to('user5').addE('hasGuest').from('org1').to('user4').addV('project').property('name', 'P_Bremsen').as('projectmbt1').addV('project').property('name', 'P_Blinker').as('projectmbt2').addE('owns').from('user1').to('projectmbt1').addE('owns').from('user2').to('projectmbt2').addE('writes').from('user2').to('projectmbt1').addE('writes').from('user3').to('projectmbt1').addE('reads').from('user4').to('projectmbt1').addE('writes').from('user1').to('projectmbt2').addE('writes').from('user3').to('projectmbt2').addV('model').property('name', 'M_Bremse').as('modelmbt1').addV('model').property('name', 'M_Blinker').as('modelmbt2').addV('model').property('name', 'M_Bremse2').as('modelmbt3').addE('has').from('projectmbt1').to('modelmbt1').addE('has').from('projectmbt1').to('modelmbt3').addE('has').from('projectmbt2').to('modelmbt2').addV('diagram').property('name', 'D_D1').as('diagramd1').addV('diagram').property('name', 'D_D2').as('diagramd2').addV('diagram').property('name', 'D_D3').as('diagramd3').addV('diagram').property('name', 'D_D1').as('diagramd4').addV('testsuite').property('name', 'T_TestD1').as('testsuited1').addE('has').from('modelmbt1').to('diagramd1').addE('has').from('modelmbt1').to('diagramd2').addE('has').from('modelmbt2').to('diagramd3').addE('has').from('modelmbt3').to('diagramd4').addE('has').from('modelmbt1').to('testsuited1').addV('initial').as('initMBT1D1').addV('precondition').as('preMBT1D1').addV('teststep').property('name', 'N_Blinking left').as('node1MBT1D1').addV('teststep').property('name', 'N_Blinking right').as('node2MBT1D1').addV('teststep').property('name', 'N_Hazard flashers').as('node3MBT1D1').addV('teststep').property('name', 'N_Emergency flashers').as('node4MBT1D1').addV('teststep').property('name', 'N_Blinking off').as('node5MBT1D1').addV('node').as('connodeMBT1D1').addV('postcondition').as('postMBT1D1').addV('final').as('finalMBT1D1').addE('has').from('diagramd1').to('initMBT1D1').addE('has').from('diagramd1').to('preMBT1D1').addE('has').from('diagramd1').to('node1MBT1D1').addE('has').from('diagramd1').to('node2MBT1D1').addE('has').from('diagramd1').to('node3MBT1D1').addE('has').from('diagramd1').to('node4MBT1D1').addE('has').from('diagramd1').to('node5MBT1D1').addE('has').from('diagramd1').to('connodeMBT1D1').addE('has').from('diagramd1').to('postMBT1D1').addE('has').from('diagramd1').to('finalMBT1D1').addE('pointsTo').from('initMBT1D1').to('preMBT1D1').addE('pointsTo').from('preMBT1D1').to('node1MBT1D1').addE('pointsTo').from('preMBT1D1').to('node2MBT1D1').addE('pointsTo').from('preMBT1D1').to('node3MBT1D1').addE('pointsTo').from('preMBT1D1').to('node4MBT1D1').addE('pointsTo').from('preMBT1D1').to('node5MBT1D1').addE('pointsTo').from('node1MBT1D1').to('postMBT1D1').addE('pointsTo').from('postMBT1D1').to('node1MBT1D1').addE('pointsTo').from('node2MBT1D1').to('postMBT1D1').addE('pointsTo').from('node3MBT1D1').to('postMBT1D1').addE('pointsTo').from('node4MBT1D1').to('postMBT1D1').addE('pointsTo').from('node5MBT1D1').to('postMBT1D1').addE('pointsTo').from('postMBT1D1').to('connodeMBT1D1').addE('linksTo').from('connodeMBT1D1').to('diagramd2').addE('pointsTo').from('connodeMBT1D1').to('finalMBT1D1').addV('initial').as('initMBT1D2').addV('teststep').property('name', 'N_Trigger left').as('node1MBT1D2').addV('teststep').property('name', 'N_Trigger right').as('node2MBT1D2').addV('verificationpoint').property('name', 'N_Triggercheck').as('node3MBT1D2').addV('final').as('finalMBT1D2').addE('has').from('diagramd2').to('initMBT1D2').addE('has').from('diagramd2').to('node1MBT1D2').addE('has').from('diagramd2').to('node2MBT1D2').addE('has').from('diagramd2').to('node3MBT1D2').addE('has').from('diagramd2').to('finalMBT1D2').addE('pointsTo').from('initMBT1D2').to('node1MBT1D2').addE('pointsTo').from('initMBT1D2').to('node2MBT1D2').addE('pointsTo').from('node1MBT1D2').to('node3MBT1D2').addE('pointsTo').from('node2MBT1D2').to('node3MBT1D2').addE('pointsTo').from('node3MBT1D2').to('finalMBT1D2')

现在我正在尝试找到一个查询来获取上述结构:

g.V().hasLabel("model").out().hasLabel("diagram").path().by(elementMap())

结果是这样的:

==>path[{id=12384, label=model, name=Model2}, {id=28904, label=diagram, name=Diagram2}]
==>path[{id=37056, label=model, name=Model1}, {id=16448, label=diagram, name=Diagram1}]
==>path[{id=37056, label=model, name=Model1}, {id=24808, label=diagram, name=Diagram1}]

我的期望是获得Map<Model, List<Diagram>>。但是我为模型的每个图表都获得了一个完整的新条目,而不是将所有相关图表添加到模型中。

我该如何解决我的问题?

【问题讨论】:

    标签: java gremlin tinkerpop


    【解决方案1】:

    如果你想生成一个地图,你需要group 使用模型作为键。如下所示。显然,如果您有这样的属性,例如name,您将不会真的想使用label,而是标识模型类的东西。

    g.V().hasLabel("model").
          group().
            by('name').
            by(out().hasLabel("diagram").path().by(elementMap()).fold())
    
    

    在 cmets 讨论后编辑:

    如果您不希望结果中出现整个path,而只需要唯一的图表节点及其属性,则可以将查询修改为如下所示。此版本还将标签节点中的所有属性添加为组(映射)键。

    g.V().hasLabel("model").
          group(). 
            by(elementMap()).
            by(out().hasLabel("diagram").elementMap().fold())
    

    【讨论】:

    • 嗨。不幸的是,这个查询只给了我一个模型到图表的路径。但我需要所有模特和他们的孩子(图表)。所有结果顶点的属性
    • 这是我的游乐场:gremlify.com/nbvke97vu
    • 只需在elementMap()) 之后添加一个fold 就可以了。我更新了答案。
    • 如果答案不充分,请提供addVaddE 步骤来构建具有代表性的示例图。 Gremlify 的链接很有用,但 SO 帖子最终需要能够在人们以后发现时独立存在,并且更容易构建一个经过测试的答案,并将示例图作为问题的一部分。谢谢。
    • 嗨。我已将示例图添加到我的初始帖子中。
    猜你喜欢
    • 2021-12-27
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多