0

我已经导入了一个图,并且可以确认顶点和边的数量与应该存在的数量相匹配。我在图上运行 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 文档示例在这里,它是一个非常大的文档,所以我只包含了 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()
4

1 回答 1

1

如果没有一些示例数据,很难判断可能完全错误的地方,但根据您问题中的 Gremlin,有一些事情需要考虑:

  • shortestPath()-step 是一个OLAP 步骤,因此需要您定义gusing withComputer()- 可以在此处找到示例。
  • 我注意到您在每个查询中以两种不同的方式搜索起始顶点。在第一种情况下,您通过名为“id”的属性进行搜索,在第二种情况下,您通过顶点标识符(T.id在 中使用时引用has())进行搜索。也许没有正确找到最初的起始顶点?
  • 第二次遍历看起来是无效的,因为它试图做一个循环(即它有一个until()条件)但没有指定一个repeat()操作。

当我的遍历没有返回我期望的结果时,我会尝试将它们简化到我可以看到遍历在哪里过滤掉我期望的遍历的程度。换句话说,打开 Gremlin 控制台并连接您的图表。确保g.V("startVertexId")返回您期望的顶点。当对结果满意时,添加一个步骤,运行g.V("startVertexId").out()并验证它。继续使用该模式,直到找出结果没有返回的位置。您也可以使用profile()step 运行您的遍历,它应该向您显示遍历器正在过滤的位置,但有时通过将遍历分开并简化来更容易识别。

我使用您最近在问题中提供的数据测试了您的遍历,当我按照我的回答和评论中的建议进行调整时,我似乎在获得结果时没有问题:

gremlin> g.withComputer().V('WL10-054').shortestPath().with(ShortestPath.target, __.hasId('L10-029')).with(ShortestPath.distance, 'weight')
==>[v[WL10-054],v[L10-029]]
于 2020-04-09T10:42:19.783 回答