2016-07-12 17 views
0

Ich erhalte die Daten von einer Simulation im folgenden Format: Wie zu sehen ist, dass vorläufig gibt es zwei Autos, die von Street 7 zu Street gehen 11 (wenn sie zahlreiche Zonen durchqueren, in denen Sensoren angebracht sind, um die Bewegung zu überwachen).Congestion Control Query für Autos auf der Straße mit Esper Query Language

Jetzt möchte ich ein Signal stoppen, wenn der späteste Zeitunterschied zwischen Auto # 1 und Auto # 2 nur 3 Sekunden oder weniger ist. Wie kann ich das in der Esper-Abfragesprache tun? Ich muss eine Abfrage für komplexe Ereignisverarbeitung schreiben, die mich ein Ereignis generieren wird, sobald die obige Bedingung erfüllt ist. Wie aus den Daten ersichtlich ist, ist zu Beginn der Zeitpunkt, an dem der erste Wagen in die Straße Nr. 7 fährt, 42500, während der zweite in der Straße Nr. 7 42508 ist, was den Zeitunterschied von 8 Sekunden ergibt.

{ time: 42500, 
     location: { Zone: 'Z3', Street: 'Street#7' }, 
     carID: 'car#1' } 
    --------------------------------------- 
    { time: 42502, 
     location: { Zone: 'Z5', Street: 'Street#7' }, 
     carID: 'car#1' } 
    --------------------------------------- 
    { time: 42502, 
     location: { Zone: 'Z1', Street: 'Street#8' }, 
     carID: 'car#1' } 
    --------------------------------------- 
    { time: 42504, 
     location: { Zone: 'Z4', Street: 'Street#8' }, 
     carID: 'car#1' } 
    --------------------------------------- 
    { time: 42505, 
     location: { Zone: 'Z5', Street: 'Street#8' }, 
     carID: 'car#1' } 
    --------------------------------------- 
    { time: 42505, 
     location: { Zone: 'Z1', Street: 'Street#9' }, 
     carID: 'car#1' } 
    --------------------------------------- 
    { time: 42507, 
     location: { Zone: 'Z4', Street: 'Street#9' }, 
     carID: 'car#1' } 
    --------------------------------------- 
    { time: 42508, 
     location: { Zone: 'Z3', Street: 'Street#7' }, 
     carID: 'car#2' } 
    --------------------------------------- 
    { time: 42508, 
     location: { Zone: 'Z5', Street: 'Street#9' }, 
     carID: 'car#1' } 
    --------------------------------------- 
    { time: 42508, 
     location: { Zone: 'Z1', Street: 'Street#10' }, 
     carID: 'car#1' } 
    --------------------------------------- 
    { time: 42509, 
     location: { Zone: 'Z4', Street: 'Street#10' }, 
     carID: 'car#1' } 
    --------------------------------------- 
    { time: 42509, 
     location: { Zone: 'Z5', Street: 'Street#7' }, 
     carID: 'car#2' } 
    --------------------------------------- 
    { time: 42509, 
     location: { Zone: 'Z1', Street: 'Street#8' }, 
     carID: 'car#2' } 
    --------------------------------------- 
    { time: 42511, 
     location: { Zone: 'Z5', Street: 'Street#10' }, 
     carID: 'car#1' } 
    --------------------------------------- 
    { time: 42511, 
     location: { Zone: 'Z1', Street: 'Street#11' }, 
     carID: 'car#1' } 
    --------------------------------------- 
    { time: 42511, 
     location: { Zone: 'Z4', Street: 'Street#8' }, 
     carID: 'car#2' } 
    --------------------------------------- 
    { time: 42512, 
     location: { Zone: 'Z4', Street: 'Street#11' }, 
     carID: 'car#1' } 
    --------------------------------------- 
    { time: 42512, 
     location: { Zone: 'Z5', Street: 'Street#8' }, 
     carID: 'car#2' } 
    --------------------------------------- 
    { time: 42512, 
     location: { Zone: 'Z1', Street: 'Street#9' }, 
     carID: 'car#2' } 
    --------------------------------------- 
    { time: 42513, 
     location: { Zone: 'Z5', Street: 'Street#11' }, 
     carID: 'car#1' } 
    --------------------------------------- 
    { time: 42513, 
     location: { Zone: 'Z1', Street: 'Street#12' }, 
     carID: 'car#1' } 
    --------------------------------------- 

Antwort

0

Das klingt ein bisschen wie ein für Auto von Veranstaltungen teilnehmen 1 mit Ereignissen des Autos 2. Die Frage ist dann, welche Teilmenge von Ereignissen zu verbinden. Der Anwendungsfall scheint eine gewisse Geschichte von Straßen zu bewahren, die von jedem Auto besucht wurden. Dazu könnten wir ein Längenfenster oder ein eindeutiges Fenster oder eine Union dieser Fenster verwenden. Verwenden Sie ein Längenfenster, das die letzten 10 Straßen oder Ereignisse berücksichtigt. Zum Beispiel eine Abfrage wie diese:

select * from Event(carID="car#1").win:length(20) as car1, Event(carID="car#2").win:length(20) as car2 where Math.abs(car1.time-car2.time) > 3 and car1.Location.Street = car2.Location.Street 
+0

Hallo, vielen Dank für Ihre Hilfe. Aber nur noch ein Hinweis benötigt, da Auto # 1 und Auto # 2 dynamische IDs sind, wie kann ich diese auswählen ??? Ich möchte es nicht speziell hart codieren. – Umer

+0

Wählen Sie eindeutige CarID aus CarEvent.win: time_length_batch (10, 100). Wie würde ich deine Abfrage nach dieser verwenden? – Umer

+0

Wählen Sie * aus CarEvent.win:length(20) als CARS, CarEvent.win:length(20) als CARS_COPY aus, wobei CARS.CARID! = CARS_COPY.CARID UND (CARS.Location.Street = CARS_COPY.Location.Street AND Math. abs (CARS.time-CARS_COPY.time)> 3) ??? – Umer