Запрос вершин через другую вершину [GREMLIN] - PullRequest
0 голосов
/ 16 апреля 2020

graph database

Изображение выше, как выглядит мой график, и я хотел бы запросить следующий вывод:

[
    {
        chart:{
            name: 'chart1',
            id: 'chart1',
            label: 'chart',
            pk: 'chart1',
        },
        variables: [
            {
                variable: {
                    name:'variable1'
                    id: 'variable1',
                    label: 'variable',
                    pk: 'variable1',
                },
                years: [
                    {
                        name:'year1'
                        id: 'year1',
                        label: 'year',
                        pk: 'year1',
                    },
                    {
                        name:'year2'
                        id: 'year2',
                        label: 'year',
                        pk: 'year2',
                    },
                ],
            },
            {
                variable: {
                    name:'variable2'
                    id: 'variable2',
                    label: 'variable',
                    pk: 'variable2',
                },
                years: [
                    {
                        name:'year3'
                        id: 'year3',
                        label: 'year',
                        pk: 'year3',
                    },
                ],
            }
        ],
    },
    {
        chart:{
            name: 'chart2',
            id: 'chart2',
            label: 'chart',
            pk: 'chart2',
        },
        variables: [
            {
                variable: {
                    name:'variable2'
                    id: 'variable2',
                    label: 'variable',
                    pk: 'variable2',
                },
                years: [
                    {
                        name:'year4'
                        id: 'year4',
                        label: 'year',
                        pk: 'year4',
                    },
                ],
            },
        ],
    }
]

Но с моим текущий запрос:

g
.V()
.hasLabel('chart')
.project('chart', 'variables')
.by(valueMap(true))
.by(
    out('visualizes')
    .hasLabel('year')
    .out('outputs')
    .hasLabel('variable')
    .project('variable', 'years')
    .by(
        valueMap(true).fold()
    )
    .by(
        __.in('outputs')
        .hasLabel('year')
        .valueMap(true)
        .fold()
    )
    .fold()
)

Вот что я получаю:

[
    {
        chart: {
            id: 'chart1',
            label: 'chart',
            name: 'chart1',
            pk: 'chart1',
        },
        variables: [
            {
                variable: [
                    {
                        id: 'variable1',
                        label: variable,
                        name: 'variable1',
                        pk: 'variable1'
                    }
                ],
                years: [
                    {
                        id: 'year1',
                        label: 'year',
                        name: 'year1',
                        pk: 'year1',
                    },
                    {
                        id: 'year2',
                        label: "year",
                        name: 'year2',
                        pk: 'year2'
                    },
                ]
            },
            {
                variable: [
                    {
                        id: 'variable1',
                        label: 'variable',
                        name: 'variable1',
                        'pk': 'variable1'
                    }
                ],
                years: [
                    {
                        id: 'year1',
                        label: 'year',
                        name: 'year1',
                        pk: 'year1'
                    },
                    {
                        id: 'year2',
                        label: 'year',
                        name: 'year2',
                        pk: 'year2'
                    }
                ]
            },
            {
                variable: [
                    {
                        id: 'variable2',
                        label: "variable",
                        name: 'variable2',
                        pk: 'variable2'
                    }
                ],
                years: [
                    {
                        id: 'year3',
                        label: 'year',
                        name: 'year3',
                        pk: 'year3',
                    },
                    {
                        id: 'year4',
                        label: "year",
                        name: 'year4',
                        pk: 'year4'
                    }
                ]
            }
        ]
    },
    {
        chart: {
            id: 'chart2',
            label: 'chart',
            name: 'chart2',
            pk: 'chart2'
        },
        variables: [
            {
                variable: [
                    {
                        id: 'variable2',
                        label: 'variable',
                        name: 'variable2',
                        pk: 'variable2'
                    }
                ],
                years: [
                    {
                        id: 'year3',
                        label: 'year',
                        name: 'year3',
                        pk: 'year3'
                    },
                    {
                        id: 'year4',
                        label: 'year',
                        name: 'year4',
                        pk: 'year4'
                    }
                ]
            }
        ]
    }
]
//this is the formatted version to be easily read. refer to this link for the actual json: https://pastebin.com/Y2ncHyPi 

Как видно из фактического вывода, моя проблема с запросом: chart1 дубликаты variable1 и Переменная chart2 имеет year3 от chart1. Должен ли я изменить структуру моего графика? или мне нужно добавить дополнительные свойства для справки? пожалуйста, помогите.

Запрос на график заполнения:

g
.addV('chart')
.property('name', 'chart1')
.property('pk', 'chart1')
.property('id', 'chart1')
.as('chart1')
.addV('chart')
.property('name', 'chart2')
.property('pk', 'chart2')
.property('id', 'chart2')
.as('chart2')

.addV('year')
.property('name', 'year1')
.property('pk', 'year1')
.property('id', 'year1')
.as('year1')
.addV('year')
.property('name', 'year2')
.property('pk', 'year2')
.property('id', 'year2')
.as('year2')
.addV('year')
.property('name', 'year3')
.property('pk', 'year3')
.property('id', 'year3')
.as('year3')
.addV('year')
.property('name', 'year4')
.property('pk', 'year4')
.property('id', 'year4')
.as('year4')

.addV('variable')
.property('name', 'variable1')
.property('pk', 'variable1')
.property('id', 'variable1')
.as('variable1')
.addV('variable')
.property('name', 'variable2')
.property('pk', 'variable2')
.property('id', 'variable2')
.as('variable2')

.addE('visualizes')
.from('chart1')
.to('year1')
.addE('outputs')
.from('year1')
.to('variable1')

.addE('visualizes')
.from('chart1')
.to('year2')
.addE('outputs')
.from('year2')
.to('variable1')

.addE('visualizes')
.from('chart1')
.to('year3')
.addE('outputs')
.from('year3')
.to('variable2')

.addE('visualizes')
.from('chart2')
.to('year4')
.addE('outputs')
.from('year4')
.to('variable2')

PS: я использую Azure API-интерфейс gremlin для Cosmos DB.

1 Ответ

3 голосов
/ 16 апреля 2020

Я могу предложить решение, которое, я не уверен, является самым простым, но оно работает:

g.V().hasLabel('chart').
  project('chart', 'variables').
    by(valueMap(true)).
    by(out('visualizes').
      hasLabel('year').as('y').
      out('outputs').
      group().by().
        by(select('y').fold()).unfold().
      project('variable', 'years').
        by(select(keys).
          valueMap(true)).
        by(select(values).unfold().
          valueMap(true).fold()).fold())

Я проверил это здесь: https://gremlify.com/6h

...