Обход Tinkergraph, возвращающий пустой массив [] на моем графике - PullRequest
0 голосов
/ 09 апреля 2020

Я импортировал график и могу подтвердить, что число вершин и ребер соответствует числу, которое должно присутствовать. Я запускаю на графике вычисления simplepath (), и мой первый вопрос заключается в том, как получить доступ к массиву путей или карте, что бы там ни было, я думаю, что понимаю, добавляя .toList и выводя его на консоль, однако я просто получаю [] пустой массив?

Что я делаю неправильно, мне нужен доступ к результирующему набору, который возвращается по пути?

Мой запрос, который выполняется в Java, а не в консоли Gramlin:

g.V().has("id", "FirstVertexIdValue").shortestPath().with(ShortestPath.target, __.has("id", "EndVertexIdValue")).with(ShortestPath.distance, "weight").toList();

Я также запускаю следующее и по-прежнему возвращаю пустой массив:

g.V("startVertexId").out().simplePath().until(hasId("endVertexId").path().limit(1);

ответ, когда напечатано systemOut, равно []

, кроме того, graphml do c образец здесь, это довольно большая задача c, поэтому я только что включил 2 вершины и 2 ребра:

<?xml version='1.0' encoding='utf-8'?>
<graphml xmlns='http://graphml.graphdrawing.org/xmlns' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd'>
  <key attr.name='weight' attr.type='double' for='edge' id='weight' />
  <key attr.name='edgeid' attr.type='string' for='edge' id='edgeid' />
  <key attr.name='alpha' attr.type='string' for='edge' id='alpha' />
  <key attr.name='intendedpathlonlat' attr.type='string' for='edge' id='intendedpathlonlat' />
  <key attr.name='levelid' attr.type='string' for='edge' id='levelid' />
  <key attr.name='type' attr.type='string' for='edge' id='type' />
  <key attr.name='relatedroutes' attr.type='string' for='node' id='relatedroutes' />
  <key attr.name='description' attr.type='string' for='node' id='description' />
  <key attr.name='title' attr.type='string' for='node' id='title' />
  <key attr.name='on_finish_route' attr.type='string' for='node' id='on_finish_route' />
  <key attr.name='on_starting_route' attr.type='string' for='node' id='on_starting_route' />
  <key attr.name='level_id' attr.type='string' for='node' id='level_id' />
  <key attr.name='waypoint_type' attr.type='string' for='node' id='waypoint_type' />
  <key attr.name='name' attr.type='string' for='node' id='name' />
  <key attr.name='lon' attr.type='string' for='node' id='lon' />
  <key attr.name='lat' attr.type='string' for='node' id='lat' />
  <graph edgedefault='directed' id='Station'>
    <node id='L08-022'>
      <data key='lat'>40.69330963</data>
      <data key='lon'>-73.98752537</data>
      <data key='name' />
      <data key='waypoint_type'>escalator</data>
      <data key='level_id'>1080000</data>
      <data key='on_starting_route' />
      <data key='on_finish_route' />
    </node>
    <node id='L08-023'>
      <data key='lat'>40.69318355</data>
      <data key='lon'>-73.98755793</data>
      <data key='name' />
      <data key='waypoint_type'>stairs</data>
      <data key='level_id'>1080000</data>
      <data key='on_starting_route' />
      <data key='on_finish_route' />
    </node>
    <edge source='WL10-054' target='L10-029'>
      <data key='type'>floor</data>
      <data key='weight'>4.22</data>
      <data key='levelid'>1100000</data>
      <data key='intendedpathlonlat'></data>
      <data key='alpha'>0.0</data>
      <data key='edgeid'>RL10-059</data>
    </edge>
    <edge source='WL10-054' target='WL10-053'>
      <data key='type'>floor</data>
      <data key='weight'>5.69</data>
      <data key='levelid'>1100000</data>
      <data key='intendedpathlonlat'></data>
      <data key='alpha'>0.0</data>
      <data key='edgeid'>RL10-060</data>
    </edge>
</graph>
</graphml>

Пример запроса:

gremlin> g.V().has('T.id', 'L00-041').shortestPath().with(ShortestPath.target, __.has('T.id', 'L04-070')).with(ShortestPath.distance, 'weight').toList()
gremlin> g.V().has('T.id', 'L04-070').out().values('waypoint_type').fold()
==>[]
gremlin> g.V().has('T.id', 'L04-070').out().fold()
==>[]
gremlin> g.V().has('T.id', 'L04-070').out().values('lat').fold()

1 Ответ

1 голос
/ 09 апреля 2020

Без некоторых примеров данных трудно сказать, что может быть совершенно неверным, но вот несколько вещей, которые следует учитывать на основе вопроса о Гремлин:

  • shortestPath() -этап является OLAP шаг и, следовательно, требует, чтобы вы определили g, используя withComputer() - пример можно найти здесь .
  • Я заметил, что вы ищете свою начальную вершину в двух разных пути в каждом из ваших запросов. В первом случае вы осуществляете поиск по свойству с именем «id», а во втором - по идентификатору вершины (обозначается T.id при использовании в has()). Возможно, эта начальная начальная вершина не найдена правильно?
  • Второй обход выглядит недопустимым, поскольку он пытается выполнить все oop (т. Е. Имеет условие until()), но не указывает операцию repeat().

Когда мои обходы не возвращают то, что я ожидаю, я пытаюсь упростить их до точки, где я могу видеть, где обход отфильтровывает ожидаемые мной траверсеры. Другими словами, откройте консоль Gremlin и подключите график. Убедитесь, что g.V("startVertexId") возвращает ожидаемую вами вершину. Если вы удовлетворены результатом, добавьте шаг, запустите g.V("startVertexId").out() и подтвердите его. Продолжайте работать с этим шаблоном, пока не узнаете, куда не возвращаются ваши результаты. Вы также можете запустить свой обход с шагом profile(), и он должен показать вам, где отфильтровываются траверсеры, но иногда легче узнать, выделив обход и упростив.

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

gremlin> g.withComputer().V('WL10-054').shortestPath().with(ShortestPath.target, __.hasId('L10-029')).with(ShortestPath.distance, 'weight')
==>[v[WL10-054],v[L10-029]]
...