Tinkergraph 遍历在我的图表上返回一个空数组 []
Tinkergraph traversal returning an empty array [] on my graph
我已经导入了一个图,可以确认顶点和边的数量与应该存在的数量相匹配。我 运行 图上的 simplepath() 计算,我的第一个问题是如何访问路径数组或映射 returned,我想我理解,因为我添加了 .toList 并将其打印到控制台但是我只是得到 [] 一个空数组?
我做错了什么我需要访问从路径返回的结果集?
我的查询是 运行 在 Java 而不是在 gramlin 控制台中是:
g.V().has("id", "FirstVertexIdValue").shortestPath().with(ShortestPath.target, __.has("id", "EndVertexIdValue")).with(ShortestPath.distance, "weight").toList();
我也 运行 以下但仍然 return 一个空数组:
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()
没有一些示例数据,很难说出什么可能是完全错误的,但根据您问题中的 Gremlin,这里有一些需要考虑的事项:
shortestPath()
步是一个OLAP step and therefore requires that you define g
using withComputer()
- an example can be found here.
- 我注意到您在每个查询中以两种不同的方式搜索起始顶点。在第一种情况下,您通过名为 "id" 的 属性 进行搜索,而在第二种情况下,您通过顶点标识符进行搜索(在
has()
中使用时引用为 T.id
)。也许没有正确找到初始起始顶点?
- 第二次遍历看起来无效,因为它试图进行循环(即它具有
until()
条件)但未指定 repeat()
操作。
当我的遍历没有 return 我期望的那样时,我会尝试将它们简化到可以看到遍历在哪里过滤掉我期望的遍历器的程度。换句话说,打开 Gremlin 控制台并连接图表。确保 g.V("startVertexId")
return 是您期望的顶点。当对结果满意时,添加一个步骤,运行 g.V("startVertexId").out()
并验证它。继续使用该模式,直到您发现您的结果未达到 return 的地方。您还可以 运行 使用 profile()
步骤进行遍历,它应该会向您显示遍历器过滤掉的位置,但有时通过将遍历分开并简化更容易识别。
我用你最近在问题中提供的数据测试了你的遍历,当我按照我的回答和评论中的建议进行调整时,我似乎没有问题获得结果:
gremlin> g.withComputer().V('WL10-054').shortestPath().with(ShortestPath.target, __.hasId('L10-029')).with(ShortestPath.distance, 'weight')
==>[v[WL10-054],v[L10-029]]
我已经导入了一个图,可以确认顶点和边的数量与应该存在的数量相匹配。我 运行 图上的 simplepath() 计算,我的第一个问题是如何访问路径数组或映射 returned,我想我理解,因为我添加了 .toList 并将其打印到控制台但是我只是得到 [] 一个空数组?
我做错了什么我需要访问从路径返回的结果集?
我的查询是 运行 在 Java 而不是在 gramlin 控制台中是:
g.V().has("id", "FirstVertexIdValue").shortestPath().with(ShortestPath.target, __.has("id", "EndVertexIdValue")).with(ShortestPath.distance, "weight").toList();
我也 运行 以下但仍然 return 一个空数组:
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()
没有一些示例数据,很难说出什么可能是完全错误的,但根据您问题中的 Gremlin,这里有一些需要考虑的事项:
shortestPath()
步是一个OLAP step and therefore requires that you defineg
usingwithComputer()
- an example can be found here.- 我注意到您在每个查询中以两种不同的方式搜索起始顶点。在第一种情况下,您通过名为 "id" 的 属性 进行搜索,而在第二种情况下,您通过顶点标识符进行搜索(在
has()
中使用时引用为T.id
)。也许没有正确找到初始起始顶点? - 第二次遍历看起来无效,因为它试图进行循环(即它具有
until()
条件)但未指定repeat()
操作。
当我的遍历没有 return 我期望的那样时,我会尝试将它们简化到可以看到遍历在哪里过滤掉我期望的遍历器的程度。换句话说,打开 Gremlin 控制台并连接图表。确保 g.V("startVertexId")
return 是您期望的顶点。当对结果满意时,添加一个步骤,运行 g.V("startVertexId").out()
并验证它。继续使用该模式,直到您发现您的结果未达到 return 的地方。您还可以 运行 使用 profile()
步骤进行遍历,它应该会向您显示遍历器过滤掉的位置,但有时通过将遍历分开并简化更容易识别。
我用你最近在问题中提供的数据测试了你的遍历,当我按照我的回答和评论中的建议进行调整时,我似乎没有问题获得结果:
gremlin> g.withComputer().V('WL10-054').shortestPath().with(ShortestPath.target, __.hasId('L10-029')).with(ShortestPath.distance, 'weight')
==>[v[WL10-054],v[L10-029]]