在格雷姆林搜索多属性的最佳方式是什么?



我想要一条来自顶点A,C,D,E,G,H,

我厌倦了以下代码

g.V().hasLabel('a').repeat(out().simplePath()).until(hasLabel('h')).
path().by(values('vehicle','time').fold()) 

我收到的输出

[[10.00,8.30,v1,v2],[10.30,9.00,9.30,v1,v2,v3],[11.00,9.30,10.00,v1,v2,v3],[1
1.30,10.00,10.30,v1,v2,v3],[12.00,11.00,v1,v3],[12.30,11.30,v1,v3]]

预期产出

[a:[10.00,v1],c:[11.00,v1],d:[11.30,v1],e:[12.00,v1],g:[12.30,v1],h:[1.00,v1]],[a:[8.30,v2],c:[9.00,v2],d:[9.30,v2],e:[10.00,v2],g:[11.00,v3],h:[11.30,v3]]

下面是一个示例图表

v1 = graph.addVertex(id,1,label,'a','vehicle','v1','time',10.00)
v2 = graph.addVertex(id,2,label,'b','vehicle','v1','time',10.30)
v3 = graph.addVertex(id,3,label,'c','vehicle','v1','time',11.00)
v4 = graph.addVertex(id,4,label,'d','vehicle','v1','time',11.30)
v5 = graph.addVertex(id,5,label,'e','vehicle','v1','time',12.00)
v7 = graph.addVertex(id,7,label,'g','vehicle','v1','time',12.30)
v8 = graph.addVertex(id,8,label,'h','vehicle','v1','time',1.00)
v1.addEdge('traveles',v3)
v3.addEdge('traveles',v4)
v4.addEdge('traveles',v5)
v5.addEdge('traveles',v7)
v7.addEdge('traveles',v8)
g.V(1).property(list,'vehicle','v2').property(list,'time',8.30)
g.V(3).property(list,'vehicle','v2').property(list,'time',9.00).property(list,'vehicle','v3').property(list,'time',9.30)
g.V(4).property(list,'vehicle','v2').property(list,'time',9.30).property(list,'vehicle','v3').property(list,'time',10.00)
g.V(5).property(list,'vehicle','v2').property(list,'time',10.00).property(list,'vehicle','v3').property(list,'time',10.30)
g.V(7).property(list,'vehicle','v3').property(list,'time',11.00)
g.V(8).property(list,'vehicle','v3').property(list,'time',11.30)

谁能帮我

如果您的属性有多个值,则值步骤将返回所有值。假设您有两个值,您可以使用limittail选择一个或另一个。

gremlin> g.addV('test').property(list,'x',1).property(list,'x',2)
==>v[61316]
gremlin> g.V(61316).values('x')
==>1
==>2
gremlin> g.V(61316).values('x').tail(1)
==>2
gremlin> g.V(61316).values('x').limit(1)
==>1 

如果您有 2 个以上的值,并且需要从列表或集中选择一个,则可以使用range步骤选择该值。

gremlin> g.V(61316).property(list,'x',5)
==>v[61316]
gremlin> g.V(61316).values('x')
==>1
==>2
==>5
gremlin> g.V(61316).values('x').range(1,2)
==>2  

所有这些都表明,如果您可以使用一些示例数据编辑您的问题,这将有助于给出更好的答案,因为您的数据模型似乎每个属性都有很多值,因此 Gremlin 正在做您要求它做的事情。

此外,在您的示例中,您通过顶点的标签查找顶点,根本不测试值。您可以像测试单个属性一样测试多属性

gremlin> g.V().has('x',2)
==>v[61316

编辑以添加:

使用这些技术,您可以将path语句更改为如下所示的内容:

path().
by(union(label,
values('time').limit(1),
values('vehicle').limit(1)).fold())

最新更新