Process Mining Objects in Expression Language
QPR ProcessAnalyzer expression language is an object oriented language. This page lists all object types, and properties and functions that they have.
In the tables in this page, after the property or function name there is the type of the returned object in parenthesis. Asterisk (*) after the type means that the return value is an array of objects (multiple objects instead of one).
AttributeType
AttributeType properties | Description |
---|---|
CalculationExpression (String) | Expression used to calculate values for the calculated attribute. Value is null if the attribute is imported. |
Datatype (String) | Data type of the attribute. For imported attributes, the data type comes from the datasource (e.g. datatable column datatype). For calculated attributes, the data type is explicitly defined for the attribute (the actual data produced by the calculation expression must match with the attribute data type). |
Id (Integer) | AttributeType Id. It's generated by QPR ProcessAnalyzer when the model is loaded. |
EventLog (EventLog) | EventLog where the attribute belongs to. |
Name (String) | Attribute name. |
UniqueCount (Integer) | Returns the number of unique (different) values that this AttributeType contains in this EventLog (with filters applied). The result is same as Count(Values) except performance is better and memory consumption is lower. |
ValueOrigin (String) | Describes where the attribute values are coming from as follows:
An attribute may also be both, so the value is imported but there is also a calculation expression for the attribute. In that case, the attribute is considered calculated. In the calculation expression, the imported value can be used as an input. |
Values (String Array) | Returns an array of all unique values (duplicates removed) that this AttributeType contains in this EventLog (with filters applied). |
AttributeType functions | Parameters | Description |
---|---|---|
EventsHavingValue (Event*) |
|
Returns all Events that have the given value for this AttributeType. If the AttributeType is a case attribute, then all the returned events belong to a Case that has the specified value as the value of this case attribute. If the AttributeType is an event attribute, then all the returned Events have the specified value as the value of this event attribute. Examples: eventLog.EventAttributes.Where(Name=="SAP_User").EventsHavingValue("James") Returns: An array of events that have "James" as the value of "SAP_User" event attribute. eventLog.EventAttributes:EventsHavingValue("James") Returns: A hierarchical array of event attributes with each having a sub array of events that have "James" as the value of the parent event attribute. eventLog.CaseAttributes.Where(Name=="Region").EventsHavingValue("Dallas") Returns: An array of events that have "Dallas" as the value of their case's "Region" case attribute. eventLog.CaseAttributes:EventsHavingValue("Dallas") Returns: A hierarchical array of case attributes with each having a sub array of events that have "Dallas" as the value of the parent case attribute of their case. |
CasesHavingValue (Case*) |
|
Returns all Cases that have given value for this attribute. If the AttributeType is a case attribute, then all the returned Cases have the specified value as the value of this case attribute. If the AttributeType is an event attribute, then all the returned Cases have at least one Event that has the specified value as the value of this event attribute. Examples: eventLog.EventAttributes.Where(Name=="SAP_User").CasesHavingValue("James") Returns: An array of cases that have at least one event which has "James" as the value of "SAP_User" event attribute. eventLog.EventAttributes:CasesHavingValue("James") Returns: A hierarchical array of event attributes with each having a sub array of cases that have at least one event which has "James" as the value of the parent event attribute. eventLog.CaseAttributes.Where(Name=="Region").CasesHavingValue("Dallas") Returns: An array of cases that have "Dallas" as the value of "Region" case attribute. eventLog.CaseAttributes:CasesHavingValue("Dallas") Returns: A hierarchical array of case attributes with each having a sub array of cases that have "Dallas" as the value of the parent case attribute. |
Case
A case is a single execution instance of a process. A case consist of Events. Case can have CaseAttributes storing additional information of that case. A Case doesn't need to have Events in QPR ProcessAnalyzer.
Case properties | Description |
---|---|
Duration (Timespan) | Case duration, i.e. duration between Case start and Case end time. Case duration is zero for Cases having only one Event. |
EndTime (DateTime) | Case end time, i.e. timestamp of the last Event. |
EventLog (EventLog) | EventLog where the Case belongs to. |
Events (Event*) | All events in the Case in temporal order by event timestamp. |
FirstEvent (Event) | The first Event in the Case in temporal order. Better performing shortcut for Events[0]. |
FlowOccurrences (FlowOccurrence*) | All FlowOccurrences in the Case. |
Flows (Flow*) | All Flows the Case goes through. |
Id (Integer) | Case Id. Case id is generated by QPR ProcessAnalyzer when the model is loaded. |
LastEvent (Event) | The last Event in the Case in temporal order. Better performing shortcut for Events[Count(_) - 1]. |
Name (String) | Case name. The case name comes from the source data when data is imported to QPR ProcessAnalyzer. |
StartTime (DateTime) | Case start time, i.e. timestamp of the first Event. |
Variation (Variation) | Variation the Case belongs to. |
Case functions | Parameters | Description |
---|---|---|
AnalyzeConformance |
|
Checks whether the Case conforms with given DesignModel and reports a list of violations if the case doesn't conform. The function returns an array where the first item is the nonconformance reason as an integer. Next items in the array depends on the reasons, and thus there may be none or several further items in the array. The parameters are an optional key-value pairs containing additional settings for the conformance checking (see: allowed settings). Examples: Let("myConformanceModel", DesignModelFromXml(xml)); Let("myEventLog", EventLogById(1)); Let("cases", OrderBy(EventLogById(1).Cases, Name)); cases.( Let("analysis",AnalyzeConformance(myConformanceModel)), "" +(CountTop(analysis)==0) +((CountTop(analysis)>0) ? " (" +StringJoin("", ReplaceLeafValues( analysis, "i", i[0]==3?i[2]+"->"+i[3]:(i[0]==2?"DNF":""))) +")" :"") +": "+StringJoin("->",Events.Type.Name)) Returns: A report containing a line for each case (in filter having id 1) showing whether the Case conforms with the model (in xml variable) or not and if not, gives some information on why the conformance check failed for that case. |
Attribute (Object) |
attribute name (string) |
Returns case attribute value for a case attribute provided as a parameter. This function must be used when there are spaces in the case attribute name. If there are no spaces, syntax .attributeName can be used.
If the case attribute is not found, en error is given. |
Duration (Timespan) | Business calendar | Case duration (i.e. duration between Case start and Case end time) taking into account the provided business calendar. |
DurationBetweenEvents (Timespan) |
|
Returns duration between two specified events in the Case. Returns null, if the duration cannot be calculated in the following situations:
Several EventTypes for the starting and ending event can also be defined. Then the first occurred event is chosen if the occurrence index is positive, and the last occurred event is chosen, if the occurrence index is negative. When the 3. and 4. parameters are not defined, the first occurrence of the starting event is chosen and the last occurrence of the ending event. Parameters:
EventLogById(1).Cases[0].DurationBetweenEvents("Order confirmation", "Product returned"); Returns: Duration between the first "Order confirmation" and last "Product returned". EventLogById(1).Cases[0].DurationBetweenEvents("Order confirmation", "Product returned", 0, 0); Returns: Duration between the first "Order confirmation" and first "Product returned". EventLogById(1).Cases[0].DurationBetweenEvents(["Order confirmation", "Order received"], "Product returned"); Returns: Duration between the first "Order confirmation" or "Order received" (which one occurs first) and last "Product returned". EventLogById(1).Cases[0].DurationBetweenEvents("Order confirmation", "Order confirmation", 0, 1); Returns: Duration between the first and second "Order confirmation". EventLogById(1).Cases[0].DurationBetweenEvents("Order confirmation", "Order confirmation", 0, 1, myBusinessCalendar1); Returns: Duration between the first and second "Order confirmation". EventLogById(1).Cases[0].DurationBetweenEvents("Order confirmation"); Returns: Duration between the first and last "Order confirmation". |
EventCountByType (Integer) |
|
Returns the number of Events in the Case, that are of given type(s). Can be either EventType object, a string identifying the name of the event type, or an array of EventType objects and event type name strings. Examples: EventLogById(1).EventCountByType("Invoice") Returns: Number of "Invoice" type of events in the event log with filter id = 1 EventLogById(1).EventCountByType(EventLog.EventTypes.Where(Name=="Invoice")) Returns: Number of "Invoice" type of events in the event log with filter id = 1 EventLogById(1).EventCountByType(["Invoice", "Shipment"]) Returns: Number of "Invoice" and "Shipment" type of events in the event log with filter id = 1 EventLogById(1).EventCountByType(EventLog.EventTypes.Where(Name=="Invoice" || Name=="Shipment")) Returns: Number of "Invoice" and "Shipment" type of events in the event log with filter id = 1 |
EventsByType (Event*) |
|
Returns all Events in the Case which are of given type(s). The parameter can be either an EventType object or EventType name as a string. The parameter can also be an array of multiple EventType objects or EventType names. Examples: case.EventsByType("Invoice") Returns: Array of events having event type named "Invoice". case.EventsByType((EventLog.EventTypes.Where(Name=="Invoice"))[0]) Returns: Array of events having event type named "Invoice". case.EventsByType(["Invoice", "Shipment"]) Returns: Array of events having event type named "Invoice" or "Shipment". case.EventsByType(EventLog.EventTypes.Where(Name=="Invoice" || Name=="Shipment")) Returns: Array of events having event type named "Invoice" or "Shipment". |
EventTimestampsByType (DateTime*) |
|
Returns timestamps of all Events of given type in the Case. Example: case.EventTimestampsByType("Invoice") Note: The result is same than (except the first one is faster to calculate): case.EventsByType("Invoice").Timestamps |
FlowOccurrencesByType (FlowOccurrence*) |
|
Returns all FlowOccurrences of this case which are of given type. The parameter can be either a Flow object or an integer identifying the id of the flow occurrence. Examples: case.FlowOccurrencesByType(EventLog.Flows[0]) Returns: All the flow occurrences in the case belonging to the first flow in event log. case.FlowOccurrencesByType(EventLog.Flows[0].Id) Returns: All the flow occurrences in the case belonging to the first flow in event log. |
IsConformant (Boolean) |
|
Checks whether the Case conforms with given ConformanceModel. Returns true if the Case conforms with the given design model. The parameters are an optional key-value pairs containing additional settings for the conformance checking (see: allowed settings). Examples: Let("myConformanceModel", DesignModelFromXml(xml)); Let("myEventlog", EventLogById(1)); Count(myEventlog.Cases.Where(IsConformant(myConformanceModel))) / Count(myEventlog.Cases) Returns: Proportion of conforming cases in the EventLog created for filter having id 1. |
Event
Event properties | Description |
---|---|
Case (Case) | Case the event belongs to. |
EventLog (EventLog) | EventLog where the Event belongs to. |
Id (Integer) | Event id. It's generated by QPR ProcessAnalyzer when the model is loaded. |
IndexInCase (Integer) | Index number of the Event in the case (in temporal order). The first event has index number 0, the second event has index number 1 and so on. |
IncomingFlowOccurrence (FlowOccurrence) | Preceding FlowOccurrence of the Event. |
NextInCase (Event) | Temporally next event in the case. For the last event, return EMPTY. |
OutgoingFlowOccurrence (FlowOccurrence) | The following FlowOccurrence of the Event. |
PreviousInCase (Event) | Temporally previous event in the case. For the first event, return EMPTY. |
Timestamp (DateTime) | Timestamp of the Event. |
Type (EventType) | EventType of the Event. |
TypeName (String) | Name of the EventType of the Event. Result is the same as with Type.Name, but the TypeName shortcut has better performance. |
Event functions | Parameters | Description |
---|---|---|
Attribute (object) |
|
Return event attribute value for an event attribute provided as a parameter. This function must be used when there are spaces in the event attribute name. If there are no spaces, syntax .attributeName can be used.
If the case attribute is not found, en error is given. |
EventLog
EventLog is a list of events and information related to them, such as event and case attributes. Each Model consists of an EventLog, called model EventLog, containing all the events in the Model. In addition, there are filtered EventLogs which are subsets of a certain Model EventLog. The filter EventLog is created by applying a filter (set of filter rules) to model EventLog.
EventLog properties | Description |
---|---|
CaseAttributes (AttributeType*) | CaseAttributes in the EventLog returned in the alphabetical order. Note that filtering affects which attributes exist in the EventLog. |
Cases (Case*) | Cases in the EventLog. |
CaseCount (Integer) | Number of cases in the EventLog. |
EventAttributes (AttributeType*) | EventAttributes in the EventLog returned in the alphabetical order. Note that filtering affects which attributes exist in the EventLog. |
EventCount (Integer) | Number of events in the EventLog. |
Events (Event*) | Events in the EventLog. |
EventTypeNames (String*) |
Returns all event type names in the model EventLog in the alphabetical order. For filter EventLogs, the model EventLog information is returned (i.e. filter rules are not applied for the list of event types). When case level permissions are in use, all event type names in the model are still returned (i.e. allowing user to see event type names for which user cannot see events). |
EventTypes (EventType*) | EventTypes in the EventLog. |
Flows (Flow*) | Flows that the part of the EventLog. |
Id (Integer) | EventLog Id. |
Model (Model) | Model where the EventLog belongs. |
ModelEventLog (EventLog) | Returns an EventLog representing all the events in the QPR ProcessAnalyzer model (where the current EventLog resides). |
Variations (Variation*) | Variations that are in the EventLog |
EventLog functions | Parameters | Description |
---|---|---|
CaseByName (Case) | Case name (String) | Gets the Case from the EventLog by the case id (case name). If the case is not found, null is returned. This function is a faster performing way to find a case by id than the Where function. |
EventsByType (Event*) |
|
Returns all Events in the EventLog which are of given type(s). The parameter can be either an EventType object or EventType name as a string. The parameter can also be an array of multiple EventType objects or EventType names. |
EventCountByType (Integer) |
|
Returns the number of Events belonging to the Case which are of given type(s). Can be either EventType object, a string identifying the name of the event type, or an array of EventType objects and event type name strings. Examples: case.EventCountByType("Invoice") Returns: Number of "Invoice" type of events in the case. case.EventCountByType(EventLog.EventTypes.Where(Name=="Invoice")) Returns: Number of "Invoice" type of events in the case. case.EventCountByType(["Invoice", "Shipment"]) Returns: Number of "Invoice" and "Shipment" type of events in the case. case.EventCountByType(EventLog.EventTypes.Where(Name=="Invoice" || Name=="Shipment")) Returns: Number of "Invoice" and "Shipment" type of events in the case. |
EventsWindow (Event*) |
|
Returns a range of events in the EventLog between the provided first index and maximum count. Events are ordered primarily based on cases and secondarily based on event timestamps within the case. If the specified window is partly or completely outside of the actual events, the result will only include those events that fit into the specified window. Parameters:
Examples: EventLogById(1).EventsWindow(0, 10) Returns: 10 first events. EventLogById(1).EventsWindow(10, 10) Returns: 10 events starting from event at index 10. EventLogById(1).EventsWindow(-10, 10) Returns: 10 last events. |
FindRootCauses (DataFrame) |
Settings (Dictionary) |
Performs the root causes analysis for for the eventlog based on the given settings, and returns results as a DataFrame. Root causes are features that correlate with the investigate phenomemnon in the selected set of cases. Following parameter can be used:
The result is a DataFrame where each row represents an individual root cause. Identified root causes are features that are common among a set of cases (i.e. all cases where Region is Dallas). Root causes are returned in the order or importance, and either positively or negatively correlated, or both (determined by the correlation setting). The columns in the DataFrame describe the type of the root cause and different kind of volume data regarding that set of cases. There are the following columns:
In the above formulas, TotalSelected are the number of cases in the eventlog that belong to the selected cases (i.e. the 'Selection parameter). TotalEventLog are the number of cases in the eventlog where the root causes are searched from. EventLogById(123).FindRootCauses(#{ "Selection": #{ "Type": "CaseAttributeValue", "Attribute": "Region", "Values": ["Dallas", "Austin", "New York"] }, "CaseAttributeTypes": ["Region", "Account Manager"], "MaximumRowCount": 20, "Correlation": "positive" // }); |
Function | Parameters | Description |
---|---|---|
EventLogById |
FilterId (Integer) |
Returns EventLog object corresponding to the provided filter Id. |
EventType
EventTypes are individual activities in processes, i.e. EventTypes are the boxes in the process flowchart.
EventType properties | Description |
---|---|
Cases (Case*) | Cases that have events of this EventType. |
Count (Integer) | Number of Events that have this EventType. |
EventLog (EventLog) | EventLog where the EventType belongs to. |
Events (Event*) | Events of that EventType. |
Id (Integer) | EventType Id. It's generated by QPR ProcessAnalyzer when the model is loaded. |
IncomingFlows (Flow*) | All Flows that start from the EventType. |
Name (string) | EventType name. |
OutgoingFlows (Flow*) | All Flows that end to the EventType. |
UniqueCount (Integer) | Number of Cases having events of this EventType. |
Flow
Flow is a combination of two EventTypes where there are FlowOccurrences between them. Unlike FlowOccurrencies, a Flow is not related to a single case. Flowchart shows Flows and EventTypes (not FlowOccurences or Events). In a Case, there may be several FlowOccurrences of a single Flow.
Flow properties | Description |
---|---|
AverageDuration (Timespan) | Returns the average duration of Flow within the EventLog, i.e. average duration of the related FlowOccurrence durations. |
Cases (Case*) | Cases that contain the flow, i.e. there is a flow occurrence between Flow's starting and ending events. |
DurationStandardDeviation (Timespan) | Returns the standard deviation of the Flow duration within the EventLog, i.e. standard deviation of the related FlowOccurrence durations. |
EventLog (EventLog) | EventLog where the Flow belongs to. |
FlowOccurrences (FlowOccurrence*) | Flow occurrences the flow belongs to. |
From (EventType) | EventType from which this Flow starts. Value is null for starting flows. |
Id (Integer) | Flow Id. It's generated by QPR ProcessAnalyzer when the model is loaded. |
MedianDuration (Timespan) | Returns the median duration of Flows within the EventLog, i.e. median duration of the related FlowOccurrence durations. |
Name (String) | Identifying name of the Flow. |
To (EventType) | EventType to which this Flow ends. Value is null for ending flows. |
Flow functions | Parameters | Description |
---|---|---|
AverageDuration (Timespan) |
Business calendar |
Same as the AverageDuration property (documented in the above table), but the duration is instead based on the provided business calendar. flow1.AverageDuration(businessCalendar1) |
DurationStandardDeviation (Timespan) |
Business calendar |
Same as the DurationStandardDeviation property (documented in the above table), but the duration is instead based on the provided business calendar. |
MedianDuration (Timespan) |
Business calendar |
Same as the MedianDuration property (documented in the above table), but the duration is instead based on the provided business calendar. |
FlowOccurrence
FlowOccurrence represents a transition from an event to another event in a case. Thus, FlowOccurrence is related to a single case. There is also a FlowOccurrence from the "start" of the case to the first event of the case, and a FlowOccurrence from the last event of the case to the "end" of the case. Corresponding flow is visible in BPMN kind of flowcharts showing separate start and event icons. Thus, there are one more FlowOccurrences in a case than the number of events.
FlowOccurrence properties | Description |
---|---|
Case (Case) | Case the FlowOccurrence belongs to. |
Duration (Timespan) | Returns the duration of the FlowOccurrence. null is returned if the FlowOccurrence represents Case start or end. |
EventLog (EventLog) | EventLog where the FlowOccurrence belongs to. |
Flow (Flow) | Corresponding Flow of the FlowOccurrence. |
From (Event) | Event from where the FlowOccurrence begins. Value is null for starting flow occurrences. |
Id (Integer) | FlowOccurrence Id. It's generated by QPR ProcessAnalyzer when the model is loaded. |
Name (String) | Identifying name of the FlowOccurrence. |
OccurrenceIndex (Integer) | Occurrence index describes how many times the Flow of the FlowOccurrence has occurred in the case until that point. The first time has occurrence index 0. When a case goes through a certain flow the second time, the occurrence index is 1. |
To (Event) | Event to where the FlowOccurrence ends. Value is null for ending flow occurrences. |
FlowOccurrence functions | Parameters | Description |
---|---|---|
Duration (Timespan) |
Business calendar |
Returns the FlowOccurrence duration based on the provided business calendar. |
Variation
Variation is unique sequence of events in a case. A case belongs to a single variation.
Variation properties | Description |
---|---|
CaseCount (Integer) | Number of Cases belonging to the Variation. |
Cases (Case*) | Cases that belong to the Variation. |
EventLog (EventLog) | EventLog where the Variation belongs to. |
EventTypeCount (Integer) | Number of Events in the Variation. |
EventTypes (EventType*) | EventTypes belonging to the Variation. |
Flows (Flow*) | Flows that belong to the Variation. |
Id (Integer) | Variation Id. It's generated by QPR ProcessAnalyzer when the model is loaded. |
UniqueEventTypeCount (Integer) | Number of different (unique) EventTypes in the Variation. |
Variation functions | Parameters | Description |
---|---|---|
AnalyzeConformance |
|
Same as the IsConformant function for Case objects, but the check is done for the Variation. Example: Let("cm", DesignModelFromXml(xml)); Let("el", EventLogById(1)); Let("vars", OrderByDescending(EventLogById(1).Variations, CaseCount)); vars.( Let("analysis",AnalyzeConformance(cm)), "" +CaseCount +" * " +(CountTop(analysis)==0) +((CountTop(analysis)>0) ? " (" +StringJoin("", ReplaceLeafValues( analysis, "i", i[0]==3?i[2]+"->"+i[3]:(i[0]==2?"DNF":""))) +")" :"") +": "+StringJoin("->",EventTypes.Name)) Returns: A simple report containing a line for each variation (in filter having id 1) showing also whether the variation conforms with the model (in xml variable) or not and if not, gives some information on why the conformance check failed for that variation. |
IsConformant (Boolean) |
|
Same as the IsConformant function for Case objects, but the check is done for the Variation. Example: Let("el", EventLogById(1)); Count(el.Variations.Where(IsConformant(cm))) / Count(el.Variations) Returns: Proportion of conforming variations in event log created for filter with id 1. |