Titan 0.5.0 GA Release

532 views
Skip to first unread message

Matthias Broecheler

unread,
Aug 14, 2014, 8:55:16 PM8/14/14
to aureliu...@googlegroups.com
Ladies and Gentlemen,

it is our pleasure to announce the release of Titan 0.5.0. This is our biggest release to date and a big step forward for Titan. You can download the distributions here:



Some things have changed quite a bit and there are a lot of new features, so we encourage all users to take a look at the new documentation:



For those who have been using previous versions of Titan, the upgrade instructions might be helpful:


Titan 0.5.0 is the culmination of 2 years of work and learning since we released Titan 0.1.0-alpha in June of 2012. When we started the Titan project, we wanted to build a graph database that truly deserves the characterization "scalable" and the 0.5.0 release is getting us a lot closer to this goal. Titan 0.5.0 improves existing scalability features like vertex-centric indexes, edge-cut partitioning, etc and adds some novel ones like vertex-cut partitioning, transaction log processing, and reindex support.

Titan 0.5.0 has been 9 months in the making and is a massive release. From its inception to the 0.4.4 release Titan is comprised of almost 1700 commits. Titan 0.5.0 stands at over 3400 commits which is more than double. Bottom line: lots of improvements, lots of new features and a lot of work. If you are interested in the details take a look at the change log:


With this much change, there will certainly be bugs. Please report those as always at:

Titan 0.5.0 is almost feature complete for the 1.0 release. The biggest difference between the 0.5.x line of Titan and the 1.0 will be support for TinkerPop3 which is currently in the works. We expect that Titan's data model will not change for the 1.0 release and 0.5.0 will be data compatible with the 1.0. The exact details of the 1.0 release and roadmap are still in the works and we will keep you informed.

Note, that Titan 0.5.0 is incompatible with previous releases of Titan. However, since we expect this to be the last backwards incompatible release, we are working on an automated update process that will be released separately.

We want to thank everybody who has supported Titan over the years. This wouldn't be possible without you.

Enjoy the release and give us your feedback,
The Titan Team



--
Matthias Broecheler
http://www.matthiasb.com

Damir Vandic

unread,
Aug 15, 2014, 6:16:48 AM8/15/14
to aureliu...@googlegroups.com
Hi Matthias,

Thank you for your hard work! The new features of 0.5.0 are awesome :) 

I'm currently trying to upgrade from 0.4.4 in a project that's currently in development. Just a quick question: why has the TitanGraphQuery interface become generic? I'm using Titan from Scala and I stumbled upon some issues w.r.t. with how 'recursive generics' are handled in Scala vs. Java :)

Thanks.

Damir

Matthias Broecheler

unread,
Aug 15, 2014, 11:08:10 AM8/15/14
to aureliu...@googlegroups.com

The reason is a complete refactoring of the query processor such that logic can be shared between graphquery and vertexquery.

What issues are you experiencing?

--
You received this message because you are subscribed to the Google Groups "Aurelius" group.
To unsubscribe from this group and stop receiving emails from it, send an email to aureliusgraph...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/aureliusgraphs/4ceb74f2-fb57-49a9-97f9-f95d92a1b1c6%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Damir Vandic

unread,
Aug 15, 2014, 3:07:27 PM8/15/14
to aureliu...@googlegroups.com
Ah I see, thanks.

As for my problem, I've set up a repo that demonstrates my compile error: https://github.com/damirv/recursive-wildcards-scala

Also, I've asked around in the scala-user mailing list: https://groups.google.com/forum/#!topic/scala-user/fBlyb3-Y0Zk

Summarizing: It's unclear to me what the correct Scala type of TitanGraph#query() must be in order to have TitanGraphQuery#has() methods be compatible with it. It seems that I have to use a recursive existential type, for which by the way a bug is plaguing the scala compiler. 


Kind regards,

Damir Vandic | Ontostream



Matthias Broecheler

unread,
Aug 15, 2014, 10:01:57 PM8/15/14
to aureliu...@googlegroups.com

Ah, that sounds complicated. Unfortunately I don't know Scala well enough to comment on this in a productive manner.

However, what we did on the java side doesn't strike me as too crazy - anybody else having an idea?

fanc...@gmail.com

unread,
Aug 15, 2014, 10:03:07 PM8/15/14
to aureliu...@googlegroups.com
Thank you for your hard work. 

Dan LaRocque

unread,
Aug 16, 2014, 5:39:31 AM8/16/14
to aureliu...@googlegroups.com
Hi,

I'm also not very well-versed in Scala, but I have a couple of observations.

This even more trivial version of your example doesn't compile either:

// g is declared as type TitanGraph, attrs as Map[String, Any]
attrs.foldLeft(g.query()) ({ case (q, _) => q })

But when I tweak your example as shown below, it compiles. The
existentials import is not strictly necessary -- it just provides
forward-compatibility and suppresses a warning. I've read SIP-18 and
some pieces about self-referential and existential types in Scala, but I
still don't think I fully understand what's going on here.

...
import com.thinkaurelius.titan.core.TitanGraphQuery
import scala.language.existentials
...
val q: TitanGraphQuery[_] = g.query()
val attrQ = attrs.foldLeft(q) ({
case (q, (name, value)) => q.has(name, value)
})

A practical alternative in this particular case is just to foreach the
map instead of folding, but I realize that's just a workaround.

thanks,
Dan

On 08/15/2014 10:01 PM, Matthias Broecheler wrote:
> Ah, that sounds complicated. Unfortunately I don't know Scala well
> enough to comment on this in a productive manner.
>
> However, what we did on the java side doesn't strike me as too crazy -
> anybody else having an idea?
>
> On Aug 16, 2014 2:07 AM, "Damir Vandic" <d.va...@ontostream.com
> <mailto:d.va...@ontostream.com>> wrote:
>
> Ah I see, thanks.
>
> As for my problem, I've set up a repo that demonstrates my compile
> error: https://github.com/damirv/recursive-wildcards-scala
>
> Also, I've asked around in the scala-user mailing list:
> https://groups.google.com/forum/#!topic/scala-user/fBlyb3-Y0Zk
>
> Summarizing: It's unclear to me what the correct Scala type of
> TitanGraph#query() must be in order to have TitanGraphQuery#has()
> methods be compatible with it. It seems that I have to use a
> recursive existential type, for which by the way a bug
> <https://issues.scala-lang.org/browse/SI-6255> is plaguing the scala
> compiler.
>

Damir Vandic

unread,
Aug 16, 2014, 5:59:42 AM8/16/14
to aureliu...@googlegroups.com
Oh yes, that actually works. I missed it because I did not consider it because the following does not work due to the [_] :

var q: TitanGraphQuery[_] = g.query()
q = q.has("a", "b")
q = q.has("c", "d")

​But for my example, this solution is just fine, so I'll just use it. 

Still, it makes me wonder what the type should be for the above example to work :) But hey, even on the scala-user mailinglist I haven't received an answer yet, I guess it's not that simple :)

Anyways, thank you for your answer!​


Kind regards,

Damir Vandic | Ontostream



On Sat, Aug 16, 2014 at 11:39 AM, Dan LaRocque <d...@thinkaurelius.com> wrote:
Hi,

I'm also not very well-versed in Scala, but I have a couple of observations.

This even more trivial version of your example doesn't compile either:

 // g is declared as type TitanGraph, attrs as Map[String, Any]
 attrs.foldLeft(g.query()) ({ case (q, _) => q })

But when I tweak your example as shown below, it compiles.  The existentials import is not strictly necessary -- it just provides forward-compatibility and suppresses a warning.  I've read SIP-18 and some pieces about self-referential and existential types in Scala, but I still don't think I fully understand what's going on here.

 ...
 import com.thinkaurelius.titan.core.TitanGraphQuery
 import scala.language.existentials
 ...
 val q: TitanGraphQuery[_] = g.query()
 val attrQ = attrs.foldLeft(q) ({
    case (q, (name, value)) => q.has(name, value)
 })

A practical alternative in this particular case is just to foreach the map instead of folding, but I realize that's just a workaround.

thanks,
Dan


On 08/15/2014 10:01 PM, Matthias Broecheler wrote:
Ah, that sounds complicated. Unfortunately I don't know Scala well
enough to comment on this in a productive manner.

However, what we did on the java side doesn't strike me as too crazy -
anybody else having an idea?

On Aug 16, 2014 2:07 AM, "Damir Vandic" <d.va...@ontostream.com
<mailto:d.vandic@ontostream.com>> wrote:

Ah I see, thanks.

As for my problem, I've set up a repo that demonstrates my compile
error: https://github.com/damirv/recursive-wildcards-scala

Also, I've asked around in the scala-user mailing list:
https://groups.google.com/forum/#!topic/scala-user/fBlyb3-Y0Zk

Summarizing: It's unclear to me what the correct Scala type of
TitanGraph#query() must be in order to have TitanGraphQuery#has()
methods be compatible with it. It seems that I have to use a
recursive existential type, for which by the way a bug
<https://issues.scala-lang.org/browse/SI-6255> is plaguing the scala
compiler.

--
You received this message because you are subscribed to the Google Groups "Aurelius" group.
To unsubscribe from this group and stop receiving emails from it, send an email to aureliusgraphs+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/aureliusgraphs/53EF26D1.7090802%40thinkaurelius.com.
Message has been deleted

Matthias Broecheler

unread,
Aug 18, 2014, 6:47:58 AM8/18/14
to aureliu...@googlegroups.com

Yes, we will probably move to 2.5.1 for the next minor version. The next major version of titan will be against tp3.

On Aug 18, 2014 1:32 PM, "Samuel Ramond" <samuel....@gmail.com> wrote:
Awesome, what a release !

One question, is this version still compatible with Tinkerpop 2.5 ?

Thanks,
Sam

--
You received this message because you are subscribed to the Google Groups "Aurelius" group.
To unsubscribe from this group and stop receiving emails from it, send an email to aureliusgraph...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/aureliusgraphs/5227ebcf-91b9-4f42-935d-f188c627b0d3%40googlegroups.com.

rammi

unread,
Aug 18, 2014, 7:21:22 AM8/18/14
to aureliu...@googlegroups.com
Hi Mathias,

Can you please direct me to Titan+Hbase+Rexster Configuration document. I connected to gremlin console that works fine but with rexster i see no data loaded. No errors!.

Matthias Broecheler

unread,
Aug 18, 2014, 12:02:37 PM8/18/14
to aureliu...@googlegroups.com

There is a page on configuration in general and rexster in particular. Please read those carefully. If you have additional questions , please post your config.

--
You received this message because you are subscribed to the Google Groups "Aurelius" group.
To unsubscribe from this group and stop receiving emails from it, send an email to aureliusgraph...@googlegroups.com.

Samuel Ramond

unread,
Aug 18, 2014, 12:35:11 PM8/18/14
to aureliu...@googlegroups.com
Hi,
I just migrated my application to titan 0.5 (from 0.4.4). I populate my graph via a custom loader using BatchGraph (import com.tinkerpop.blueprints.util.wrappers.batch.BatchGraph). It look like my data is successfully load in the graph but i cant access it via ./bin/gremlin.sh

In CQLSH if i check:

cqlsh:genvp5> SELECT COUNT(*) FROM graphindex LIMIT 5500000;

i got: count: 3558981 so it look like there is some data in my graph.

Then in ./bin/gremlin.sh

i tip:

config = new BaseConfiguration();

config.setProperty("storage.backend","cassandra");
config.setProperty("storage.hostname","127.0.0.1");

config.setProperty("storage.index.elastic.backend","elasticsearch");
config.setProperty("storage.index.elastic.directory","db/es");
config.setProperty("storage.index.elastic.client-only","false");
config.setProperty("storage.index.elastic.local-mode","true");
config.setProperty("storage.keyspace", "genvp5");
config.setProperty("storage.batch-loading","true");

g = TitanFactory.open(config);

if i make a g.V.count() i have: ==> 0

I can't either get it via Tinkerpop. Did i miss something ?

Matthias Broecheler

unread,
Aug 19, 2014, 1:34:09 AM8/19/14
to aureliu...@googlegroups.com

Are you using the right key space?

--
You received this message because you are subscribed to the Google Groups "Aurelius" group.
To unsubscribe from this group and stop receiving emails from it, send an email to aureliusgraph...@googlegroups.com.

Samuel Ramond

unread,
Aug 19, 2014, 4:13:10 AM8/19/14
to aureliu...@googlegroups.com
Ye i was in the rigth keyspace, i successfully load it by loading my conf file in gremlin with:


$>cat /home/deploy/synced/conf/titan_configuration.conf

storage.backend=cassandra
storage.hostname=127.0.0.1
storage.cassandra.keyspace=genvp5
storage.cassandra.thrift.frame_size_mb=64

cache.db-cache=true
cache.db-cache-clean-wait=20
cache.db-cache-time=180000
cache.db-cache-size=0.25

index.elastic.backend=elasticsearch
index.elastic.directory=db/es
index.elastic.client-only=false
index.elastic.local-mode=true

storage.batch-loading=false

@Gremlin:
gremlin> g = TitanFactory.open('/home/deploy/synced/conf/titan_configuration.conf')
==>titangraph[cassandra:[127.0.0.1]]
gremlin> g.V.count()
10:05:48 WARN  com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx  - Query requires iterating over all vertices [()]. For better performance, use indexes
==>1261149

----- This way it work but if i use:

gremlin> config = new BaseConfiguration();
==>org.apache.commons.configuration.BaseConfiguration@445ef7da
gremlin> config.setProperty("storage.backend","cassandra");
==>null
gremlin> config.setProperty("storage.hostname","127.0.0.1");
==>null
gremlin> config.setProperty("storage.index.elastic.backend","elasticsearch");
==>null
gremlin> config.setProperty("storage.index.elastic.directory","db/es");
==>null
gremlin> config.setProperty("storage.index.elastic.client-only","false");
==>null
gremlin> config.setProperty("storage.index.elastic.local-mode","true");
==>null
gremlin> config.setProperty("storage.keyspace", "genvp5");
==>null
gremlin> config.setProperty("storage.batch-loading","false");
==>null
gremlin> g = TitanFactory.open(config);
==>titangraph[cassandra:[127.0.0.1]]
gremlin> g.V.count()
10:05:19 WARN  com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx  - Query requires iterating over all vertices [()]. For better performance, use indexes
==>0

I use the ./bin/gremlin.sh inside the titan-0.5.0-hadoop2. 

Anyway now it work so it's cool it took me only 2 hours to migrate from 0.4.4 to 0.5

Can't wait to test all those new feature :)

Sourabh Jha

unread,
Aug 19, 2014, 6:35:00 AM8/19/14
to aureliu...@googlegroups.com
Hi Matthias,

I have been exploring Titan for last six months and I think you and your team has done wonderful work.

I just have one question...will you be releasing Titan 0.5.0 for jre1.6 also as you have been doing for the past releases.

Thanks and regards,
Sourabh

Alex Thompson

unread,
Aug 20, 2014, 2:07:56 AM8/20/14
to aureliu...@googlegroups.com
Hi Mathias,

Well done with Titan 0.5.0 and thanks for the effort to all who contributed to this exceptional piece of work.

Alex T @ DataStax

Matthias Broecheler

unread,
Aug 20, 2014, 3:34:53 AM8/20/14
to aureliu...@googlegroups.com

We decided to go jre 1.7 for this release since tp3 will require java 8. Do you require java 6. Why? (If you don't mind me asking)

--
You received this message because you are subscribed to the Google Groups "Aurelius" group.
To unsubscribe from this group and stop receiving emails from it, send an email to aureliusgraph...@googlegroups.com.

Matthias Broecheler

unread,
Aug 20, 2014, 3:34:52 AM8/20/14
to aureliu...@googlegroups.com

Thanks for the explanation, Samuel. I don't readily see what's wrong in the 2nd case. Also, note that titan 05 has a configuration builder in the TitanFactory making configuration in the shell much less painful.

Daniel Kuppitz

unread,
Aug 20, 2014, 9:51:51 AM8/20/14
to aureliu...@googlegroups.com
Hi Samuel,

please note that parts of your two configurations are different.

storage.cassandra.keyspace=genvp5
vs.
gremlin> config.setProperty("storage.keyspace", "genvp5");

and

index.elastic.backend=elasticsearch
index.elastic.directory=db/es
index.elastic.client-only=false
index.elastic.local-mode=true
vs. 
gremlin> config.setProperty("storage.index.elastic.backend","elasticsearch");
gremlin> config.setProperty("storage.index.elastic.directory","db/es");
gremlin> config.setProperty("storage.index.elastic.client-only","false");
gremlin> config.setProperty("storage.index.elastic.local-mode","true");

Cheers,
Daniel

Samuel Ramond

unread,
Aug 20, 2014, 10:05:57 AM8/20/14
to aureliu...@googlegroups.com
Ye this was it, it worked with storage.backend on 0.4.4 but not anymore on 0.5

Cheers,
Sam


--
You received this message because you are subscribed to a topic in the Google Groups "Aurelius" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/aureliusgraphs/29O1wZY6Bxs/unsubscribe.
To unsubscribe from this group and all its topics, send an email to aureliusgraph...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/aureliusgraphs/35080351-26db-4ca7-ada4-684692187f15%40googlegroups.com.

Deepak Patil

unread,
Aug 20, 2014, 10:12:42 AM8/20/14
to aureliu...@googlegroups.com
Kudos to whole team for such a great work.
I am just starting with it. But skimmed over all recent changelogs to see the lots of features and stability issues taken care of.
Question: with the aspiration to use it to architect a new solution for my company, can this Titan release be used in Production. Can we expect a LTS for this version.

Thanks and best regards,
Deepak

Matthias Broecheler

unread,
Aug 24, 2014, 3:19:45 PM8/24/14
to aureliu...@googlegroups.com

Hey, given the amount if new features we expect there will be bugs in this release but are determined to fix those quickly with a short turn around. So far, nothing major has come up (knock on wood). We do expect that this release will remain compatibility with future releases on the data storage, however, the query API will change a lot with the adoption of TP3 for the 1.0 release.

--
You received this message because you are subscribed to the Google Groups "Aurelius" group.
To unsubscribe from this group and stop receiving emails from it, send an email to aureliusgraph...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages