Как пройти всю вершину и получить вложенные объекты

введите здесь описание изображения Я хочу получить вложенные объекты в виде

{ country : 
   {code:'IN',states:
      {code:'TG',cities:
         {code:'HYD',malls:
            {[shopping-mall1],[shopping-mall2],.....}
         },
         {code:'PKL',malls:
            {[shopping-mall1],[shopping-mall2],.....}
         }
      },
      {code:'AP',cities:
         {code:'VJY',malls:
            {[shopping-mall1],[shopping-mall2],.....}
         }
      }
   }
}

МОЙ график имеет формат

vertex: country ---> states ---->cities ---> mallls                             
edges:  (type:'state')       ('type','city')

ex: inE('typeOf').outV().has('type','state') move to next vertex "states".
    next same inE('typeOf').outV().has('type','city') moves to "city" vertex. then "malls" vertex .

И устал писать код, в какой-то вершине нет городов, у меня ошибка ситуационная. "

ошибка

The provided traverser does not map to a value: v[8320]->[JanusGraphVertexStep(IN,[partOf],vertex), HasStep([type.eq(city)]), JanusGraphPropertiesStep([code],value)]

Вот почему я использую coalesce, потому что в каком-то штате нет края 'inE (' partOf '). OutV (). Has (' type ',' city ')' означает отсутствие города

.by(coalesce(select('states').inE('partOf').outV().has('type','city'))

Мой запрос

 g.V().hasLabel('Country').has('code','IN')
 .project('country')
     .by(project('code','states')
        .by(values('code'))
        .by(inE('partOf').outV().has('type','state').has('code').as('states').
         project('code','cities')
          .by(select('states').values('code'))
          .by(coalesce(select('states').inE('partOf').outV().
           has('type','city').has('code').as('cities').
           project('code','malls')   
             .by(select('cities').values('code'))
             .by(coalesce(select('cities').inE('partOf').outV().
              has('type','malls').valueMap(),constant(0))),
           constant(0)))))


Но результат

{country={code=IN, states={code=DD, cities=0}}}

here i am getting one state 'DD' and that state is no city,so it gives 'cities = 0".

приведенный выше результат - только один штат, я хочу, чтобы все штаты, города и торговые центры в каждом городе.

Пожалуйста, обновите запрос или измените запрос


person sairam    schedule 10.08.2019    source источник
comment
Не могли бы вы предоставить небольшой график в виде скрипта Gremlin (g.addV()...)?   -  person Daniel Kuppitz    schedule 10.08.2019
comment
Добавлено изображение выше, пожалуйста, посмотрите туда   -  person sairam    schedule 10.08.2019
comment
В виде скрипта, пожалуйста, если у вас не хватит терпения дождаться кого-то, кто переведет изображение в реальный график.   -  person Daniel Kuppitz    schedule 11.08.2019


Ответы (1)


Чтобы собрать все результаты, вы должны использовать .fold () traversal, который возвращает список собранных обходов. без сгиба вы получите только первый обход, как в вашем примере.

Чтобы типы оставались неизменными, я изменил константу на [] вместо 0.

Также было неясно, относится ли свойство «тип» к ребру или вершине. Я считаю более подходящим иметь его на краю, поэтому я также исправил его, переместив has ('type', ...) между inE () и outV ().

Наконец, вам не нужно «сохранять» обход, используя «as», а затем «выбирать» его.

Этот запрос должен дать вам требуемый результат:

 g.V().hasLabel('Country').has('code','IN')
 .project('country')
     .by(project('code','states')
        .by(values('code'))
        .by(inE('partOf').has('type','state').outV().has('code')
        .project('code','cities')
          .by(values('code'))
          .by(coalesce(inE('partOf').has('type','city').outV().has('code')
          .project('code','malls')   
             .by(values('code'))
             .by(coalesce(
                inE('partOf').has('type','malls').outV().valueMap(),
                constant([])).fold()),
            constant([])).fold())
        .fold()))
person Kfir Dadosh    schedule 23.08.2019