Package: dbis-relational-algebra
DBIS Relational AlgebraThis library provides a Python implementation of therelational algebra.FeaturesCreate expressions of the relational algebra in python.Load data from SQLite tables.Evaluate expressions on the data.Convert these expressions to text in LaTeX math mode.Convert a relation / the result of an expression to a Markdown table.InstallationInstall via pip:pipinstalldbis-relational-algebraUsageOverview of supported operatorsCross Product / Cartesian Product (*)Difference (-)Division (/)Intersection (&)Left SemijoinNatural JoinProjectionRenameRight SemijoinSelectionTheta JoinUnion (|)The set operators Union, Intersection, and Difference require the relations to beunion-compatible.FormulasFor the Theta Join and the Selection, a formula is used to specify the join or selection condition. These formulas can be created using the following operators:AndOrNotEqualsGreaterEqualsGreaterThanLessEqualsLessThanIn the comparators, two values have to be specified. At least one of these values must be a pythonstr, which references a column of the relation.Loading data & Evaluating an expressionTo load data, anSQLite connectioncan be used (recommended). This connection must be passed to the relational algebra expression for the evaluation.It is also possible to load a relation with data by hand (not recommended):relation=Relation(name="R")relation.add_attributes(["a","b","c"])relation.add_rows([[1,2,3],[4,5,6],[7,8,9],])An expression can be created by using the operators and formulas listed above. The expression can then be evaluated on the data:# Cross Product RxS, see aboveexpression=Relation("R")*Relation("S")result=expression.evaluate(sql_con=connection)# Theta Join R.a = S.b, see aboveexpression=ThetaJoin("R","S",Not(Equals("R.a","S.b")))result=expression.evaluate(sql_con=connection)The rows and column names of a relation (result) are accessible using the following attributes:result.attributes# list of column names (str)result.rows# set of rows (tuple)Best practices:After joining two relations or the cross product of two relations, you should always give column names that appear in both relations a new distinct name.After joining two relations, the cross product of two relations, or some set operation on two relations, you should always give the resulting relation a new distinct name.When referencing a column in a comparator, it is recommended that this column should be referred to using a detailed description, i.e. refer to columnaof relationRas"R.a"instead of"a".Developer NotesA few design choices were made:Internally, the data is stored in apandas DataFrame. This accelerates the relational algebra operators greatly.In relational algebra, a columnafrom a relationRcan be referred to asaandR.a. Internally, the column name is always stored using the full name, i.e.R.a. This is done to avoid ambiguities when a columnais present in multiple relations.When joining two relations (or also cross product), the relational algebra provides no guidelines on how the resulting relation should be named. Thus, ifais a column of relationR, joining relationsRandSresults in a relation, whereR.aandS.amight refer to this columna(depending on ifaalso references a column inS). Thus, generally speaking, joining two relationsRandSwill internally result in a relation namedR+S, and the columnR.awill now be namedR+S.a(if there is no columnS.a).