使用可以从下面的代码创建的示例图表,如何获取一段时间内停在不同位置的唯一车辆的数量?我需要解决方案来包含来自其他节点的信息,正如我的查询尝试中所包含的那样。
用于创建图表的代码(使用来自此处的 Tinkerpop 3.7.2):
// A graph of vehicles parked in parking slots
g = TinkerGraph.open().traversal();
// three parking locations, each with 3 slots
for (parking in ['Mayfair', 'Euston', 'GareDuNord']) {
g.addV('parking').property('name', parking).iterate();
for (slot = 1; slot < 4; slot++) {
var slotName = String.format('%s %s', parking, slot);
g.addV('slot').property('name', slotName).
addE('hasSlot').from(__.V().has('parking', 'name', parking)).iterate();
}
}
// the parking locations are in two different cities
g.addV('city').property('name', 'London').addE('hasParking').to(__.V().has('parking', 'name', 'Mayfair'));
g.V().has('city', 'name', 'London').addE('hasParking').to(__.V().has('parking', 'name', 'Euston'));
g.addV('city').property('name', 'Paris').addE('hasParking').to(__.V().has('parking', 'name', 'GareDuNord'));
// see all the parking places and slots:
// g.V().hasLabel('parking').bothE().elementMap()
// we have 3 vehicles that can park, and three points in time
locationMaps = [
'v1': ['Mayfair 1', 'Euston 2', 'GareDuNord 3'],
'v2': ['Mayfair 2', 'Mayfair 3', 'Mayfair 1'],
'v3': ['Mayfair 3', null, 'Euston 1']
]
for (lMap in locationMaps) {
vehicleName = lMap.key;
g.addV('vehicle').property('name', vehicleName).iterate();
locations = lMap.value;
t = 1;
for (locationName in locations) {
if (locationName != null) {
g.V().has('vehicle', 'name', vehicleName).
addE('parkedAt').to(__.V().has('slot', 'name', locationName)).
property('time', t).iterate();
}
t += 1;
}
}
// all the parking events
// g.E().hasLabel('parkedAt').elementMap()
这是我迄今为止最大的努力:
// how to get counts of distinct vehicles parked in all parking locations in a city during an interval?
g.V().hasLabel('city').
out('hasParking').
out('hasSlot').
inE('parkedAt').has('time', P.lte(2)).has('time', P.gte(1)).
project('city', 'parking', 'vehicle').
by(inV().in('hasSlot').in('hasParking').values('name')).
by(inV().in('hasSlot').values('name')).
by(outV().values('name')).
dedup()
// this is output:
// ==>[city:London,parking:Mayfair,vehicle:v1]
// ==>[city:London,parking:Mayfair,vehicle:v2]
// ==>[city:London,parking:Mayfair,vehicle:v3]
// ==>[city:London,parking:Euston,vehicle:v1]
// but I want this:
// ==>[city:London,parking:Mayfair,count:3]
// ==>[city:London,parking:Euston,count:1]
此查询获取不同组合的列表,但如何获取每个城市和停车位的计数?
我还尝试使用
path()
收集所需的数据,如下所示:
g.V().hasLabel('city').
out('hasParking').
out('hasSlot').
inE('parkedAt').has('time', P.lte(2)).has('time', P.gte(1)).
outV().
path().
by('name'). // city
by('name'). // parking
by(constant('')). // slot - not wanted
by(constant('')). // vehicle-parkedAt->slot edge - not wanted
by('name'). // vehicle
dedup()
这给出了非常相似的结果(没有映射键,我更愿意保留它)。但我仍然不知道如何在不丢失城市或停车详细信息的情况下计算独特的车辆。同样在实际用例中,有时我们需要来自单个路径步骤的多条信息(您如何做到这一点?)。
查询将使用 gremlin-python 在 JanusGraph 服务器上运行。在此设置中,有些功能无法按预期工作,尤其是标签无法索引,因此从
g.V().hasLabel('vehicle')
开始将是一个坏主意。我很确定 lambda 也不可用。我们还有其他困难,但不能说它们是真正的差异还是只是我们缺乏理解。
是的,这太直白了,令人尴尬。关键是按我想保留的两个地图键进行分组,并且有一个方便的
groupCount()
使其变得更加容易。像这样:
g.V().hasLabel('city').
out('hasParking').
out('hasSlot').
inE('parkedAt').has('time', P.lte(2)).has('time', P.gte(1)).
project('city', 'parking', 'vehicle').
by(inV().in('hasSlot').in('hasParking').values('name')).
by(inV().in('hasSlot').values('name')).
by(outV().values('name')).
dedup().
groupCount().
by(select('city', 'parking')).
unfold()