Hello list, I'm in the process of writing an application which uses cassandra as a "storage" backend. The application is a graph database and it's supposed to be a baseline application for further development in the field.
The idea is to implement a property graph: a multigraph (multiple edges connecting two vertices are possible) with properties in the form of name/value for edges and vertices. The idea is to traverse the graph with queries like "give me all the women that are liked by men i know", something like: Vertex[name=claudio]=>outgoingEdge[type=knows]=>Vertex[gender=male]=>outgoingEdge[type=likes]=>Vertex[gender=female]. This is basically a step by step expansion/filtering based on properties. In my architecture my application-logic node is coupled with the cassandra node storing its data. I'd like to have some kind of "atomic set" of data that is "granted" to be stored on the same cassandra node (in my case the vertex, its adj list, its properties, its edges and their properties), so that i can issue the required filtering and expansion to a particular node which will issue the logic behind it (and i can route such request with the same logic cassandra routes its requests). This is in an effort to (a) minimize network i/o (i'd be able to send the query token to the application node which would issue a local get to its local cassandra) and (b) distribute computation (i'd be able to distribute filtering between all the nodes storing for example the node's neighborhood). This is still not optimal, but it would be a good start. For this reason i thought about a datamodel that has composite keys: vertexid and edgeid are uuids while propertyname is a string. CF vertices { vertexid_propertyname { propertyvalue: null } } CF edges { vertexid_[in|out]_propertyname_edgeid { propertyvalue: othervertexid } } With this datamodel i could easily and efficiently issue slices and ranges to cassandra with the equality predicates on properties i need. What i need now is to partition my data on the prefix "vertexid_". Such a datamodel does have a concept of "ascending ordering", so i thought about OPP, but to my understanding OPP does not grant that all the data starting with the same prefix will end up in the same cassandra node, but only some of it. My set of data about a vertex could still be split between two cassandra nodes in case the token ends up being a key in the middle of the set, right? What i require exactly is: (1) to have all the rows belonging to the same vertexid (which is a uuid) on the same cassandra node. Can i achieve this? (2) given this partitioning, know the IP of the cassandra node storing that vertex data, from outside of cassandra. This is the logic cassandra uses to route requests for keys and i have to access it from outside. Can anybody comment about these? Thanks Claudio Unit Research & Development - Analyst TIS innovation park Via Siemens 19 | Siemensstr. 19 39100 Bolzano | 39100 Bozen Tel. +39 0471 068 123 Fax +39 0471 068 129 claudio.marte...@tis.bz.it http://www.tis.bz.it Short information regarding use of personal data. According to Section 13 of Italian Legislative Decree no. 196 of 30 June 2003, we inform you that we process your personal data in order to fulfil contractual and fiscal obligations and also to send you information regarding our services and events. Your personal data are processed with and without electronic means and by respecting data subjects' rights, fundamental freedoms and dignity, particularly with regard to confidentiality, personal identity and the right to personal data protection. At any time and without formalities you can write an e-mail to priv...@tis.bz.it in order to object the processing of your personal data for the purpose of sending advertising materials and also to exercise the right to access personal data and other rights referred to in Section 7 of Decree 196/2003. The data controller is TIS Techno Innovation Alto Adige, Siemens Street n. 19, Bolzano. You can find the complete information on the web site www.tis.bz.it.