<commit_before><img src="https://raw.githubusercontent.com/rmagen/unipop/master/docs/images/unipop-logo.png" width=150/>

# Unipop
Run Graph queries on your existing databases.

Most organisations have multiple sources of data: RDBMSs, Document Stores, KV Stores, special enterprise software, filesystems, etc. Usually you'll have a whole bunch of different ones. 

Of course there's nothing wrong with diversity (different tools for different jobs...), but spreading data around makes it hard to query and to reason about the relationships in your data.

Unipop does not store data. Unipop connects to your databases, creates a model of your data and the relationships between your data, and enables you to easily query it using Gremlin.

[Tinkerpop Gremlin](http://tinkerpop.incubator.apache.org/docs/3.0.1-incubating/) is a functional language that enables easy querying of data modeled as a graph.

There are other projects with similar goals as Unipop ([Drill](http://drill.apache.org/), [Dremel](http://research.google.com/pubs/pub36632.html)).
These projects utilize SQL as their query language, which is fine for simple queries, but can quickly become a [JOIN nightmare](http://sql2gremlin.com/#_recommendation) when making complicated queries.
OTOH, Gremlin enables a very easy and natural way to query your data.

# Getting Sterted
**TBD**

# Configuring the Schema
**TBD**

# Customizing & Extending Unipop
**TBD**



<commit_msg>Rewrite README with a better explanation of Unipop. #13<commit_after># <img src="https://raw.githubusercontent.com/rmagen/unipop/master/docs/images/unipop-logo.png" width=70/> Unipop

**This project is in active development. The first stable version will be released soon.**

Most organisations have their data spread out in multiple data stores
- RDBMS
- Document Stores
- Key-Value Stores
- Column-Family Store
- Filesystems
- Enterprise tools & services
- etc

There are different reasons for this:
- Multiple projects
- NoSql "Hybrid" Architectures
- Multiple application versions
- Legacy Databases

Unfortunately, this makes it hard to query and reason about the relationships in your data.
Unipop offers a solution in the form of a **Federation** / **Data-Virtualization** platform.

### Why use Unipop?
There are other projects with similar goals
([Drill](http://drill.apache.org/), [Denodo](http://www.denodo.com/en), [Dremel](http://research.google.com/pubs/pub36632.html), etc.)

Usually these projects provide SQL as their querying API. SQL is fine for many use-cases, but can also pose some difficulties and obstacles:
- Hard-structured schemas
- Complicated relationship handling (i.e. [JOIN Hell](http://sql2gremlin.com/#_recommendation))
- Long, unreadable queries (e.g. Nested queries)
- Fully declarative, thus confining queries to very specific structures (versus a functional, "pipe-line" based language)
- More...

Unipop uses [Gremlin](http://tinkerpop.apache.org/gremlin.html) as its default query language.
Gremlin is a functional query language for graphs, providing an easy and natural way to query your data.


### Getting started

#### Setup
- Console - a local instance with an interactive Shell for issuing queries.
- Server - a web server with WebSocket & HTTP APIs. Includes drivers for JS, TS, PHP, Python, Java, Go, Scala, .Net.
- Embedded - run Unipop inside any JVM based application.

#### Configure
Add your data sources to Unipop's configuration. Configuring a source includes mapping its schema to a "property graph" (vertices & edges).
Unipop is built in an extensible way, enabling many different mapping options.

#### Query
- [Gremlin](http://tinkerpop.apache.org/gremlin.html)
- [SPARQL](https://github.com/dkuppitz/sparql-gremlin)
- [SQL](https://github.com/twilmes/sql-gremlin)


### Advanced

#### Customizing & Extending Unipop
**TBD**

#### How it works
Technical details.
**TBD**

#### Contributing
**TBD**
{'fraction_non_alphanumeric': 0.09902514109799897, 'fraction_numerical': 0.005643919958953309, 'mean_word_length': 4.626262626262626, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 4, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1808104', 'n_tokens_mistral': 1150, 'n_tokens_neox': 1082, 'n_words': 451}