From f9e32000a7dbaf17b3bfe88072424aae4a6fad31 Mon Sep 17 00:00:00 2001 From: Bryn Cooke Date: Wed, 29 Apr 2015 14:20:49 +0100 Subject: [PATCH] Went through entire documentation updating code examples and references to tinkerpop. Added gremlin.graph config option Added TimeUnit to auto imports for gremlin shell Updated gremlin server config Fixed elastic search antlr version collision with Cassandra https://github.com/thinkaurelius/titan/issues/872 --- NOTICE.txt | 5 +- docs/TitanBus.md | 2 +- docs/advblueprints.txt | 40 +- docs/advschema.txt | 47 +- docs/bdb.txt | 12 +- docs/building.txt | 4 +- docs/bulkloading.txt | 8 +- docs/cassandra.txt | 45 +- docs/changelog.txt | 32 +- docs/configref.txt | 2 +- docs/datamodel.txt | 4 +- docs/directindex.txt | 26 +- docs/elasticsearch.txt | 60 +- docs/eventualconsistency.txt | 19 +- docs/exampleconfig.txt | 26 +- docs/generating.txt | 34 +- docs/hadoop.txt | 22 +- docs/hbase.txt | 30 +- docs/indexbackends.txt | 4 +- docs/inmemorybackend.txt | 6 +- docs/intro.txt | 134 +++-- docs/lucene.txt | 8 +- docs/monitoring.txt | 54 +- docs/multiquery.txt | 38 -- docs/partitioning.txt | 8 +- docs/recovery.txt | 10 +- docs/reindex.txt | 2 +- docs/relatedmaterial.txt | 2 +- docs/searchpredicates.txt | 59 +- docs/serializer.txt | 7 +- docs/solr.txt | 42 +- .../images/rexster-dog-house-gremlin.png | Bin 66582 -> 0 bytes docs/static/images/rexster-dog-house-viz.png | Bin 125427 -> 0 bytes .../images/rexster-gremlin-elephant.png | Bin 59438 -> 0 bytes docs/static/images/rexster-system-arch.png | Bin 150078 -> 0 bytes docs/textsearch.txt | 16 +- docs/titanbasics.txt | 523 ++++++++++-------- docs/upgrade.txt | 4 +- .../tinkerpop/plugin/TitanGremlinPlugin.java | 2 + .../GraphDatabaseConfiguration.java | 6 + .../titan-cassandra-embedded-es.properties | 2 +- .../titan-cassandra-embedded-solr.properties | 2 +- .../conf/titan-cassandra-embedded.properties | 2 +- .../resources/conf/rexster-cassandra-es.xml | 109 ---- .../resources/conf/rexster-cassandra.xml | 104 ---- .../src/assembly/static/bin/gremlin-server.sh | 6 +- .../conf/gremlin-server/gremlin-server.yaml | 4 +- .../assembly/static/conf/remote-objects.yaml | 2 +- .../src/assembly/static/conf/remote.yaml | 2 +- titan-es/pom.xml | 12 + 50 files changed, 709 insertions(+), 879 deletions(-) delete mode 100644 docs/multiquery.txt delete mode 100644 docs/static/images/rexster-dog-house-gremlin.png delete mode 100644 docs/static/images/rexster-dog-house-viz.png delete mode 100644 docs/static/images/rexster-gremlin-elephant.png delete mode 100644 docs/static/images/rexster-system-arch.png delete mode 100644 titan-dist/src/assembly/resources/conf/rexster-cassandra-es.xml delete mode 100644 titan-dist/src/assembly/resources/conf/rexster-cassandra.xml diff --git a/NOTICE.txt b/NOTICE.txt index d842e5264d..b61d30b9d6 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -13,10 +13,7 @@ This product includes software developed by Aurelius (http://thinkaurelius.com/) It also includes software from other open source projects including, but not limited to (check pom.xml for complete listing): - * TinkerPop Blueprints [http://blueprints.tinkerpop.com] - * TinkerPop Gremlin [http://gremlin.tinkerpop.com] - * TinkerPop Rexster [http://rexster.tinkerpop.com] - * TinkerPop Frames [http://frames.tinkerpop.com] + * TinkerPop [http://tinkerpop.incubator.apache.org/] * Apache Commons [http://commons.apache.org/] * Google Guava [http://code.google.com/p/guava-libraries/] * HPPC [http://labs.carrotsearch.com/hppc.html] diff --git a/docs/TitanBus.md b/docs/TitanBus.md index c32475cc3d..b0b98a4b75 100644 --- a/docs/TitanBus.md +++ b/docs/TitanBus.md @@ -7,7 +7,7 @@ The purpose of the trigger log is to capture the mutations of a transaction so t The trigger log consists of multiple sub-logs as configured by the user. When opening a transaction, the identifier for the trigger sub-log can be specified: - tx = graph.buildTransaction().setLogIdentifier("purchase").start(); + tx = g.buildTransaction().logIdentifier("purchase").start(); In this case, the identifier is "purchase" which means that the mutations of this transaction will be written to a log with the name "trigger_purchase". This gives the user control over where transactional mutations are logged. If no trigger log is specified, no trigger log entry will be created. diff --git a/docs/advblueprints.txt b/docs/advblueprints.txt index 1ddbb77d3b..fbb7d33c23 100644 --- a/docs/advblueprints.txt +++ b/docs/advblueprints.txt @@ -1,36 +1,30 @@ [[advanced-blueprints]] -Advanced Blueprints +Advanced Tinkerpop ------------------- -//image:https://raw.github.com/tinkerpop/blueprints/master/doc/images/blueprints-character-3.png[] +http://tinkerpop.incubator.apache.org/[Tinkerpop] provides a set of common http://tinkerpop.incubator.apache.org/docs/3.0.0-SNAPSHOT/#traversalstrategy[traversal strategies] that add additional functionality to graphs. -http://blueprints.tinkerpop.com/[Blueprints] provides a set of common property graph interfaces by which any vendor can implement and leverage the http://tinkerpop.com[TinkerPop] stack of technologies. Within Blueprints, there are other utilities that are generally useful like import/export formats as well graph wrappers. - -Using IdGraph +Using ElementIdStrategy ~~~~~~~~~~~~~ -It is possible to use Blueprints' https://github.com/tinkerpop/blueprints/wiki/Id-Implementation[IdGraph] with Titan. IdGraph requires a property named `__id` that maps arbitrary user-provided identifiers to Titan's internally-assigned long identifiers. This property name is also available programmatically as the public static string `IdGraph.ID`. +It is possible to use http://tinkerpop.incubator.apache.org/docs/3.0.0-SNAPSHOT/#_elementidstrategy[ElementIdStrategy] with Titan. ElementIdStrategy allow an arbitrary property to be used as the element ID instead of Titans's long identifiers. [IMPORTANT] -The `__id` property key must be created and covered by a unique index in Titan prior to using `IdGraph` with Titan. +The target property key must be created and covered by a unique index in Titan prior to using `ElementIdStrategy` with Titan, otherwise Vertex lookups will result in sequential scans of the graph. -To prepare Titan for IdGraph, first create the `__id` property key. Set the `dataType` of the property key to match the custom IDs that you intend to use. Second, build a unique composite index on the `__id` property key. The following example shows how to define and index the `__id` property key to support IdGraph with string vertex IDs. +To prepare Titan for ElementIdStrategy, first create the property key. Set the `dataType` of the property key to match the custom IDs that you intend to use. Second, build a unique composite index on the property key. The following example shows how to define and index the property key to support IdGraph with string vertex IDs. -[source,gremlin] +[source, gremlin] g = TitanFactory.open("berkeleyje:/tmp/test") -// Define a property key and index for IdGraph-managed vertex IDs -mgmt = g.getManagementSystem(); -id = mgmt.makePropertyKey(IdGraph.ID).dataType(String.class).make() -mgmt.buildIndex("byvid",Vertex.class).addKey(id).unique().buildCompositeIndex() +// Define a property key and index for managed vertex IDs +mgmt = g.openManagement() +idKey = mgmt.makePropertyKey("name").dataType(String.class).make() +mgmt.buildIndex("byName", Vertex.class).addKey(idKey).unique().buildCompositeIndex() mgmt.commit() -// Create an IdGraph that manages vertex IDs but not edge IDs -ig = new IdGraph(g, true, false) -// Insert example vertex with custom identifier -hercules = ig.addVertex("hercules") -g.v("hercules") -zeus = ig.addVertex("zeus") +// Create an that manages vertex IDs but not edge IDs +strategy = ElementIdStrategy.build().idPropertyKey("name").create() +ig = GraphTraversalSource.build().with(strategy).create(g) -// If only user defined ids on vertices (or edges) is needed, then use one of the overloaded `IdGraph` constructors. It is still helpful, although not strictly necessary, to define an index: -// -//[source,gremlin] -//ig = new IdGraph(g, true, false) // true for vertices, false for edges +// Insert example vertex with custom identifier +hercules = ig.addV(T.id, "hercules") +ig.V("hercules") \ No newline at end of file diff --git a/docs/advschema.txt b/docs/advschema.txt index 40640a2a11..51e60f71c0 100644 --- a/docs/advschema.txt +++ b/docs/advschema.txt @@ -10,7 +10,7 @@ Static Vertices Vertex labels can be defined as *static* which means that vertices with that label cannot be modified outside the transaction in which they were created. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() tweet = mgmt.makeVertexLabel('tweet').setStatic().make() mgmt.commit() @@ -30,12 +30,12 @@ The following storage backends support vertex and edge label TTL. Edge TTL ^^^^^^^^ -Edge TTL is defined on a per-edge label basis, meaning that all edges of that label have the same time-to-live. +Edge TTL is defined on a per-edge label basis, meaning that all edges of that label have the same time-to-live. Note that the backend must support cell level TTL. Currently only Cassandra supports this. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() visits = mgmt.makeEdgeLabel('visits').make() -mgmt.setTTL(visits,7,TimeUnit.DAYS) +mgmt.setTTL(visits, 7, DAYS) mgmt.commit() Note, that modifying an edge resets the TTL for that edge. Also note, that the TTL of an edge label can be modified but it might take some time for this change to propagate to all running Titan instances which means that two different TTLs can be temporarily in use for the same label. @@ -43,12 +43,12 @@ Note, that modifying an edge resets the TTL for that edge. Also note, that the T Property TTL ^^^^^^^^^^^^ -Property TTL is very similar to edge TTL and defined on a per-property key basis, meaning that all properties of that key have the same time-to-live. +Property TTL is very similar to edge TTL and defined on a per-property key basis, meaning that all properties of that key have the same time-to-live. Note that the backend must support cell level TTL. Currently only Cassandra supports this. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() sensor = mgmt.makePropertyKey('sensor').cardinality(Cardinality.LIST).dataType(Double.class).make() -mgmt.setTTL(sensor,21,TimeUnit.DAYS) +mgmt.setTTL(sensor, 21, DAYS) mgmt.commit() As with edge TTL, modifying an existing property resets the TTL for that property and modifying the TTL for a property key might not immediately take effect. @@ -56,12 +56,12 @@ As with edge TTL, modifying an existing property resets the TTL for that propert Vertex TTL ^^^^^^^^^^ -Vertex TTL is defined on a per-vertex label basis, meaning that all vertices of that label have the same time-to-live. The configured TTL applies to the vertex, its properties, and all incident edges to ensure that the entire vertex is removed from the graph. For this reason, a vertex label must be defined as _static_ before a TTL can be set to rule out any modifications that would invalidate the vertex TTL. Vertex TTL only applies to static vertex labels. +Vertex TTL is defined on a per-vertex label basis, meaning that all vertices of that label have the same time-to-live. The configured TTL applies to the vertex, its properties, and all incident edges to ensure that the entire vertex is removed from the graph. For this reason, a vertex label must be defined as _static_ before a TTL can be set to rule out any modifications that would invalidate the vertex TTL. Vertex TTL only applies to static vertex labels. Note that the backend must support store level TTL. Currently only Cassandra and HBase support this. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() tweet = mgmt.makeVertexLabel('tweet').setStatic().make() -mgmt.setTTL(tweet,36,TimeUnit.HOURS) +mgmt.setTTL(tweet, 36, HOURS) mgmt.commit() Note, that the TTL of a vertex label can be modified but it might take some time for this change to propagate to all running Titan instances which means that two different TTLs can be temporarily in use for the same label. @@ -71,16 +71,16 @@ Multi-Properties As dicussed in <>, Titan supports property keys with SET and LIST cardinality. Hence, Titan supports multiple properties with the same key on a single vertex. Furthermore, Titan treats properties similarly to edges in that single-valued property annotations are allowed on properties as shown in the following example. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.LIST).make() mgmt.commit() v = g.addVertex() -p1 = v.property('name','Dan LaRocque') -p1.property('source','web') -p2 = v.property('name','dalaro') -p2.property('source','github') -g.commit() +p1 = v.property('name', 'Dan LaRocque') +p1.property('source', 'web') +p2 = v.property('name', 'dalaro') +p2.property('source', 'github') +g.tx().commit() v.properties('name') ==> Iterable over all name properties @@ -93,20 +93,29 @@ Unidirected Edges Unidirected edges are edges that can only be traversed in the out-going direction. Unidirected edges have a lower storage footprint but are limited in the types of traversals they support. Unidirected edges are conceptually similar to hyperlinks in the world-wide-web in the sense that the out-vertex can traverse through the edge, but the in-vertex is unaware of its existence. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() link = mgmt.makeEdgeLabel('link').unidirected().make() mgmt.commit() Unidirected edges can be added on edges and properties, thereby giving Titan limited support for hyper-edges. For example, this can be useful for capturing authorship provenance information for edges as shown in the following example, where we add a unidirected `author` edge on the `knows` edge to store the fact that `user` added this edge to the graph. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() mgmt.makeEdgeLabel('author').unidirected().make() mgmt.commit() user = g.v(4) u = g.v(8) v = g.v(16) -v.addEdge('knows',u).property('author',user) +v.addEdge('knows', u).property('author', user) + + +mgmt = g.openManagement() +mgmt.makeEdgeLabel('author').unidirected().make() +mgmt.commit() +user = g.addVertex(T.label, 'author'); +book = g.addVertex(); +author = g.addVertex(); +user.addE('knows', book).property('author', author) Note, that unidirected edges do not get automatically deleted when their in-vertices are deleted. The user must ensure that such inconsistencies do not arise or resolve them at query time by explicitly checking vertex existence in a transaction. See the discussion in <> for more information. diff --git a/docs/bdb.txt b/docs/bdb.txt index ec84068510..7d406dda9f 100644 --- a/docs/bdb.txt +++ b/docs/bdb.txt @@ -5,7 +5,7 @@ BerkeleyDB //[.tss-center.tss-width-250] //image:http://download.oracle.com/berkeley-db/docs/je/3.2.76/images/Oracle_BerkeleyDB_clr.bmp[link="http://www.oracle.com/technetwork/products/berkeleydb"] -[quote,'http://www.oracle.com/technetwork/products/berkeleydb[BerkeleyDB Homepage]'] +[quote, 'http://www.oracle.com/technetwork/products/berkeleydb[BerkeleyDB Homepage]'] Berkeley DB enables the development of custom data management solutions, without the overhead traditionally associated with such custom projects. Berkeley DB provides a collection of well-proven @@ -22,11 +22,11 @@ BerkeleyDB Setup Since BerkeleyDB runs in the same JVM as Titan, connecting the two only requires a simple configuration and no additional setup: -[source,java] -TitanGraph g = TitanFactory.build() - .set("storage.backend", "berkeleyje") - .set("storage.directory", "/tmp/graph") - .open(); +[source, java] +TitanGraph g = TitanFactory.build(). +set("storage.backend", "berkeleyje"). +set("storage.directory", "/tmp/graph"). +open(); In the Gremlin shell, you can not define the type of the variables `conf` and `g`. Therefore, simply leave off the type declaration. diff --git a/docs/building.txt b/docs/building.txt index 751bf4d858..a0f7fde58c 100644 --- a/docs/building.txt +++ b/docs/building.txt @@ -15,7 +15,7 @@ Depending on Titan Snapshots For developing against the most current version of Titan, depend on Titan snapshot releases. Note, that these releases are development releases and therefore unstable and likely to change. Unless one is interested in the most recent development status of Titan, we recommend to use the stable Titan release instead. -[source,xml] +[source, xml] com.thinkaurelius.titan titan-core @@ -27,7 +27,7 @@ SNAPSHOTs are available through the https://oss.sonatype.org/content/repositorie When adding this dependency, be sure to add the following repository to the `pom.xml`: -[source,xml] +[source, xml] sonatype-nexus-snapshots Sonatype Nexus Snapshots diff --git a/docs/bulkloading.txt b/docs/bulkloading.txt index f1fd64cebc..6b23c07c21 100644 --- a/docs/bulkloading.txt +++ b/docs/bulkloading.txt @@ -10,7 +10,7 @@ There are a number of configuration options and tools that make ingesting large There are a number of use cases for bulk loading data into Titan, including: * Introducing Titan into an existing environment with existing data and migrating or duplicating this data into a new Titan cluster. -* Using Titan as an end point of an http://en.wikipedia.org/wiki/Extract,_transform,_load[ETL] process. +* Using Titan as an end point of an http://en.wikipedia.org/wiki/Extract, _transform, _load[ETL] process. * Adding an existing or external graph datasets (e.g. publicly available http://linkeddata.org/[RDF datasets]) to a running Titan cluster. * Updating a Titan graph with results from a graph analytics job. @@ -82,12 +82,12 @@ During bulk loading, the load on the cluster typically increases making it more //Titan-Hadoop //^^^^^^^^^^^^ -//For very large graphs the best option to load data efficiently is <> using one of the supported input format and specifying Titan as the output format. +//For very large graphs the best option to load data efficiently is <> using one of the supported input format and specifying Titan as the output format. //BatchGraph //^^^^^^^^^^ -//For medium size graph datasets (up to 100s million edges), Blueprints' https://github.com/tinkerpop/blueprints/wiki/Batch-Implementation[BatchGraph] is a useful tool for bulk loading data into Titan from a single machine through Titan's native Blueprints interface. BatchGraph effectively caches externally provided vertex ids to eliminate reads against Titan. This allows bulk loading with minimal read load. +//For medium size graph datasets (up to 100s million edges), Tinkerpop ' http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/#_batchgraph[BatchGraph] is a useful tool for bulk loading data into Titan from a single machine through Titan's native Blueprints interface. BatchGraph effectively caches externally provided vertex ids to eliminate reads against Titan. This allows bulk loading with minimal read load. //BatchGraph is limited to single machine bulk loading use cases and requires enough local RAM to hold the entire vertex id cache in memory. BatchGraph supports id compression to reduce the memory requirements. Please refer to the https://github.com/tinkerpop/blueprints/wiki/Batch-Implementation[BatchGraph documentation] for more information on how to use BatchGraph most effectively. @@ -112,7 +112,7 @@ If Hadoop cannot be used for parallelizing the bulk loading process, here are so Data Sorting ^^^^^^^^^^^^ -Presorting the data to be bulk loaded can significantly increase the loading performance through BatchGraph. The https://github.com/tinkerpop/blueprints/wiki/Batch-Implementation[BatchGraph] documentation describes this strategy in more detail. It has been reported that loading times were decreased by a factor of 2 or more when presorting the bulk loaded data. +Presorting the data to be bulk loaded can significantly increase the loading performance through BatchGraph. The http://tinkerpop.incubator.apache.org/docs/3.0.0-SNAPSHOT/#_batchgraph[BatchGraph] documentation describes this strategy in more detail. It has been reported that loading times were decreased by a factor of 2 or more when presorting the bulk loaded data. Q&A ~~~ diff --git a/docs/cassandra.txt b/docs/cassandra.txt index 30efbde3de..400d356729 100644 --- a/docs/cassandra.txt +++ b/docs/cassandra.txt @@ -3,9 +3,9 @@ Cassandra --------- [.tss-center.tss-width-250] -image:http://cassandra.apache.org/media/img/cassandra_logo.png[link="http://cassandra.apache.org/",width=250] +image:http://cassandra.apache.org/media/img/cassandra_logo.png[link="http://cassandra.apache.org/", width=250] -[quote,'http://cassandra.apache.org/[Apache Cassandra Homepage]'] +[quote, 'http://cassandra.apache.org/[Apache Cassandra Homepage]'] The Apache Cassandra database is the right choice when you need scalability and high availability without compromising performance. Linear scalability and proven fault-tolerance on @@ -31,11 +31,11 @@ Cassandra can be run as a standalone database on the same local host as Titan an Now, you can create a Cassandra TitanGraph as follows:: -[source,java] -TitanGraph g = TitanFactory.build() - .set("storage.backend","cassandra") - .set("storage.hostname","127.0.0.1") - .open(); +[source, java] +TitanGraph g = TitanFactory.build(). +set("storage.backend", "cassandra"). +set("storage.hostname", "127.0.0.1"). +open(); In the Gremlin shell, you can not define the type of the variables `conf` and `g`. Therefore, simply leave off the type declaration. @@ -48,29 +48,32 @@ When the graph needs to scale beyond the confines of a single machine, then Cass For example, suppose we have a running Cassandra cluster where one of the machines has the IP address 77.77.77.77, then connecting Titan with the cluster is accomplished as follows (comma separate IP addresses to reference more than one machine): -[source,java] -TitanGraph g = TitanFactory.build() - .set("storage.backend","cassandra") - .set("storage.hostname","77.77.77.77") - .open(); +[source, java] +TitanGraph g = TitanFactory.build(). +set("storage.backend", "cassandra"). +set("storage.hostname", "77.77.77.77"). +open(); In the Gremlin shell, you can not define the type of the variables `conf` and `g`. Therefore, simply leave off the type declaration. Remote Server Mode with Gremlin Server ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -image:titan-modes-rexster.png[] +image:http://tinkerpop.incubator.apache.org/docs/3.0.0-SNAPSHOT/images/gremlin-server.png[] Gremlin Server can be wrapped around each Titan instance defined in the previous subsection. In this way, the end-user application need not be a Java-based application as it can communicate with Gremlin Server as a client. This type of deployment is great for polyglot architectures where various components written in different languages need to reference and compute on the graph. +Start gremlin server using bin/gremlin-server.sh and then in an external gremlin.sh session you can send gremlin commands over the wire: + ---- -http://rexster.titan.machine1/mygraph/vertices/1 -http://rexster.titan.machine2/mygraph/tp/gremlin?script=g.v(1).out('follows').out('created') +:plugin use tinkerpop.server +:remote connect tinkerpop.server conf/remote.yaml +:> v = g.addVertex() ---- In this case, each Gremlin server would be configured to connect to the Cassandra cluster. The following shows the graph specific fragment of the Gremlin server configuration. Refer to <> for a complete example and more information on how to configure the server. -[source,yaml] +[source, yaml] ---- ... graphs: { @@ -79,7 +82,7 @@ plugins: - aurelius.titan ... ---- - +For more information about gremlin server see the latest http://tinkerpop.incubator.apache.org/docs/3.0.0-SNAPSHOT/#gremlin-server[Tinkerpop documentation] Titan Embedded Mode ~~~~~~~~~~~~~~~~~~~ @@ -90,7 +93,7 @@ Finally, Cassandra can be embedded in Titan, which means, that Titan and Cassand To use Titan in embedded mode, simply configure `embeddedcassandra` as the storage backend. The configuration options listed below also apply to embedded Cassandra. In creating a Titan cluster, ensure that the individual nodes can discover each other via the Gossip protocol, so setup a Titan-with-Cassandra-embedded cluster much like you would a stand alone Cassandra cluster. When running Titan in embedded mode, the Cassandra yaml file is configured using the additional configuration option `storage.conf-file`, which specifies the yaml file as a full url, e.g. `storage.conf-file = file:///home/cassandra.yaml`. -When running a cluster with Titan and Cassandra embedded, it is advisable to expose Titan through the Rexster server so that applications can remotely connect to the Titan graph database and execute queries. +When running a cluster with Titan and Cassandra embedded, it is advisable to expose Titan through the Gremlin Server so that applications can remotely connect to the Titan graph database and execute queries. Note, that running Titan with Cassandra embedded requires GC tuning. While embedded Cassandra can provide lower latency query answering, its GC behavior under load is less predictable. @@ -120,7 +123,7 @@ Deploying on Amazon EC2 [.tss-center.tss-width-250] image:http://cdn001.practicalclouds.com/user-content/1_Dave%20McCormick//logos/Amazon%20AWS%20plus%20EC2%20logo_scaled.png[link="http://aws.amazon.com/ec2/"] -[quote,'http://aws.amazon.com/ec2/[Amazon EC2]'] +[quote, 'http://aws.amazon.com/ec2/[Amazon EC2]'] Amazon Elastic Compute Cloud (Amazon EC2) is a web service that provides resizable compute capacity in the cloud. It is designed to make web-scale computing easier for developers. Follow these steps to setup a Cassandra cluster on EC2 and deploy Titan over Cassandra. To follow these instructions, you need an Amazon AWS account with established authentication credentials and some basic knowledge of AWS and EC2. @@ -128,7 +131,7 @@ Follow these steps to setup a Cassandra cluster on EC2 and deploy Titan over Cas Setup Cassandra Cluster ^^^^^^^^^^^^^^^^^^^^^^^ -These instructions for configuring and launching the DataStax Cassandra Community Edition AMI are based on the http://www.datastax.com/docs/datastax_enterprise2.0/ami/install_dse_ami[DataStax AMI Docs] and focus on aspects relevant for a Titan deployment. +These instructions for configuring and launching the DataStax Cassandra Community Edition AMI are based on the http://docs.datastax.com/en/cassandra/2.1/cassandra/install/installAMILaunch.html[DataStax AMI Docs] and focus on aspects relevant for a Titan deployment. Setting up Security Group ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -182,7 +185,7 @@ Note, that the AMI takes a few minutes to configure each instance. A shell promp Launch Titan Instances ^^^^^^^^^^^^^^^^^^^^^^ -Launch additional EC2 instances to run Titan which are either configured in Remote Server Mode or Remote Server Mode with Rexster as described above. You only need to note the IP address of one of the Cassandra cluster instances and configure it as the host name. The particular EC2 instance to run and the particular configuration depends on your use case. +Launch additional EC2 instances to run Titan which are either configured in Remote Server Mode or Remote Server Mode with Gremlin-Server as described above. You only need to note the IP address of one of the Cassandra cluster instances and configure it as the host name. The particular EC2 instance to run and the particular configuration depends on your use case. Example Titan Instance on Amazon Linux AMI ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/changelog.txt b/docs/changelog.txt index 9589fd5f2d..64b588d3f8 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -6,7 +6,7 @@ Release Notes Version 0.9.0-M1 (December 4, 2014) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan-core @@ -52,7 +52,7 @@ Version 0.5.3 (January 12, 2015) Version 0.5.2 (November 24, 2014) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan-core @@ -94,7 +94,7 @@ Version 0.5.2 (November 24, 2014) Version 0.5.1 (October 10, 2014) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan-core @@ -133,7 +133,7 @@ Version 0.5.1 (October 10, 2014) Version 0.5.0 (August 15, 2014) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan-core @@ -216,7 +216,7 @@ Version 0.5.0 (August 15, 2014) Version 0.4.4 (April 22, 2014) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan-core @@ -240,7 +240,7 @@ Added 0.4.2 to compatible-version string (and 0.4.3) Version 0.4.3 (April 21, 2014) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan-core @@ -274,7 +274,7 @@ Version 0.4.3 (April 21, 2014) Version 0.4.2 (December 30, 2013) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan-core @@ -309,7 +309,7 @@ Version 0.4.2 (December 30, 2013) Version 0.4.1 (November 24, 2013) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan-core @@ -337,7 +337,7 @@ Version 0.4.1 (November 24, 2013) * Better caching implementation for relations (RelationCache) to provide faster de-serialization performance * Addition of a new query optimizer that can significantly speed up a subset of traversals * Support for reverse ordering in vertex centric queries by defining: makeLabel(..).sortKey(..).sortOrder(Order.DESC).make() -* Support for index configuration parameters passed into KeyMaker.indexed(String,Class,Parameter...) to change the default indexing behavior of an indexing backend. +* Support for index configuration parameters passed into KeyMaker.indexed(String, Class, Parameter...) to change the default indexing behavior of an indexing backend. * Support for TEXT and STRING mapping of strings in both Lucene and ElasticSearch configurable as a parameter. Learn more about [[Full Text and String Search]] * Refactored Text.REGEX/PREFIX to Text.CONTAINS_REGEX/CONTAINS_PREFIX to accurately reflect their semantics. Added Text.REGEX/PREFIX for full string matching. See [[Indexing Backend Overview]] * Added support for scaling the id allocation to hundreds of parallel Titan instances through additional configuration options. See [[Bulk Loading]]. @@ -352,7 +352,7 @@ Version 0.4.1 (November 24, 2013) Version 0.4.0 (October 16, 2013) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan-core @@ -419,7 +419,7 @@ Check the issue tracker for a full list of fixed issues. Version 0.3.2 (July 29, 2013) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan-core @@ -454,7 +454,7 @@ Check the issue tracker for a full list of fixed issues. Version 0.3.1 (May 14, 2013) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan-core @@ -498,7 +498,7 @@ Check the issue tracker for a full list of fixed issues. Version 0.3.0 (March 29, 2013) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan-core @@ -535,7 +535,7 @@ Version 0.3.0 (March 29, 2013) Version 0.2.1 (March 22, 2013) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan-core @@ -577,7 +577,7 @@ Version 0.2.1 (March 22, 2013) Version 0.2.0 (December 24, 2012) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan @@ -617,7 +617,7 @@ Version 0.2.0 (December 24, 2012) Version 0.1.0 (September 7, 2012) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,m2] +[source, m2] com.thinkaurelius.titan titan diff --git a/docs/configref.txt b/docs/configref.txt index e656c7fd81..25e461b1bc 100644 --- a/docs/configref.txt +++ b/docs/configref.txt @@ -33,7 +33,7 @@ Namespaces marked with an asterisk are *umbrella namespaces* which means that th For example, the `log` namespace is an umbrella namespace because Titan can interface with multiple logging backends, such as the `user` log, each of which has the same core set of configuration options. To configure the send batch size of the `user` log to 100 transaction changes, one would have to set the following option in the configuration -[source,text] +[source, text] log.user.send-batch-size = 100 Configuration Namespaces and Options diff --git a/docs/datamodel.txt b/docs/datamodel.txt index 8e15beb866..54b79a6dee 100644 --- a/docs/datamodel.txt +++ b/docs/datamodel.txt @@ -6,9 +6,9 @@ Titan stores graphs in http://en.wikipedia.org/wiki/Adjacency_list[adjacency lis By storing a graph in adjacency list format Titan ensures that all of a vertex's incident edges and properties are stored compactly in the storage backend which speeds up traversals. The downside is that each edge has to be stored twice - once for each end vertex of the edge. -In addition, Titan maintains the adjacency list of each vertex in sort order with the order being defined by the sort key and sort order the edge labels. The sort order enables efficient retrievals of subsets of the adjacency list using <>. +In addition, Titan maintains the adjacency list of each vertex in sort order with the order being defined by the sort key and sort order the edge labels. The sort order enables efficient retrievals of subsets of the adjacency list using <>. -Titan stores the adjacency list representation of a graph in any <> that supports the BigTable data model. +Titan stores the adjacency list representation of a graph in any <> that supports the BigTable data model. BigTable Data Model ~~~~~~~~~~~~~~~~~~~ diff --git a/docs/directindex.txt b/docs/directindex.txt index de47804bb5..e95a01a58f 100644 --- a/docs/directindex.txt +++ b/docs/directindex.txt @@ -18,13 +18,13 @@ These methods return an `Iterable` over `Result` objects. A result object contai Consider the following example: -[source,java] -ManagementSystem mgmt = g.getManagementSystem(); +[source, java] +ManagementSystem mgmt = g.openManagement(); PropertyKey text = mgmt.makePropertyKey("text").dataType(String.class).make(); mgmt.buildIndex("vertexByText", Vertex.class).addKey(text).buildMixedIndex("search"); mgmt.commit(); // ... Load vertices ... -for (Result result : graph.indexQuery("vertexByText","v.text:(farm uncle berry)").vertices()) { +for (Result result : g.indexQuery("vertexByText", "v.text:(farm uncle berry)").vertices()) { System.out.println(result.getElement() + ": " + result.getScore()); } @@ -34,14 +34,14 @@ Query String The query string is handed directly to the indexing backend for processing and hence the query string syntax depends on what is supported by the indexing backend. For vertex queries, Titan will analyze the query string for property key references starting with "v." and replace those by a handle to the indexing field that corresponds to the property key. Likewise, for edge queries, Titan will replace property key references starting with "e.". Hence, to refer to a property of a vertex, use "v.[KEY_NAME]" in the query string. Likewise, for edges write "e.[KEY_NAME]". -<> and <> support the http://lucene.apache.org/core/4_1_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html[Lucene query syntax]. Refer to the http://lucene.apache.org/core/4_1_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html[Lucene documentation] or the http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html[Elasticsearch documentation] for more information. The query used in the example above follows the Lucene query syntax. +<> and <> support the http://lucene.apache.org/core/4_10_4/queryparser/org/apache/lucene/queryparser/classic/package-summary.html[Lucene query syntax]. Refer to the http://lucene.apache.org/core/4_1_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html[Lucene documentation] or the http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html[Elasticsearch documentation] for more information. The query used in the example above follows the Lucene query syntax. -[source,java] -graph.indexQuery("vertexByText","v.text:(farm uncle berry)").vertices() +[source, java] +graph.indexQuery("vertexByText", "v.text:(farm uncle berry)").vertices() This query matches all vertices where the text contains any of the three words (grouped by parentheses) and score matches higher the more words are matched in the text. -In addition <> supports wildcard queries, use "v.\*" or "e.*" in the query string to query if any of the properties on the element match. +In addition <> supports wildcard queries, use "v.\*" or "e.*" in the query string to query if any of the properties on the element match. Gotchas ~~~~~~~ @@ -51,19 +51,19 @@ Property Key Names Names of property keys that contain non-alphanumeric characters must be placed in quotation marks to ensure that the query is parsed correctly. -[source,java] -graph.indexQuery("vertexByText","v.\"first_name\":john").vertices() +[source, java] +graph.indexQuery("vertexByText", "v.\"first_name\":john").vertices() Element Identifier Collision ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The strings "v.", "e.", and "p." are used to identify a vertex, edge or property element respectively in a query. If the field name or the query value contains the same sequence of characters, this can cause a collision in the query string and parsing errors as in the following example: -[source,java] -graph.indexQuery("vertexByText","v.name:v.john").vertices() //DOES NOT WORK! +[source, java] +graph.indexQuery("vertexByText", "v.name:v.john").vertices() //DOES NOT WORK! To avoid such identifier collisions, use the `setElementIdentifier` method to define a unique element identifier string that does not occur in any other parts of the query: -[source,java] -graph.indexQuery("vertexByText","$v$name:v.john").setElementIdentifier("$v$").vertices() +[source, java] +graph.indexQuery("vertexByText", "$v$name:v.john").setElementIdentifier("$v$").vertices() diff --git a/docs/elasticsearch.txt b/docs/elasticsearch.txt index d5acc54672..02e33c2ab6 100644 --- a/docs/elasticsearch.txt +++ b/docs/elasticsearch.txt @@ -5,7 +5,7 @@ Elasticsearch //[.tss-center.tss-width-250] //image:titan-elasticsearch.png[] -[quote,'http://www.elasticsearch.org/overview/[Elasticsearch Overview]'] +[quote, 'http://www.elasticsearch.org/overview/[Elasticsearch Overview]'] Elasticsearch is a flexible and powerful open source, distributed, real-time search and analytics engine. Architected from the ground up for use in distributed environments where reliability and scalability are must haves, Elasticsearch gives you the ability to move easily beyond simple full-text search. Titan supports http://elasticsearch.org[Elasticsearch] as an index backend. Here are some of the Elasticsearch features supported by Titan: @@ -27,8 +27,8 @@ Elasticsearch Configuration Overview Titan supports two distinct configuration tracks for Elasticsearch. "Track" in this chapter means a set of configuration options. -. The new <> -. The <> +. The new <> +. The <> These tracks are mutually exclusive. A configuration uses one track or the other, but not both simultaneously. The `interface` track is recommended over the legacy track. The `interface` track, introduced in 0.5.1, offers a superset of the legacy track's functionality. The legacy track will be maintained through at least the end of the 0.5.x patch series. @@ -44,14 +44,14 @@ The `interface` Configuration Track The `interface` track is activated by setting either one of the following: -[source,properties] +[source, properties] ---- # Activate the interface track with ES's Node client index.search.elasticsearch.interface=NODE index.search.backend=elasticsearch ---- -[source,properties] +[source, properties] ---- # Or activate the interface with ES's TransportClient index.search.elasticsearch.interface=TRANSPORT_CLIENT @@ -82,14 +82,14 @@ Specifying an external ES `conf-file` The `index.[X].conf-file` option is interpreted as a path to an Elasticsearch YAML/JSON/properties file. The file must exist. If the path is relative, and the path appears in a Titan properties file on disk, then the path will be interpreted relative to the directory containing the Titan properties file in which it appears. The file will be opened and loaded using Elasticsearch's `ImmutableSettings.Builder.loadFromStream` method. This method will attempt to guess the file content's syntax by the filename extension; for this reason, it's recommended that the filename end in either ".json", ".yml", ".yaml", or ".properties", as appropriate, so that ES uses the correct parser. Here's an example configuration fragment: -[source,properties] +[source, properties] ---- index.search.backend=elasticsearch index.search.elasticsearch.interface=NODE # or TRANSPORT_CLIENT index.search.conf-file=/home/titan/elasticsearch_client.yaml ---- -[source,yaml] +[source, yaml] ---- # /home/titan/elasticsearch_client.yaml node.name=alice @@ -101,7 +101,7 @@ Embedding ES settings with `ext` Titan iterates over all properties prefixed with `index.[X].elasticsearch.ext.`, where `[X]` is an index name such as `search`. It strips the prefix from each property key. The remainder of the stripped key will be interpreted as an Elasticsearch configuration key. The value associated with the key is not modified. The stripped key and unmodified value are passed into the Elasticsearch client configuration. This allows embedding arbitrary Elasticsearch settings in Titan's properties. Here's an example configuration fragment showing how to specify the Elasticsearch `node.name` setting using the `ext` config mechanism: -[source,properties] +[source, properties] ---- index.search.backend=elasticsearch index.search.elasticsearch.interface=NODE # or TRANSPORT_CLIENT @@ -127,10 +127,10 @@ Transport Client Options In addition to common options described in <>, the Transport client requires one or more hosts to which to connect. These are supplied via Titan's `index.[X].hostname` key. Each host or host:port pair specified here will be added to the Transport client's round-robin list of request targets. This setting has no analog in an Elasticsearch configuration file and must be set through Titan's `index.[X].hostname` option. Here's a minimal Transport client configuration that will round-robin over 10.0.0.10 on the default Elasticsearch native protocol port (9300) and 10.0.0.20 on port 7777: -[source,properties] +[source, properties] index.search.backend=elasticsearch index.search.elasticsearch.interface=TRANSPORT_CLIENT # or NODE -index.search.hostname=10.0.0.10,10.0.0.20:7777 +index.search.hostname=10.0.0.10, 10.0.0.20:7777 Furthermore, the Transport client accepts the `index.[X].client-sniff` option. This can be set just as effectively through the `conf-file` or `ext` mechanisms. However, it can also be controlled through this Titan config option. This option exists for continuity with the legacy config track. @@ -158,14 +158,14 @@ Node Example: JVM-local Discovery The following Titan configuration and accompanying Elasticsearch config file create a Node which uses ES's JVM-local discovery. This means that the Node can only see other Nodes within the JVM. The Node does not listen for connections on network sockets or attempt to discover a cluster over the network. This is convenient when testing Titan in a single-machine setup. -[source,properties] +[source, properties] ---- index.search.backend=elasticsearch index.search.elasticsearch.interface=NODE index.search.conf-file=es_jvmlocal.yml ---- -[source,yaml] +[source, yaml] ---- # es_jvmlocal.yml node.data: true @@ -179,7 +179,7 @@ path.logs: es/logs The following configuration is similar to the one above, except it uses `ext` and the `index.[X].directory` Titan setting to locate the ES work, data, and log paths. When the `index.[X].directory` appears in a Titan properties file and is set to a relative path, that path is interpreted relative to the directory containing the Titan properties file. Compare this to setting `path.data`, `path.work`, and `path.logs` directly, which will be interpreted relative to the current working directory of the Java VM. -[source,properties] +[source, properties] ---- index.search.backend=elasticsearch index.search.elasticsearch.interface=NODE @@ -197,14 +197,14 @@ Node Example: Connecting to a Remote Cluster The following Titan configuration and accompanying Elasticsearch config file create a Node which discovers its cluster by sending unicast packets to `host1` on the default port and `host2` on `customport`. The Node client will attempt to learn all members of the cluster using `unicast.hosts` as the initial points of contact. Since the following config sets 'node.data=false' and 'node.client=true', the Node started by Titan won't store any persistent index data or attempt to become a master node. It discovers the cluster and routes requests using that information, but it doesn't hold any important state, so it can be lost without affecting Elasticsearch's availability or durability. -[source,properties] +[source, properties] ---- index.search.backend=elasticsearch index.search.elasticsearch.interface=NODE index.search.conf-file=es_netclient.yml ---- -[source,yaml] +[source, yaml] ---- # es_netclient.yml node.data: false @@ -215,14 +215,14 @@ discovery.zen.ping.unicast.hosts: [ "host1", "host2:customport" ] This configuration has the same effect as the one listed above, except using `ext` instead of `conf-file`. -[source,properties] +[source, properties] ---- index.search.backend=elasticsearch index.search.elasticsearch.interface=NODE index.search.elasticsearch.ext.node.data=false index.search.elasticsearch.ext.node.client=true index.search.elasticsearch.ext.discovery.zen.ping.multicast.enabled=false -index.search.elasticsearch.ext.discovery.zen.ping.unicast.hosts=host1,host2:customport +index.search.elasticsearch.ext.discovery.zen.ping.unicast.hosts=host1, host2:customport ---- Node Example: Joining an ES Cluster as a Data Node @@ -230,14 +230,14 @@ Node Example: Joining an ES Cluster as a Data Node This is similar to the example in the previous section, except the Node holds Elasticsearch data. This means Titan's Elasticsearch instance will be a full-fledged member of the Elasticsearch cluster, and if the process containing Titan and the ES Node dies, it could affect Elasticsearch's availability or durability. This is an uncommon configuration. -[source,properties] +[source, properties] ---- index.search.backend=elasticsearch index.search.elasticsearch.interface=NODE index.search.conf-file=es_clustermember.yml ---- -[source,yaml] +[source, yaml] ---- # es_clustermember.yml node.data: true @@ -252,7 +252,7 @@ discovery.zen.ping.unicast.hosts: [ "host1", "host2:customport" ] This configuration has the same effect as the one listed above, except using `ext` instead of `conf-file`. -[source,properties] +[source, properties] ---- index.search.backend=elasticsearch index.search.elasticsearch.interface=NODE @@ -264,7 +264,7 @@ index.search.elasticsearch.ext.path.data=es/data index.search.elasticsearch.ext.path.work=es/work index.search.elasticsearch.ext.path.logs=es/logs index.search.elasticsearch.ext.discovery.zen.ping.multicast.enabled=false -index.search.elasticsearch.ext.discovery.zen.ping.unicast.hosts=host1,host2:customport +index.search.elasticsearch.ext.discovery.zen.ping.unicast.hosts=host1, host2:customport ---- [[es-cfg-legacy-track]] @@ -276,7 +276,7 @@ The legacy configuration track allows running either a Transport client or a Nod This track is activated by omitting the `index.[X].elasticsearch.interface` option from Titan's configuration file. [WARNING] -The legacy track is not recommended for new deployments. Consider using the newer <> instead. +The legacy track is not recommended for new deployments. Consider using the newer <> instead. [[es-cfg-jvmlocal-legacy]] Embedded JVM-local Node Configuration @@ -286,7 +286,7 @@ The legacy track supports starting an Elasticsearch Node with JVM-local transpor Here's an example Titan configuration that starts a JVM-local Node using the legacy config track: -[source,properties] +[source, properties] ---- index.search.backend=elasticsearch # This will create /tmp/searchindex/work, /tmp/searchindex/logs, and @@ -308,10 +308,10 @@ The legacy track supports the Transport client. This can connect to Elasticsear To use the Transport client on the legacy track, add the following Titan options to the graph configuration file, where `hostname` lists the IP addresses of the Elasticsearch cluster nodes: -[source,properties] +[source, properties] ---- index.search.backend=elasticsearch -index.search.hostname=100.100.101.1,100.100.101.2 +index.search.hostname=100.100.101.1, 100.100.101.2 index.search.elasticsearch.client-only=true ---- @@ -365,7 +365,7 @@ Embedding ES index creation settings with `create.ext` Titan iterates over all properties prefixed with `index.[X].elasticsearch.create.ext.`, where `[X]` is an index name such as `search`. It strips the prefix from each property key. The remainder of the stripped key will be interpreted as an Elasticsearch index creation setting. The value associated with the key is not modified. The stripped key and unmodified value are passed as part of the `settings` object in the Elasticsearch create index request that Titan issues when bootstrapping on ES. This allows embedding arbitrary index creation settings settings in Titan's properties. Here's an example configuration fragment that customizes three Elasticsearch index settings using the `create.ext` config mechanism: -[source,properties] +[source, properties] ---- index.search.backend=elasticsearch index.search.elasticsearch.create.ext.number_of_shards=15 @@ -375,7 +375,7 @@ index.search.elasticsearch.create.ext.shard.check_on_startup=true The configuration fragment listed above takes advantage of Elasticsearch's assumption, implemented server-side, that unqualified `create index` setting keys have an `index.` prefix. It's also possible to spell out the index prefix explicitly. Here's a Titan config file functionally equivalent to the one listed above, except that the `index.` prefix before the index creation settings is explicit: -[source,properties] +[source, properties] ---- index.search.backend=elasticsearch index.search.elasticsearch.create.ext.index.number_of_shards=15 @@ -402,8 +402,8 @@ Classpath or Field errors When you see exception referring to lucene implementation details, make sure you don't have a conflicting version of Lucene on the classpath. Exception may look like this: -[source,text] -java.lang.NoSuchFieldError: LUCENE_41 +[source, text] +java.lang.NoSuchFieldError: LUCENE_4_10_4 Optimizing Elasticsearch ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -411,7 +411,7 @@ Optimizing Elasticsearch Write Optimization ^^^^^^^^^^^^^^^^^^ -For <> or other write-intense applications, consider increasing Elasticsearch's refresh interval. Refer to https://groups.google.com/d/topic/elasticsearch/yp6bTiP2JYE/discussion[this discussion] on how to increase the refresh interval and its impact on write performance. Note, that a higher refresh interval means that it takes a longer time for graph mutations to be available in the index. +For <> or other write-intense applications, consider increasing Elasticsearch's refresh interval. Refer to https://groups.google.com/d/topic/elasticsearch/yp6bTiP2JYE/discussion[this discussion] on how to increase the refresh interval and its impact on write performance. Note, that a higher refresh interval means that it takes a longer time for graph mutations to be available in the index. For additional suggestions on how to increase write performance in Elasticsearch with detailed instructions, please read http://blog.bugsense.com/post/35580279634/indexing-bigdata-with-elasticsearch[this blog post]. diff --git a/docs/eventualconsistency.txt b/docs/eventualconsistency.txt index 9d98c71a1a..4b1db6f3fd 100644 --- a/docs/eventualconsistency.txt +++ b/docs/eventualconsistency.txt @@ -9,14 +9,14 @@ This page summarizes some of the aspects to consider when running Titan on top o Data Consistency ~~~~~~~~~~~~~~~~ -On eventually consistent storage backends, Titan must obtain locks in order to ensure consistency because the underlying storage backend does not provide transactional isolation. In the interest of efficiency, Titan does not use locking by default. Hence, the user has to decide for each schema element that defines a consistency constraint whether or not to use locking. Use `TitanManagement.setConsistency(element,ConsistencyModifier.LOCK)` to explicitly enable locking on a schema element as shown in the following examples. +On eventually consistent storage backends, Titan must obtain locks in order to ensure consistency because the underlying storage backend does not provide transactional isolation. In the interest of efficiency, Titan does not use locking by default. Hence, the user has to decide for each schema element that defines a consistency constraint whether or not to use locking. Use `TitanManagement.setConsistency(element, ConsistencyModifier.LOCK)` to explicitly enable locking on a schema element as shown in the following examples. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() -name = mgmt.makePropertyKey('name').dataType(String.class).make() -index = mgmt.buildIndex('byName',Vertex.class).addKey(name).unique().buildCompositeIndex() -mgmt.setConsistency(name,ConsistencyModifier.LOCK) //Ensures only one name per vertex -mgmt.setConsistency(index,ConsistencyModifier.LOCK) //Ensures name uniqueness in the graph +name = mgmt.makePropertyKey('consistentName').dataType(String.class).make() +index = mgmt.buildIndex('byConsistentName', Vertex.class).addKey(name).unique().buildCompositeIndex() +mgmt.setConsistency(name, ConsistencyModifier.LOCK) //Ensures only one name per vertex +mgmt.setConsistency(index, ConsistencyModifier.LOCK) //Ensures name uniqueness in the graph mgmt.commit() When updating an element that is guarded by a uniqueness constraint, Titan uses the following protocol at the end of a transaction when calling `tx.commit()`: @@ -56,9 +56,10 @@ Forking Edges Because edge are stored as single records in the underlying storage backend, concurrently modifying a single edge would lead to conflict. Instead of locking, an edge label can be configured to use `ConsistencyModifier.FORK`. The following example creates a new edge label `related` and defines its consistency to FORK. -[source,gremlin] +[source, gremlin] +mgmt = g.openManagement() related = mgmt.makeEdgeLabel('related').make() -mgmt.setConsistency(related,ConsistencyModifier.FORK) +mgmt.setConsistency(related, ConsistencyModifier.FORK) mgmt.commit() When modifying an edge whose label is configured to FORK the edge is deleted and the modified edge is added as a new one. Hence, if two concurrent transactions modify the same edge, two modified copies of the edge will exist upon commit which can be resolved during querying traversals if needed. @@ -71,7 +72,7 @@ Multi-Properties Modifying single valued properties on vertices concurrently can result in a conflict. Similarly to edges, one can allow an arbitrary number of properties on a vertex for a particular property key defined with cardinality LIST and FORK on modification. Hence, instead of conflict one reads multiple properties. Since Titan allows properties on properties, provenance information like `author` can be added to the properties to facilitate resolution at read time. -See <> to learn how to define those. +See <> to learn how to define those. Data Inconsistency ~~~~~~~~~~~~~~~~~~ diff --git a/docs/exampleconfig.txt b/docs/exampleconfig.txt index 158fc19c49..3dd5d6c5d9 100644 --- a/docs/exampleconfig.txt +++ b/docs/exampleconfig.txt @@ -2,14 +2,14 @@ Example Graph Configuration ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -This page illustrates a number of common graph configurations. Please refer to <> and the pages of the respective <> <> for more information. +This page illustrates a number of common graph configurations. Please refer to <> and the pages of the respective <> <> for more information. Also, note that the Titan distribution includes local configuration files in the `conf/` directory. BerkeleyDB ^^^^^^^^^^ -[source,properties] +[source, properties] ---- storage.backend=berkeleyje storage.directory=/tmp/graph @@ -20,9 +20,9 @@ index.search.elasticsearch.client-only=false index.search.elasticsearch.local-mode=true ---- -This configuration file configures Titan to use <> as an embedded storage backend, meaning, Titan will start BerkeleyDB internally. The primary data will be stored in the directory `/tmp/graph`. +This configuration file configures Titan to use <> as an embedded storage backend, meaning, Titan will start BerkeleyDB internally. The primary data will be stored in the directory `/tmp/graph`. -In addition, this configures an embedded <> index backend with the name `search`. Titan will start Elasticsearch internally and it will not be externally accessible since `local-mode` is enabled. Elasticsearch stores all data for the `search` index in `/tmp/searchindex`. Configuring an index backend is optional. +In addition, this configures an embedded <> index backend with the name `search`. Titan will start Elasticsearch internally and it will not be externally accessible since `local-mode` is enabled. Elasticsearch stores all data for the `search` index in `/tmp/searchindex`. Configuring an index backend is optional. Cassandra ^^^^^^^^^ @@ -30,24 +30,24 @@ Cassandra Cassandra Remote ++++++++++++++++ -[source,properties] +[source, properties] ---- storage.backend=cassandra -storage.hostname=100.100.100.1,100.100.100.2 +storage.hostname=100.100.100.1, 100.100.100.2 index.search.backend=elasticsearch -index.search.hostname=100.100.101.1,100.100.101.2 +index.search.hostname=100.100.101.1, 100.100.101.2 index.search.elasticsearch.client-only=true ---- -This configuration file configures Titan to use <> as a remote storage backend. It assumes that a Cassandra cluster is running and accessible at the given IP addresses. If Cassandra is running locally, use the IP address `127.0.0.1`. +This configuration file configures Titan to use <> as a remote storage backend. It assumes that a Cassandra cluster is running and accessible at the given IP addresses. If Cassandra is running locally, use the IP address `127.0.0.1`. -In addition, this configures a remote <> index backend with the name `search`. It assumes that an Elasticsearch cluster is running and accessible at the given IP addresses. Enabling `client-only` ensures that the local instance does not join the existing Elasticsearch cluster as another node but only connects to it. Configuring an index backend is optional. +In addition, this configures a remote <> index backend with the name `search`. It assumes that an Elasticsearch cluster is running and accessible at the given IP addresses. Enabling `client-only` ensures that the local instance does not join the existing Elasticsearch cluster as another node but only connects to it. Configuring an index backend is optional. Embedded Cassandra ++++++++++++++++++ -[source,properties] +[source, properties] ---- storage.backend=embeddedcassandra storage.conf-file=config/cassandra.yaml @@ -58,14 +58,14 @@ index.search.elasticsearch.client-only=false index.search.elasticsearch.local-mode=true ---- -This configuration file configures Titan to start <> internally embedded in Titan and specifies the yaml configuration file for Cassandra. Cassandra is still accessible externally and can connect to other available Cassandra nodes to form a cluster as configured in the yaml file. +This configuration file configures Titan to start <> internally embedded in Titan and specifies the yaml configuration file for Cassandra. Cassandra is still accessible externally and can connect to other available Cassandra nodes to form a cluster as configured in the yaml file. The optional index backend configuration is identical to embedded index configuration described above. HBase ^^^^^ -[source,properties] +[source, properties] ---- storage.backend=hbase storage.hostname=127.0.0.1 @@ -76,6 +76,6 @@ index.search.hostname=127.0.0.1 index.search.elasticsearch.client-only=true ---- -This configuration file configures Titan to use <> as a remote storage backend. It assumes that an HBase cluster is running and accessible at the given IP addresses through the configured port. If HBase is running locally, use the IP address `127.0.0.1`. +This configuration file configures Titan to use <> as a remote storage backend. It assumes that an HBase cluster is running and accessible at the given IP addresses through the configured port. If HBase is running locally, use the IP address `127.0.0.1`. The optional index backend configuration is identical to remote index configuration described above. diff --git a/docs/generating.txt b/docs/generating.txt index 883bad28f9..0cffea90b1 100644 --- a/docs/generating.txt +++ b/docs/generating.txt @@ -5,41 +5,45 @@ Generating Artificial Natural Graphs [.tss-floatleft.tss-width-125] image:splash-graph.png[] -Real-world graphs are not http://en.wikipedia.org/wiki/Random_graph[random]. Example real-world graphs include social graphs, word graphs, neural graphs, airline graphs, water flow graphs, etc. Interestingly enough, there is a simple statistical understanding of most natural graphs. In short, many vertices have few connections and very few vertices have many connections. A popular algorithm to generate a graph that has this connectivity pattern is known as the http://en.wikipedia.org/wiki/Preferential_attachment[preferential attachment] algorithm which can be simply described with the colloquial phrase: "the rich get richer." This section provides some simple code to artificially generate a natural looking graph in Titan using http://gremlin.tinkerpop.com[Gremlin]. +Real-world graphs are not http://en.wikipedia.org/wiki/Random_graph[random]. Example real-world graphs include social graphs, word graphs, neural graphs, airline graphs, water flow graphs, etc. Interestingly enough, there is a simple statistical understanding of most natural graphs. In short, many vertices have few connections and very few vertices have many connections. A popular algorithm to generate a graph that has this connectivity pattern is known as the http://en.wikipedia.org/wiki/Preferential_attachment[preferential attachment] algorithm which can be simply described with the colloquial phrase: "the rich get richer." This section provides some simple code to artificially generate a natural looking graph in Titan using http://tinkerpop.incubator.apache.org/[Gremlin]. Generating a Graph with Natural Statistics ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The first thing to do is to connect to a Cassandra cluster with Titan. In the example below, a local connection is used where `storage.batch-loading` ensures more speedy performance. -[source,java] +[source, java] conf = new BaseConfiguration() -conf.setProperty('storage.backend','cassandra') -conf.setProperty('storage.hostname','127.0.0.1') -conf.setProperty('storage.batch-loading','true'); +conf.setProperty('storage.backend', 'cassandra') +conf.setProperty('storage.hostname', '127.0.0.1') +conf.setProperty('storage.batch-loading', 'true'); g = TitanFactory.open(conf) Next, the following script generates a graph with `size` number of edges. -[source,gremlin] -size = 100000; ids = [g.addVertex().id]; rand = new Random(); +[source, gremlin] +mgmt = g.openManagement() +follow = mgmt.makeEdgeLabel('linked').multiplicity(MULTI).make() +mgmt.commit() + +size = 100000; ids = [g.addVertex().id()]; rand = new Random(); (1..size).each { v = g.addVertex(); - u = g.v(ids.get(rand.nextInt(ids.size()))); - g.addEdge(v,u,'linked'); - ids.add(u.id); - ids.add(v.id); + u = g.traversal().V(ids.get(rand.nextInt(ids.size()))).next(); + v.addEdge('linked', u); + ids.add(u.id()); + ids.add(v.id()); if(it % 1000 == 0) - g.commit(); + g.tx().commit(); } Computing the In-Degree Distribution of the Graph ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,gremlin] +[source, gremlin] indegree = [:].withDefault{0} ids.unique().each{ - count = g.v(it).inE.count(); + count = g.traversal().V(it).inE().count(); indegree[count] = indegree[count] + 1; } -indegree.sort{a,b -> b.value <=> a.value} +indegree.sort{a, b -> b.value <=> a.value} diff --git a/docs/hadoop.txt b/docs/hadoop.txt index 67ec323604..7b91b03787 100644 --- a/docs/hadoop.txt +++ b/docs/hadoop.txt @@ -13,12 +13,12 @@ Here's a three step example showing some basic integrated Titan-TinkerPop functi [WARNING] -Titan 0.9.0's integration with TinkerPop 3.0.0 is still under active development. The APIs and configuration snippets shown below may change as Titan 0.9.0 and TinkerPop 3.0.0 move through milestone releases and eventually their respective final releases. The content of this chapter should be considered a tech preview rather than stable reference. +Titan 1.0.0's integration with TinkerPop 3.0.0 is still under active development. The APIs and configuration snippets shown below may change as Titan 1.0.0 and TinkerPop 3.0.0 move through milestone releases and eventually their respective final releases. The content of this chapter should be considered a tech preview rather than stable reference. Defining defining schema and loading data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,gremlin] +[source, gremlin] ---- bin/gremlin.sh @@ -63,11 +63,11 @@ gremlin> g = GraphFactory.open('conf/hadoop-load.properties') ==>hadoopgraph[kryoinputformat->kryooutputformat] gremlin> r = g.compute().program(BulkLoaderVertexProgram.build().titan('conf/titan-cassandra.properties').create()).submit().get() ... -==>result[hadoopgraph[kryoinputformat->kryooutputformat],memory[size:0]] +==>result[hadoopgraph[kryoinputformat->kryooutputformat], memory[size:0]] gremlin> ---- -[source,properties] +[source, properties] ---- # hadoop-load.properties @@ -87,7 +87,7 @@ giraph.minWorkers=1 giraph.maxWorkers=1 ---- -[source,gremlin] +[source, gremlin] ---- // grateful-dead-titan-schema.groovy @@ -117,18 +117,18 @@ titanGraph.close() Running PageRank ~~~~~~~~~~~~~~~~ -[source,gremlin] +[source, gremlin] ---- gremlin> g = GraphFactory.open('conf/run-pagerank.properties') ==>hadoopgraph[cassandrainputformat->kryooutputformat] gremlin> r = g.compute().program(PageRankVertexProgram.build().create()).submit().get() -INFO com.tinkerpop.gremlin.hadoop.process.computer.giraph.GiraphGraphComputer - HadoopGremlin(Giraph): PageRankVertexProgram[alpha=0.85,iterations=30] +INFO com.tinkerpop.gremlin.hadoop.process.computer.giraph.GiraphGraphComputer - HadoopGremlin(Giraph): PageRankVertexProgram[alpha=0.85, iterations=30] ... -==>result[hadoopgraph[cassandrainputformat->kryooutputformat],memory[size:0]] +==>result[hadoopgraph[cassandrainputformat->kryooutputformat], memory[size:0]] gremlin> ---- -[source,properties] +[source, properties] ---- # run-pagerank.properties @@ -154,7 +154,7 @@ giraph.maxWorkers=1 Reading vertices and printing ranks ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[source,gremlin] +[source, gremlin] ---- gremlin> g = GraphFactory.open('conf/read-pagerank-results.properties') ==>hadoopgraph[kryoinputformat->nulloutputformat] @@ -169,7 +169,7 @@ gremlin> g.V().map{[it.get().value('name'), it.get().value(PageRankVertexProgram gremlin> ---- -[source,properties] +[source, properties] ---- # read-pagerank-results.properties # Hadoop-Gremlin settings diff --git a/docs/hbase.txt b/docs/hbase.txt index 6c9544545b..1f644bd846 100644 --- a/docs/hbase.txt +++ b/docs/hbase.txt @@ -5,7 +5,7 @@ HBase [.tss-center.tss-width-250] image:http://hbase.apache.org/images/hbase_logo.png[link="http://hbase.apache.org"] -[quote,'http://hbase.apache.org/[Apache HBase Homepage]'] +[quote, 'http://hbase.apache.org/[Apache HBase Homepage]'] Apache HBase is an open-source, distributed, versioned, non-relational database modeled after http://static.googleusercontent.com/media/research.google.com/en/us/archive/bigtable-osdi06.pdf[Google's Bigtable: A Distributed Storage System for Structured Data by Chang et al.] Just as Bigtable leverages the distributed data storage provided by the Google File System, Apache HBase provides Bigtable-like capabilities on top of Hadoop and HDFS. HBase Setup @@ -23,15 +23,15 @@ HBase can be run as a standalone database on the same local host as Titan and th * Download and extract a stable HBase from http://www.apache.org/dyn/closer.cgi/hbase/stable/. * Start HBase by invoking the `start-hbase.sh` script in the _bin_ directory inside the extracted HBase directory. To stop HBase, use `stop-hbase.sh`. -[source,bourne] +[source, bourne] $ ./bin/start-hbase.sh starting master, logging to ../logs/hbase-master-machine-name.local.out Now, you can create an HBase TitanGraph as follows: -[source,java] +[source, java] TitanGraph g = TitanFactory.build() - .set("storage.backend","hbase") + .set("storage.backend", "hbase") .open(); Note, that you do not need to specify a hostname since a localhost connection is attempted by default. Also, in the Gremlin shell, you can not define the type of the variables `conf` and `g`. Therefore, simply leave off the type declaration. @@ -45,10 +45,10 @@ When the graph needs to scale beyond the confines of a single machine, then HBas For example, suppose we have a running HBase cluster with a ZooKeeper quorum composed of three machines at IP address 77.77.77.77, 77.77.77.78, and 77.77.77.79, then connecting Titan with the cluster is accomplished as follows: -[source,java] +[source, java] TitanGraph g = TitanFactory.build() - .set("storage.backend","hbase") - .set("storage.hostname","77.77.77.77,77.77.77.78,77.77.77.79") + .set("storage.backend", "hbase") + .set("storage.hostname", "77.77.77.77, 77.77.77.78, 77.77.77.79") .open(); `storage.hostname` accepts a comma separated list of IP addresses and hostname for any subset of machines in the HBase cluster Titan should connect to. Also, in the Gremlin shell, you can not define the type of the variables `conf` and `g`. Therefore, simply leave off the type declaration. @@ -67,7 +67,7 @@ http://rexster.titan.machine2/mygraph/tp/gremlin?script=g.v(1).out('follows').ou In this case, each Gremlin server server would be configured to connect to the HBase cluster. The following shows the graph specific fragment of the Gremlin server configuration. Refer to <> for a complete example and more information on how to configure the server. -[source,yaml] +[source, yaml] ---- ... graphs: { @@ -99,7 +99,7 @@ Deploying on Amazon EC2 [.tss-center.tss-width-250] image:http://cdn001.practicalclouds.com/user-content/1_Dave%20McCormick/logos/Amazon%20AWS%20plus%20EC2%20logo_scaled.png[link="http://aws.amazon.com/ec2/"] -[quote,'http://aws.amazon.com/ec2/[Amazon EC2]'] +[quote, 'http://aws.amazon.com/ec2/[Amazon EC2]'] Amazon EC2 is a web service that provides resizable compute capacity in the cloud. It is designed to make web-scale computing easier for developers. Follow these steps to setup an HBase cluster on EC2 and deploy Titan over HBase. To follow these instructions, you need an Amazon AWS account with established authentication credentials and some basic knowledge of AWS and EC2. @@ -110,7 +110,7 @@ The configuration described below puts one HBase master server in charge of thre Whirr 0.7.1 sometimes fails when run on a machine behind a NAT https://issues.apache.org/jira/browse/WHIRR-459[WHIRR-459]. For this reason, it's recommended to use at least Whirr 0.7.2. Whirr 0.8.0 was used to test the following commands on a t1.micro instance running Amazon Linux 2012.03. These commands might need tweaking to produce the intended results on environments besides a t1.micro instance running Amazon Linux 2012.03. -[source,bourne] +[source, bourne] ---- # These commands were executed on a t1.micro instance running Amazon Linux 2012.03 x86_64. # The AMI identifier for Amazon Linux 2012.03 x86_64 is ami-aecd60c7. @@ -181,31 +181,31 @@ Tips and Tricks for Managing an HBase Cluster The http://wiki.apache.org/hadoop/Hbase/Shell[HBase shell] on the master server can be used to get an overal status check of the cluster. -[source,bourne] +[source, bourne] $HBASE_HOME/bin/hbase shell From the shell, the following commands are generally useful for understanding the status of the cluster. -[source,ruby] +[source, ruby] status 'titan' status 'simple' status 'detailed' The above commands can identify if a region server has gone down. If so, it is possible to `ssh` into the failed region server machines and do the following: -[source,bourne] +[source, bourne] sudo -u hadoop $HBASE_HOME/bin/hbase-daemon.sh stop regionserver sudo -u hadoop $HBASE_HOME/bin/hbase-daemon.sh start regionserver The use of http://code.google.com/p/parallel-ssh/[pssh] can make this process easy as there is no need to log into each machine individually to run the commands. Put the IP addresses of the regionservers into a `hosts.txt` file and then execute the following. -[source,bourne] +[source, bourne] pssh -h host.txt sudo -u hadoop $HBASE_HOME/bin/hbase-daemon.sh stop regionserver pssh -h host.txt sudo -u hadoop $HBASE_HOME/bin/hbase-daemon.sh start regionserver Next, sometimes you need to restart the master server (e.g. connection refused exceptions). To do so, on the master execute the following: -[source,bourne] +[source, bourne] sudo -u hadoop $HBASE_HOME/bin/hbase-daemon.sh stop master sudo -u hadoop $HBASE_HOME/bin/hbase-daemon.sh start master diff --git a/docs/indexbackends.txt b/docs/indexbackends.txt index 4336599f8d..3f9e50f05c 100644 --- a/docs/indexbackends.txt +++ b/docs/indexbackends.txt @@ -7,9 +7,9 @@ image:titan-elasticsearch.png[] While Titan's composite graph indexes are natively supported through the primary storage backend, mixed graph indexes require that an indexing backend is configured. Mixed indexes provide support for geo, numeric range, and full-text search. -The choice of index backend determines which search features are supported, as well as the performance and scalability of the index. Titan currently supports three index backends: <>, <> and <>. +The choice of index backend determines which search features are supported, as well as the performance and scalability of the index. Titan currently supports three index backends: <>, <> and <>. -Use <> or <> when there is an expectation that Titan will be distributed across multiple machines. <> performs better in small scale, single machine applications. It performs better in unit tests, for instance. +Use <> or <> when there is an expectation that Titan will be distributed across multiple machines. <> performs better in small scale, single machine applications. It performs better in unit tests, for instance. include::searchpredicates.txt[] diff --git a/docs/inmemorybackend.txt b/docs/inmemorybackend.txt index 318fb9b7ae..7cca1bd41a 100644 --- a/docs/inmemorybackend.txt +++ b/docs/inmemorybackend.txt @@ -4,15 +4,15 @@ InMemory Storage Backend Titan ships with an in-memory storage backend which can be used through the following configuration: -[source,properties] +[source, properties] ---- storage.backend=inmemory ---- Alternatively, an in-memory Titan graph can be opened directly in the Gremlin shell: -[source,gremlin] -g = TitanFactory.build().set('storage.backend','inmemory').open() +[source, gremlin] +g = TitanFactory.build().set('storage.backend', 'inmemory').open() There are no additional configuration options for the in-memory storage backend. As the name suggests, this backend holds all data in memory. Shutting down the graph or terminating the process that hosts the Titan graph will irrevocably delete all data from the graph. This backend is local to a particular Titan graph instance and cannot be shared across multiple Titan graphs. diff --git a/docs/intro.txt b/docs/intro.txt index e7b7e2a69b..a06fd3da1a 100644 --- a/docs/intro.txt +++ b/docs/intro.txt @@ -19,9 +19,9 @@ General Titan Benefits * Support for very many concurrent transactions and operational graph processing. Titan's transactional capacity scales with the number of machines in the cluster and answers complex traversal queries on huge graphs in milliseconds. * Support for global graph analytics and batch graph processing through the Hadoop framework. * Support for geo, numeric range, and full text search for vertices and edges on very large graphs. -* Native support for the popular property graph data model exposed by http://www.tinkerpop.com[TinkerPop]. -* Native support for the graph traversal language http://www.tinkerpop.com[Gremlin]. -* Easy integration with the http://www.tinkerpop.com[Gremlin] graph server for programming language agnostic connectivity. +* Native support for the popular property graph data model exposed by http://tinkerpop.incubator.apache.org/[TinkerPop]. +* Native support for the graph traversal language http://tinkerpop.incubator.apache.org/[Gremlin]. +* Easy integration with the http://tinkerpop.incubator.apache.org/[Gremlin] graph server for programming language agnostic connectivity. * Numerous graph-level configurations provide knobs for tuning performance. * Vertex-centric indices provide vertex-level querying to alleviate issues with the infamous http://thinkaurelius.com/2012/10/25/a-solution-to-the-supernode-problem/[super node problem]. * Provides an optimized disk representation to allow for efficient use of storage and speed of access. @@ -95,17 +95,17 @@ adapters. Titan comes standard with the following adapters, but Titan's modular architecture supports third-party adapters. * Data storage: -** <> -** <> -** <> +** <> +** <> +** <> * Indices, which speed up and enable more complex queries: -** <> -** <> +** <> +** <> Broadly speaking, applications can interact with Titan in two ways: -* Embed Titan inside the application executing http://www.tinkerpop.com/docs/current/#graph-traversal-steps[Gremlin] queries directly against the graph within the same JVM. Query execution, Titan's caches, and transaction handling all happen in the same JVM as the application while data retrieval from the storage backend may be local or remote. -* Interact with a local or remote Titan instance by submitting Gremlin queries to the server. Titan natively supports the Gremlin Server component of the http://www.tinkerpop.com/[Tinkerpop] stack. +* Embed Titan inside the application executing http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/#graph-traversal-steps[Gremlin] queries directly against the graph within the same JVM. Query execution, Titan's caches, and transaction handling all happen in the same JVM as the application while data retrieval from the storage backend may be local or remote. +* Interact with a local or remote Titan instance by submitting Gremlin queries to the server. Titan natively supports the Gremlin Server component of the http://tinkerpop.incubator.apache.org/[Tinkerpop] stack. .High-level Titan Architecture and Context image::titan-architecture-layer-diagram.svg[] @@ -131,12 +131,12 @@ Gods. Ultimately, the Gods won and Jupiter took the throne as leader of the Gods. _______ -The examples in this section make extensive use of a toy graph distributed with Titan called _The Graph of the Gods_. This graph is diagrammed below. The abstract data model is known as a https://github.com/tinkerpop/blueprints/wiki/Property-Graph-Model[Property Graph Model] and this particular instance describes the relationships between the beings and places of the Roman pantheon. Moreover, special text and symbol modifiers in the diagram (e.g. bold, underline, etc.) denote different schematics/typings in the graph. +The examples in this section make extensive use of a toy graph distributed with Titan called _The Graph of the Gods_. This graph is diagrammed below. The abstract data model is known as a http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/#intro[Property Graph Model] and this particular instance describes the relationships between the beings and places of the Roman pantheon. Moreover, special text and symbol modifiers in the diagram (e.g. bold, underline, etc.) denote different schematics/typings in the graph. .Graph of the Gods image::graph-of-the-gods-2.png[] -[cols="1,4",options="header"] +[cols="1, 4", options="header"] |===== |visual symbol | meaning |bold key |a graph indexed key @@ -160,7 +160,7 @@ Titan can be downloaded from the https://github.com/thinkaurelius/titan/wiki/Dow // The default shell highlighting is so awful that I'd rather // have nothing unless/until it can be improved -// [source,bourne] +// [source, bourne] ---- $ unzip titan.zip Archive: titan.zip @@ -171,38 +171,35 @@ $ bin/gremlin.sh \,,,/ (o o) ------oOOo-(_)-oOOo----- -plugin activated: tinkerpop.server -plugin activated: tinkerpop.utilities -plugin activated: tinkerpop.sugar -plugin activated: tinkerpop.tinkergraph +-----oOOo-(3)-oOOo----- +09:12:24 INFO org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph - HADOOP_GREMLIN_LIBS is set to: /home/bryn/git/titan/bin/../lib plugin activated: tinkerpop.hadoop plugin activated: aurelius.titan gremlin> ---- -Note, that this tutorial assumes the activation of the `tinkerpop.sugar` package for more concise syntax. Please refer to the http://www.tinkerpop.com/docs/current/[Tinkerpop documentation] for more information on package handling. +Note, that this tutorial assumes the activation of the `tinkerpop.sugar` package for more concise syntax. Please refer to the http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/[Tinkerpop documentation] for more information on package handling. The Gremlin terminal is a http://groovy.codehaus.org/[Groovy] shell. Groovy is a superset of Java that has various shorthand notations that make interactive programming easier. Likewise Gremlin is a superset of Groovy with various shorthand notations that make graph traversals easy. The basic examples below demonstrate handling numbers, strings, and maps. The remainder of the tutorial will discuss graph-specific constructs. -[source,gremlin] +[source, gremlin] gremlin> 100-10 ==>90 gremlin> "Titan:" + " The Rise of Big Graph Data" ==>Titan: The Rise of Big Graph Data -gremlin> [name:'aurelius',vocation:['philosopher','emperor']] +gremlin> [name:'aurelius', vocation:['philosopher', 'emperor']] ==>name=aurelius ==>vocation=[philosopher, emperor] [TIP] -Refer to http://gremlindocs.com/[GremlinDocs], http://sql2gremlin.com/[SQL2Gremlin], and http://www.tinkerpop.com/docs/current/[Tinkerpop documentation] for more information about using Gremlin. +Refer to http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/[Tinkerpop documentation], http://gremlindocs.com/[GremlinDocs] and http://sql2gremlin.com/[SQL2Gremlin] for more information about using Gremlin. Loading the Graph of the Gods Into Titan ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The example below will open a Titan graph instance and load _The Graph of the Gods_ dataset diagrammed above. `TitanFactory` provides a set of static `open` methods, each of which takes a configuration as its argument and returns a graph instance. This tutorial calls one of these `open` methods on a configuration that uses the <> storage backend and the <> index backend, then loads _The Graph of the Gods_ using the helper class `GraphOfTheGodsFactory`. This section skips over the configuration details, but additional information about storage backends, index backends, and their configuration are available in <>, <>, and <>. +The example below will open a Titan graph instance and load _The Graph of the Gods_ dataset diagrammed above. `TitanFactory` provides a set of static `open` methods, each of which takes a configuration as its argument and returns a graph instance. This tutorial calls one of these `open` methods on a configuration that uses the <> storage backend and the <> index backend, then loads _The Graph of the Gods_ using the helper class `GraphOfTheGodsFactory`. This section skips over the configuration details, but additional information about storage backends, index backends, and their configuration are available in <>, <>, and <>. -[source,gremlin] +[source, gremlin] gremlin> g = TitanFactory.open('conf/titan-berkeleyje-es.properties') ==>titangraph[berkeleyje:../db/berkeley] gremlin> GraphOfTheGodsFactory.load(g) @@ -218,7 +215,7 @@ Please see the https://github.com/thinkaurelius/titan/blob/titan09/titan-core/sr For those using Titan/Cassandra (or Titan/HBase), be sure to make use of `conf/titan-cassandra-es.properties` (or `conf/titan-hbase-es.properties`) and `GraphOfTheGodsFactory.load()`. -[source,gremlin] +[source, gremlin] gremlin> g = TitanFactory.open('conf/titan-cassandra-es.properties') ==>titangraph[cassandrathrift:127.0.0.1] gremlin> GraphOfTheGodsFactory.load(g) @@ -229,28 +226,26 @@ Global Graph Indices The typical pattern for accessing data in a graph database is to first locate the entry point into the graph using a graph index. That entry point is an element (or set of elements) -- i.e. a vertex or edge. From the entry elements, a Gremlin path description describes how to traverse to other elements in the graph via the explicit graph structure. -Given that there is a unique index on `name` property, the Saturn vertex can be retrieved. The property map (i.e. the key/value pairs of Saturn) can then be examined. As demonstrated, the Saturn vertex has a `name` of "saturn," an `age` of 10000, and a `type` of "titan." The grandchild of Saturn can be retrieved with a traversal that expresses: "Who is Saturn's grandchild?" (the inverse of "father" is "child"). The result is Hercules. +Given that there is a unique index on `name` property, the Saturn vertex can be retrieved. The property map (i.e. the key/value pairs of Saturn) can then be examined. As demonstrated, the Saturn vertex has a `name` of "saturn, " an `age` of 10000, and a `type` of "titan." The grandchild of Saturn can be retrieved with a traversal that expresses: "Who is Saturn's grandchild?" (the inverse of "father" is "child"). The result is Hercules. -[source,gremlin] -gremlin> saturn = g.V.has('name','saturn').next() +[source, gremlin] +gremlin> saturn = g.traversal().V().has('name', 'saturn').next() ==>v[256] -gremlin> saturn.map() +gremlin> g.traversal().V(saturn).valueMap() ==>name=saturn ==>age=10000 -gremlin> saturn.in('father').in('father').name +gremlin> g.traversal().V(saturn).in('father').in('father').values('name') ==>hercules The property `place` is also in a graph index. The property `place` is an edge property. Therefore, Titan can index edges in a graph index. It is possible to query _The Graph of the Gods_ for all events that have happened within 50 kilometers of http://en.wikipedia.org/wiki/Athens[Athens] (latitude:37.97 and long:23.72). Then, given that information, which vertices were involved in those events. -[source,gremlin] -gremlin> g.E.has('place',WITHIN,Geoshape.circle(37.97,23.72,50)) -==>e[75s-16o-iz9-1z4][1536-battled->2560] -==>e[74w-16o-iz9-1s0][1536-battled->2304] -gremlin> g.E.has('place',WITHIN,Geoshape.circle(37.97,23.72,50)).map { - it.bothV.name.next(2) -} -==>[hercules, hydra] -==>[hercules, nemean] +[source, gremlin] +gremlin> g.traversal().E().has('place', WITHIN, Geoshape.circle(37.97, 23.72, 50)) +==>e[a9x-co8-9hx-39s][16424-battled->4240] +==>e[9vp-co8-9hx-9ns][16424-battled->12520] +gremlin> g.traversal().E().has('place', WITHIN, Geoshape.circle(37.97, 23.72, 50)).as('source').inV().as('god2').back('source').outV().as('god1').select('outV', 'inV').by('name'); +==>[god1:hercules, god2:hydra] +==>[god1:hercules, god2:nemean] Graph indices are one type of index structure in Titan. Graph indices are automatically chosen by Titan to answer which ask for all vertices (`g.V`) or all edges (`g.E`) that satisfy one or multiple constraints (e.g. `has` or `interval`). The second aspect of indexing in Titan is known as vertex-centric indices. Vertex-centric indices are utilized to speed up traversals inside the graph. Vertex-centric indices are described later. @@ -277,45 +272,45 @@ http://en.wikipedia.org/wiki/Hercules[Hercules], son of Jupiter and http://en.wi In the previous section, it was demonstrated that Saturn's grandchild was Hercules. This can be expressed using a `loop`. In essence, Hercules is the vertex that is 2-steps away from Saturn along the `in('father')` path. -[source,gremlin] -gremlin> hercules = saturn.as('x').in('father').jump('x'){it.loops() < 2}.next().valueMap +[source, gremlin] +gremlin> hercules = g.traversal().V(saturn).repeat(in('father')).times(2).next() ==>v[1536] Hercules is a demigod. To prove that Hercules is half human and half god, his parent's origins must be examined. It is possible to traverse from the Hercules vertex to his mother and father. Finally, it is possible to determine the `type` of each of them -- yielding "god" and "human." -[source,gremlin] -gremlin> hercules.out('father','mother') +[source, gremlin] +gremlin> g.traversal().V(hercules).out('father', 'mother') ==>v[1024] ==>v[1792] -gremlin> hercules.out('father','mother').name +gremlin> g.traversal().V(hercules).out('father', 'mother').values('name') ==>jupiter ==>alcmene -gremlin> hercules.out('father','mother').label() +gremlin> g.traversal().V(hercules).out('father', 'mother').label() ==>god ==>human gremlin> hercules.label() ==>demigod -The examples thus far have been with respect to the genetic lines of the various actors in the Roman pantheon. The https://github.com/tinkerpop/blueprints/wiki/Property-Graph-Model[Property Graph Model] is expressive enough to represent multiple types of things and relationships. In this way, _The Graph of the Gods_ also identifies Hercules' various heroic exploits --- his famous 12 labors. In the previous section, it was discovered that Hercules was involved in two battles near Athens. It is possible to explore these events by traversing `battled` edges out of the Hercules vertex. +The examples thus far have been with respect to the genetic lines of the various actors in the Roman pantheon. The http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/#intro[Property Graph Model] is expressive enough to represent multiple types of things and relationships. In this way, _The Graph of the Gods_ also identifies Hercules' various heroic exploits --- his famous 12 labors. In the previous section, it was discovered that Hercules was involved in two battles near Athens. It is possible to explore these events by traversing `battled` edges out of the Hercules vertex. -[source,gremlin] -gremlin> hercules.out('battled') +[source, gremlin] +gremlin> g.traversal().V(hercules).out('battled') ==>v[2304] ==>v[2560] ==>v[2816] -gremlin> hercules.out('battled').valueMap +gremlin> g.traversal().V(hercules).out('battled').valueMap() ==>{name=nemean} ==>{name=hydra} ==>{name=cerberus} -gremlin> hercules.outE('battled').has('time',gt,1).inV.name +gremlin> g.traversal().V(hercules).outE('battled').has('time', gt, 1).inV().values('name') ==>cerberus ==>hydra The edge property `time` on `battled` edges is indexed by the vertex-centric indices of a vertex. Retrieving `battled` edges incident to Hercules according to a constraint/filter on `time` is faster than doing a linear scan of all edges and filtering (typically `O(log n)`, where `n` is the number incident edges). Titan is intelligent enough to use vertex-centric indices when available. A `toString()` of a Gremlin expression shows a decomposition into individual steps. -[source,gremlin] -gremlin> hercules.outE('battled').has('time',gt,1).inV.name.toString() -==>[StartStep(v[1536]), TitanVertexStep(OUT,[battled],edge), HasStep([time,gt,1]), EdgeVertexStep(IN), PropertiesStep(value,[name])] +[source, gremlin] +gremlin> g.traversal().V(hercules).outE('battled').has('time', gt, 1).inV().values('name').toString() +==>[GraphStep([v[24744]],vertex), VertexStep(OUT,[battled],edge), HasStep([time,gt,1]), EdgeVertexStep(IN), PropertiesStep([name],value)] More Complex Graph Traversal Examples ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -331,46 +326,45 @@ The Gremlin traversals below provide more examples over _The Graph of the Gods_. Cohabiters of Tartarus ++++++++++++++++++++++ -[source,gremlin] -gremlin> pluto = g.V.has('name','pluto').next() +[source, gremlin] +gremlin> pluto = g.traversal().V().has('name', 'pluto').next() ==>v[2048] gremlin> // who are pluto's cohabitants? -gremlin> pluto.out('lives').in('lives').name +gremlin> g.traversal().V(pluto).out('lives').in('lives').values('name') ==>pluto ==>cerberus gremlin> // pluto can't be his own cohabitant -gremlin> pluto.out('lives').in('lives').except([pluto]).name +gremlin> g.traversal().V(pluto).out('lives').in('lives').except([pluto]).values('name') ==>cerberus -gremlin> pluto.as('x').out('lives').in('lives').except('x').name +gremlin> g.traversal().V(pluto).as('x').out('lives').in('lives').except('x').values('name') ==>cerberus Pluto's Brothers ++++++++++++++++ -[source,gremlin] +[source, gremlin] gremlin> // where do pluto's brothers live? -gremlin> pluto.out('brother').out('lives').name +gremlin> g.traversal().V(pluto).out('brother').out('lives').values('name') ==>sky ==>sea gremlin> // which brother lives in which place? -gremlin> pluto.out('brother').as('god').out('lives').as('place').select +gremlin> g.traversal().V(pluto).out('brother').as('god').out('lives').as('place').select() ==>[god:v[1024], place:v[512]] ==>[god:v[1280], place:v[768]] gremlin> // what is the name of the brother and the name of the place? -gremlin> pluto.out('brother').as('god').out('lives').as('place').select{it.name} +gremlin> g.traversal().V(pluto).out('brother').as('god').out('lives').as('place').select().by('name'); ==>[god:jupiter, place:sky] ==>[god:neptune, place:sea] Finally, Pluto lives in Tartarus because he shows no concern for death. His brothers, on the other hand, chose their locations based upon their love for certain qualities of those locations. -[source,gremlin] -gremlin> pluto.outE('lives').reason +[source, gremlin] +gremlin> g.traversal().V(pluto).outE('lives').values('reason') ==>no fear of death -gremlin> g.E.has('reason',CONTAINS,'loves') +gremlin> g.traversal().E().has('reason', CONTAINS, 'loves') ==>e[6xs-sg-m51-e8][1024-lives->512] ==>e[70g-zk-m51-lc][1280-lives->768] -gremlin> g.E.has('reason',CONTAINS,'loves').map{ - [it.outV.name.next(),it.reason,it.inV.name.next()] -} -==>[jupiter, loves fresh breezes, sky] -==>[neptune, loves waves, sea] +gremlin> g.traversal().E().has('reason', CONTAINS, 'loves').as('source').values('reason').as('reason').back('source').outV().values('name').as('god').back('source').inV().values('name').as('thing').select('god', 'reason', 'thing') +==>[god:neptune, reason:loves waves, thing:sea] +==>[god:jupiter, reason:loves fresh breezes, thing:sky] + diff --git a/docs/lucene.txt b/docs/lucene.txt index 30100a9835..e343efc6dd 100644 --- a/docs/lucene.txt +++ b/docs/lucene.txt @@ -5,10 +5,10 @@ Lucene //[.tss-center.tss-width-250] //image:titan-lucene.png[] -[quote,'http://lucene.apache.org/[Apache Lucene Homepage]'] +[quote, 'http://lucene.apache.org/[Apache Lucene Homepage]'] Apache Lucene is a high-performance, full-featured text search engine library written entirely in Java. It is a technology suitable for nearly any application that requires full-text search, especially cross-platform. Apache Lucene is an open source project available for free download. -Titan supports http://lucene.apache.org/[Lucene] as a single-machine, embedded index backend. Lucene has a slightly extended feature set and performs better in small-scale applications compared to <>, but is limited to single-machine deployments. +Titan supports http://lucene.apache.org/[Lucene] as a single-machine, embedded index backend. Lucene has a slightly extended feature set and performs better in small-scale applications compared to <>, but is limited to single-machine deployments. Lucene Embedded Configuration ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -17,7 +17,7 @@ For single machine deployments, Lucene runs embedded with Titan. Titan starts an To run Lucene embedded, add the following configuration options to the graph configuration file where `/tmp/searchindex/`specifies the directory where Lucene should store the index data: -[source,properties] +[source, properties] index.search.backend=lucene index.search.directory=/tmp/searchindex @@ -40,7 +40,7 @@ Refer to <> for a complete listing of all Lucene specific conf Note, that each of the index backend options needs to be prefixed with `index.[INDEX-NAME].` where `[INDEX-NAME]` stands for the name of the index backend. For instance, if the index backend is named _search_ then these configuration options need to be prefixed with `index.search.`. To configure an index backend named _search_ to use Lucene as the index system, set the following configuration option: -[source,properties] +[source, properties] index.search.backend = lucene Further Reading diff --git a/docs/monitoring.txt b/docs/monitoring.txt index b45296d336..0023d28dbf 100644 --- a/docs/monitoring.txt +++ b/docs/monitoring.txt @@ -16,7 +16,7 @@ Configuring Metrics Collection To enable Metrics collection, set the following in Titan's properties file: -[source,properties] +[source, properties] ---- # Required to enable Metrics in Titan metrics.enabled = true @@ -29,7 +29,7 @@ Customizing the Default Metric Names Titan prefixes all metric names with "com.thinkaurelius.titan" by default. This prefix can be set through the `metrics.prefix` configuration property. For example, to shorten the default "com.thinkaurelius.titan" prefix to just "titan": -[source,properties] +[source, properties] ---- # Optional metrics.prefix = titan @@ -42,10 +42,10 @@ Each Titan transaction may optionally specify its own Metrics name prefix, overr To do this, call `TransactionBuilder.setMetricsPrefix(String)`: -[source,java] -TitanGraph graph = ...; -TransactionBuilder tbuilder = graph.buildTransaction(); -TitanTransaction tx = tbuilder.setGroupName("foobar").start(); +[source, java] +TitanGraph g = ...; +TransactionBuilder tbuilder = g.buildTransaction(); +TitanTransaction tx = tbuilder.groupName("foobar").start(); Separating Metrics by Backend Store +++++++++++++++++++++++++++++++++++ @@ -60,13 +60,13 @@ Titan supports the following Metrics reporters: // TODO this bulleted list should be replaced by a TOC -* <> -* <> -* <> -* <> -* <> -* <> -* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> Each reporter type is independent of and can coexist with the others. For example, it's possible to configure Ganglia, JMX, and Slf4j Metrics reporters to operate simultaneously. Just set all their respective configuration keys in titan.properties (and enable metrics as directed above). @@ -75,7 +75,7 @@ Console Reporter Configuration ++++++++++++++++++++++++++++++ .Metrics Console Reporter Configuration Options -[cols="2,1,5,1",options="header"] +[cols="2, 1, 5, 1", options="header"] |========================== |Config Key |Required? |Value |Default |metrics.console.interval |yes |Milliseconds to wait between dumping metrics to the console |null @@ -83,7 +83,7 @@ Console Reporter Configuration Example titan.properties snippet that prints metrics to the console once a minute: -[source,properties] +[source, properties] metrics.enabled = true # Required; specify logging interval in milliseconds metrics.console.interval = 60000 @@ -93,7 +93,7 @@ CSV File Reporter Configuration +++++++++++++++++++++++++++++++ .Metrics CSV Reporter Configuration Options -[cols="2,1,5,1",options="header"] +[cols="2, 1, 5, 1", options="header"] |========================== |Config Key |Required? |Value |Default |metrics.csv.interval |yes |Milliseconds to wait between writing CSV lines |null @@ -102,7 +102,7 @@ CSV File Reporter Configuration Example titan.properties snippet that writes CSV files once a minute to the directory `./foo/bar/` (relative to the process's working directory): -[source,properties] +[source, properties] metrics.enabled = true # Required; specify logging interval in milliseconds metrics.csv.interval = 60000 @@ -113,7 +113,7 @@ Ganglia Reporter Configuration ++++++++++++++++++++++++++++++ .Metrics Ganglia Reporter Configuration Options -[cols="2,1,5,1",options="header"] +[cols="2, 1, 5, 1", options="header"] |========================== |Config Key |Required? |Value |Default |metrics.ganglia.hostname |yes |Unicast host or multicast group to which our Metrics are sent | null @@ -128,7 +128,7 @@ Ganglia Reporter Configuration Example titan.properties snippet that sends unicast UDP datagrams to localhost on the default port once every 30 seconds: -[source,properties] +[source, properties] metrics.enabled = true # Required; IP or hostname string metrics.ganglia.hostname = 127.0.0.1 @@ -137,7 +137,7 @@ metrics.ganglia.interval = 30000 Example titan.properties snippet that sends unicast UDP datagrams to a non-default destination port and which also spoofs the IP and hostname reported to Ganglia: -[source,properties] +[source, properties] metrics.enabled = true # Required; IP or hostname string metrics.ganglia.hostname = 1.2.3.4 @@ -152,7 +152,7 @@ Graphite Reporter Configuration +++++++++++++++++++++++++++++++ .Metrics Graphite Reporter Configuration Options -[cols="2,1,5,1",options="header"] +[cols="2, 1, 5, 1", options="header"] |========================== |Config Key |Required? |Value |Default |metrics.graphite.hostname |yes |IP address or hostname to which https://graphite.readthedocs.org/en/latest/feeding-carbon.html#the-plaintext-protocol[Graphite plaintext protocol] data are sent |null @@ -163,7 +163,7 @@ Graphite Reporter Configuration Example titan.properties snippet that sends metrics to a Graphite server on 192.168.0.1 every minute: -[source,properties] +[source, properties] metrics.enabled = true # Required; IP or hostname string metrics.graphite.hostname = 192.168.0.1 @@ -175,7 +175,7 @@ JMX Reporter Configuration ++++++++++++++++++++++++++ .Metrics JMX Reporter Configuration Options -[cols="2,1,5,1",options="header"] +[cols="2, 1, 5, 1", options="header"] |========================== |Config Key |Required? |Value |Default |metrics.jmx.enabled |yes |Boolean |false @@ -185,7 +185,7 @@ JMX Reporter Configuration Example titan.properties snippet: -[source,properties] +[source, properties] metrics.enabled = true # Required metrics.jmx.enabled = true @@ -198,7 +198,7 @@ Slf4j Reporter Configuration ++++++++++++++++++++++++++++ .Metrics Slf4j Reporter Configuration Options -[cols="2,1,5,1",options="header"] +[cols="2, 1, 5, 1", options="header"] |========================== |Config Key |Required? |Value |Default |metrics.slf4j.interval |yes |Milliseconds to wait between dumping metrics to the logger |null @@ -207,7 +207,7 @@ Slf4j Reporter Configuration Example titan.properties snippet that logs metrics once a minute to the logger named `foo`: -[source,properties] +[source, properties] metrics.enabled = true # Required; specify logging interval in milliseconds metrics.slf4j.interval = 60000 @@ -220,7 +220,7 @@ User-Provided/Custom Reporter Configuration In case the Metrics reporter configuration options listed above are insufficient, Titan provides a utility method to access the single `MetricRegistry` instance which holds all of its measurements. -[source,java] +[source, java] ---- com.codahale.metrics.MetricRegistry titanRegistry = com.thinkaurelius.titan.util.stats.MetricManager.INSTANCE.getRegistry(); diff --git a/docs/multiquery.txt b/docs/multiquery.txt deleted file mode 100644 index 4bede415cb..0000000000 --- a/docs/multiquery.txt +++ /dev/null @@ -1,38 +0,0 @@ -[[multiquery]] -Faster Deep Traversals ----------------------- - -Deep traversals on a graph often require executing identical vertex queries on sets of vertices. For instance, retrieving all siblings of friends of some user vertex `v` executes an identical vertex centric query for each of `v` 's friends: - -[source,java] -for (Vertex f : v.getVertices(BOTH,"friend")) { - for (Vertex s : f.getVertices(BOTH,"sibling")) { - //Do something - } -} - -`getVertices(BOTH,"sibling")` is the same vertex query for each friend vertex `f`. The above code snippet is the default way of implementing this traversal and how the Gremlin query `v.both("friend").both("sibling")` gets executed. -However, if `v` has many friends, this requires executing many identical queries independently. - -Titan provides the `multiQuery(TitanVertex... vertices)` method to construct a vertex query for multiple vertices and execute it as one. By combining multiple requests into one, this method can significantly reduce query response times and increase query throughput, depending on the storage backend and the number of vertex queries that are combined into a multi-vertex query. - -[source,java] -TitanMultiVertexQuery mq = graph.multiQuery(); -mq.direction(BOTH).labels("sibling"); -for (Vertex f : v.getVertices(BOTH,"friend")) { - mq.addVertex((TitanVertex)f); -} -Map> results = mq.vertices(); - -A `TitanMultiVertexQuery` is identical to the standard `VertexQuery`/`TitanVertexQuery` with two differences: - -. The query is executed on multiple vertices at once. Those vertices are either provided to the multi-query factory method `multiQuery(TitanVertex… vertices)` or added `addVertex()` or `addAllVertices()` on the multi-query constructor -. When the query is executed via `vertices()`, `properties()`, or `titanEdges()` the results are returned as a map which contains the individual results for query on each of the added vertices. - -All other query specification methods remain the same, which makes it easy to substitute `TitanMultiVertexQuery` for `TitanVertexQuery` where performance can be improved by combining multiple queries. - -Please note: - -* `TitanMultiVertexQuery` is most effective when running Titan against a distributed storage backend since it greatly improves query performance by bundling inter-cluster communication and reducing message load. On a simple deployment scenario we observed an order magnitude performance improvement when combining 50 individual vertex queries into one multi-query. -* `limit()` applies to each individual result set and not to the entire result set of a multi-query. In other words, the semantics of limit() are identical to `VertexQuery`. -* `TitanMultiVertexQuery` is a Titan feature and not (yet) part of Blueprints and therefore not supported by Gremlin. We plan to make a case for multi-query in Blueprints after demonstrating its performance gains on a range of applications. diff --git a/docs/partitioning.txt b/docs/partitioning.txt index a262e591d4..68f22a5616 100644 --- a/docs/partitioning.txt +++ b/docs/partitioning.txt @@ -6,7 +6,7 @@ When the Titan cluster consists of multiple storage backend instances, the graph To enable explicit graph partitioning in Titan, the following configuration options must be set when the Titan cluster is initialized. -[source,properties] +[source, properties] cluster.partition = true cluster.max-partitions = 32 ids.flush = false @@ -29,18 +29,18 @@ In assigning vertices to partitions one strives to optimize the assignmet such t Vertices are placed in a partition by way of the assigned vertex id. a partition is essentially a sequential range of vertex ids. To place a vertex in a particular partition, Titan chooses an id from the partition's range of vertex ids. Titan controls the vertex-to-partition assigment through the configured placement strategy. By default, vertices created in the same transaction are assigned to the same partition. This strategy is easy to reason about and works well in situations where frequently co-traversed vertices are created in the same transaction - either by optimizing the loading strategy to that effect or because vertices are naturally added to the graph that way. However, the strategy is limited, leads to imbalanced partitions when data is loaded in large transactions and not the optimal strategy for many use cases. The user can provide a use case specific vertex placement strategy by implementing the `IDPlacementStrategy` interface and registering it in the configuration through the `ids.placement` option. -When implementing `IDPlacementStrategy`, note that partitions are identified by an integer id in the range from 0 to the number of configured virtual partitions minus 1. For our example configuration, there are partitions 0,1,2,3,..31. Partition ids are not the same as vertex ids. +When implementing `IDPlacementStrategy`, note that partitions are identified by an integer id in the range from 0 to the number of configured virtual partitions minus 1. For our example configuration, there are partitions 0, 1, 2, 3, ..31. Partition ids are not the same as vertex ids. Vertex Cut ~~~~~~~~~~ -While edge cut optimization aims to reduce the cross communication and thereby improve query execution, vertex cuts address the hotspot issue caused by vertices with a large number of incident edges. While <> effectively address query performance for large degree vertices, vertex cuts are needed to address the hot spot issue on very large grahps. +While edge cut optimization aims to reduce the cross communication and thereby improve query execution, vertex cuts address the hotspot issue caused by vertices with a large number of incident edges. While <> effectively address query performance for large degree vertices, vertex cuts are needed to address the hot spot issue on very large grahps. Cutting a vertex means storing a subset of that vertex's adjacency list on each partition in the graph. In other words, the vertex and its adjacency list is partitioned thereby effectively distributing the load on that single vertex across all of the instances in the cluster and removing the hot spot. Titan cuts vertices by label. A vertex label can be defined as _partitioned_ which means that all vertices of that label will be partitiond across the cluster in the manner described above. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() mgmt.makeVertexLabel('user').make() mgmt.makeVertexLabel('product').partition().make() diff --git a/docs/recovery.txt b/docs/recovery.txt index 8a94a9b084..6f485d2edd 100644 --- a/docs/recovery.txt +++ b/docs/recovery.txt @@ -16,7 +16,7 @@ If the primary persistence into the storage backend succeeds but secondary persi However, this can create inconsistencies with the indexes and logs. To automatically repair such inconsistencies, Titan can maintain a transaction write-ahead log which is enabled through the configuration. -[source,properties] +[source, properties] tx.log-tx = true tx.max-commit-time = 10000 @@ -24,8 +24,8 @@ The max-commit-time property is used to determine when a transaction has failed. In addition, a separate process must be setup that reads the log to identify partially failed transaction and repair any inconsistencies caused. It is suggested to run the transaction repair process on a separate machine connected to the cluster to isolate failures. Configure a separately controlled process to run the following where the start time specifies the time since epoch where the recovery process should start reading from the write-ahead log. -[source,gremlin] -recovery = TitanFactory.startTransactionRecovery(graph,startTime,TimeUnit.MILLISECONDS); +[source, gremlin] +recovery = TitanFactory.startTransactionRecovery(graph, startTime, TimeUnit.MILLISECONDS); Enabling the transaction write-ahead log causes an additional write operation for mutating transactions which increases the latency. Also note, that additional space is required to store the log. The transaction write-ahead log has a configurable time-to-live of 2 days which means that log entries expire after that time to keep the storage overhead small. Refer to <> for a complete list of all log related configuration options to fine tune logging behavior. @@ -37,9 +37,9 @@ Titan is robust against individual instance failure in that other instances of t However, some schema related operations - such as installing indexes - require the coordination of all Titan instances. For this reason, Titan maintains a record of all running instances. If an instance fails, i.e. is not properly shut down, Titan considers it to be active and expects its participation in cluster-wide operations which subsequently fail because this instances did not participate in or did not acknowledge the operation. In this case, the user must manually remove the failed instance record from the cluster and then retry the operation. -To remove the failed instance, open a management transaction against any of the running Titan instances,inspect the list of running instances to identify the failed one, and finally remove it. +To remove the failed instance, open a management transaction against any of the running Titan instances, inspect the list of running instances to identify the failed one, and finally remove it. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() instances = mgmt.getOpenInstances() //all open instances mgmt.forceCloseInstance(instances.iterator().next()) //remove 1st instance diff --git a/docs/reindex.txt b/docs/reindex.txt index 4354921306..53dc7a5bb2 100644 --- a/docs/reindex.txt +++ b/docs/reindex.txt @@ -166,7 +166,7 @@ ManagementSystem.awaitGraphIndexStatus(g, 'names').status(SchemaStatus.REGISTERE // Reindex using TitanManagement m = g.openManagement() i = m.getGraphIndex('names') -m.updateIndex(i, SchemaAction.REINDEX).get() +m.updateIndex(i, SchemaAction.REINDEX) m.commit() // Enable the index diff --git a/docs/relatedmaterial.txt b/docs/relatedmaterial.txt index 3e9f8974cd..47bd1e8108 100644 --- a/docs/relatedmaterial.txt +++ b/docs/relatedmaterial.txt @@ -14,7 +14,7 @@ Articles & Posters * http://thinkaurelius.com/2013/05/13/educating-the-planet-with-pearson/[Educating the Planet with Pearson Education]: Presents a large-scale benchmark of Titan with a 121 billion edge graph. _(May 2013, in collaboration with Pearson Education)_ * http://thinkaurelius.github.com/titan/doc/titan-stress-poster.pdf[Titan: A Highly Scalable, Distributed Graph Database] (*poster*): A presentation of an initial stress test evaluation of Titan using real Twitter network data. _(July 2012, presented at http://graphlab.org/workshop2012/agenda/[GraphLab 2012 conference])_ * http://markorodriguez.com/2011/04/30/putting-and-getting-data-from-a-database/[Brief Primer on Graph Databases] -* https://github.com/tinkerpop/blueprints/wiki/Property-Graph-Model[Property Graph Model] +* http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/#intro[Property Graph Model] Slide Presentations ~~~~~~~~~~~~~~~~~~~ diff --git a/docs/searchpredicates.txt b/docs/searchpredicates.txt index 0ba756d7ee..7db336aabf 100644 --- a/docs/searchpredicates.txt +++ b/docs/searchpredicates.txt @@ -19,7 +19,7 @@ The `Compare` enum specifies the following self-explanatory comparison predicate Text Predicate ~~~~~~~~~~~~~~ -The `Text` enum specifies the <> used to query for matching text or string values. We differentiate between two types of predicates: +The `Text` enum specifies the <> used to query for matching text or string values. We differentiate between two types of predicates: * Text search predicates which match against the individual words inside a text string after it has been tokenized. These predicates are not case sensitive. ** CONTAINS: is true if (at least) one word inside the text string matches the query string @@ -42,27 +42,27 @@ Query Examples The following query examples demonstrate some of the predicates on the tutorial graph. -[source,java] +[source, java] // 1) Find vertices with the name "hercules" -g.V.has("name","hercules") +g.traversal().V().has("name", "hercules") // 2) Find all vertices with an age greater than 50 -g.V.has("age",gt,50) +g.traversal().V().has("age", gt, 50) // or find all vertices between 1000 (inclusive) and 5000 (exclusive) years of age and order by increasing age -g.V.has("age",gte,1000).has("age",lt,5000).orderBy("age",incr) +g.traversal().V().has("age", inside, [1000, 5000]).order().by("age", incr) // which returns the same result set as the following query but in reverse order -g.V.interval("age",1000,5000).orderBy("age",decr) +g.traversal().V().has("age", inside, [1000, 5000]).order().by("age", decr) // 3) Find all edges where the place is at most 50 kilometers from the given latitude-longitude pair -g.E.has("place",WITHIN,Geoshape.circle(37.97,23.72,50)) +g.traversal().E().has("place", WITHIN, Geoshape.circle(37.97, 23.72, 50)) // 4) Find all edges where reason contains the word "loves" -g.E.has("reason",CONTAINS,"loves") +g.traversal().E().has("reason", CONTAINS, "loves") // or all edges which contain two words (need to chunk into individual words) -g.E.has("reason",CONTAINS,"loves").has("reason",CONTAINS,"breezes") +g.traversal().E().has("reason", CONTAINS, "loves").has("reason", CONTAINS, "breezes") // or all edges which contain words that start with "lov" -g.E.has("reason",CONTAINS_PREFIX,"lov") +g.traversal().E().has("reason", CONTAINS_PREFIX, "lov") // or all edges which contain words that match the regular expression "br[ez]*s" in their entirety -g.E.has("reason",CONTAINS_REGEX,"br[ez]*s") +g.traversal().E().has("reason", CONTAINS_REGEX, "br[ez]*s") // 5) Find all vertices older than a thousand years and named "saturn" -g.V.has("age",gt,1000).has("name","saturn") +g.traversal().V().has("age", gt, 1000).has("name", "saturn") [[mixeddatatypes]] @@ -91,20 +91,20 @@ Geospatial index lookups are only supported via mixed indexes. To construct a Geoshape use the following methods: -[source,java] +[source, java] //lat, lng -Geoshape.point(37.97,23.72) +Geoshape.point(37.97, 23.72) //lat, lng, radius in km -Geoshape.circle(37.97,23.72,50) +Geoshape.circle(37.97, 23.72, 50) //SW lat, SW lng, NE lat, NE lng -Geoshape.box(37.97,23.72,38.97,24.72) +Geoshape.box(37.97, 23.72, 38.97, 24.72) In addition when importing a graph via GraphSON Point may be represented by: -[source,java] +[source, java] //string -"37.97,23.72" +"37.97, 23.72" //list -[37.97,23.72] +[37.97, 23.72] //GeoJSON feature { "type": "Feature", @@ -127,20 +127,21 @@ Note that unlike the Titan API GeoJSON specifies coordinates as lng lat. Collections ~~~~~~~~~~~ -If you are using <> then you can index properties with SET and LIST cardinality. +If you are using <> then you can index properties with SET and LIST cardinality. For instance: -[source,java] +[source, gremlin] mgmt = g.openManagement(); -PropertyKey nameProperty = mgmt.makePropertyKey("name").dataType(String.class).cardinality(Cardinality.SET).make(); -mgmt.buildIndex("search",Vertex.class).addKey(nameProperty).buildMixedIndex("search"); +nameProperty = mgmt.makePropertyKey("names").dataType(String.class).cardinality(Cardinality.SET).make(); +mgmt.buildIndex("search", Vertex.class).addKey(nameProperty, Mapping.STRING.asParameter()).buildMixedIndex("search"); +mgmt.commit(); //Insert a vertex -Vertex person = graph.addVertex(); -person.property("name", "Robert"); -person.property("name", "Bob"); -graph.tx().commit(); +person = g.addVertex(); +person.property("names", "Robert"); +person.property("names", "Bob"); +g.tx().commit(); //Now query it -g.V.has("name", "Bob").count().next(); //1 -g.V.has("name", "Robert").count().next(); //1 +g.traversal().V().has("names", "Bob").count().next(); //1 +g.traversal().V().has("names", "Robert").count().next(); //1 diff --git a/docs/serializer.txt b/docs/serializer.txt index cfc5b88e7c..f757d9c57c 100644 --- a/docs/serializer.txt +++ b/docs/serializer.txt @@ -5,7 +5,7 @@ Datatype and Attribute Serializer Configuration Titan supports a number of classes for attribute values on properties. Titan efficiently serializes primitives, primitive arrays, `Date`, `ArrayList` and `HashMap`. By default, Titan allows arbitrary objects as attribute values on properties, but those use default serializer which have significant overhead and may not be as efficient. .Serialization Configuration Options -[cols="4,7,2,2,1",options="header"] +[cols="4, 7, 2, 2, 1", options="header"] |========================== |Option |Description |Value |Default |Modifiable |attributes.allow-all | @@ -30,9 +30,10 @@ attributes.custom.attribute10.serializer-class = com.example.SpecialIntSerialize Custom Object Serialization ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Titan supports arbitrary objects as property attributes and uses http://code.google.com/p/kryo/[Kryo's] http://code.google.com/p/kryo/#Default_serializers[default serializers] to serialize such objects to disk. For this default serializer to work for a custom class, the following two conditions must be fulfilled: +Titan supports arbitrary objects as property attributes an can serialize such objects to disk. For this default serializer to work for a custom class, the following conditions must be fulfilled: +* The class must implement AttributeSerializer * The class must have a no-argument constructor * The class must implement the `equals(Object)` method -The second requirement is Titan specific because Titan will test both serialization and deserialization of a custom class before persisting data to disk. +The last requirement is Titan specific because Titan will test both serialization and deserialization of a custom class before persisting data to disk. diff --git a/docs/solr.txt b/docs/solr.txt index aab0e15e7c..927b2a0fb8 100644 --- a/docs/solr.txt +++ b/docs/solr.txt @@ -3,7 +3,7 @@ Solr ---- -[quote,'http://lucene.apache.org/solr/[Solr Homepage]'] +[quote, 'http://lucene.apache.org/solr/[Solr Homepage]'] Solr is the popular, blazing fast open source enterprise search platform from the Apache Lucene project. Solr is a standalone enterprise search server with a REST-like API. Solr is highly reliable, scalable and fault tolerant, providing distributed indexing, replication and load-balanced querying, automated failover and recovery, centralized configuration and more. Titan supports http://lucene.apache.org/solr/[Solr] as an index backend. Here are some of the Solr features supported by Titan: @@ -28,7 +28,7 @@ Connecting to SolrCloud When connecting to a SolrCloud enabled cluster by setting the `mode` equal to `cloud`, the Zookeeper URL (and optionally port) must be specified so that Titan can discover and interact with the Solr cluster. -[source,properties] +[source, properties] ---- index.search.backend=solr index.search.solr.mode=cloud @@ -43,7 +43,7 @@ Connecting via HTTP When connecting to Solr via HTTP by setting the `mode` equal to `http` a single or list of URLs for the Solr instances must be provided. -[source,properties] +[source, properties] ---- index.search.backend=solr index.search.solr.mode=http @@ -67,13 +67,13 @@ To create a new core that is compatible with Titan: . Copy the contents of titan/conf/solr to server/solr/{core_name}/conf . Open the Solr web interface and select Core Admin->Add Core . Change the name and instance dir to match your {core_name} -. Finish by clicking Add Core +. Finish by clicking 'Add Core' The core_name must match the index name used to build the index: -[source,gremlin] +[source, gremlin] ---- -mgmt.buildIndex('{core_name}',Vertex.class).addKey(name).buildMixedIndex("search") +mgmt.buildIndex('{core_name}', Vertex.class).addKey(name).buildMixedIndex("search") ---- Dynamic Field Definition @@ -83,7 +83,7 @@ By default, Titan uses Solr's https://cwiki.apache.org/confluence/display/solr/D Titan assumes the following dynamic field tags are defined in the backing Solr collection's schema.xml file: -[source,xml] +[source, xml] ---- @@ -138,9 +138,9 @@ Solr relies on Spatial4j for geo processing. Spatial4j declares an optional dep Here's a representative example from a Solr server log: -[source,text] +[source, text] ---- -ERROR [http-8983-exec-5] 2014-10-07 02:54:06,665 SolrCoreResourceManager.java (line 344) com/vividsolutions/jts/geom/Geometry +ERROR [http-8983-exec-5] 2014-10-07 02:54:06, 665 SolrCoreResourceManager.java (line 344) com/vividsolutions/jts/geom/Geometry java.lang.NoClassDefFoundError: com/vividsolutions/jts/geom/Geometry at com.spatial4j.core.context.jts.JtsSpatialContextFactory.newSpatialContext(JtsSpatialContextFactory.java:30) at com.spatial4j.core.context.SpatialContextFactory.makeSpatialContext(SpatialContextFactory.java:83) @@ -163,7 +163,7 @@ java.lang.NoClassDefFoundError: com/vividsolutions/jts/geom/Geometry Here's what normally appears in the output of the client that issued the associated `CREATE` command to the CoreAdmin API: -[source,text] +[source, text] ---- org.apache.solr.common.SolrException: com/vividsolutions/jts/geom/Geometry at com.datastax.bdp.search.solr.core.SolrCoreResourceManager.createCore(SolrCoreResourceManager.java:345) @@ -190,13 +190,13 @@ Install DataStax Enterprise as directed by the page http://www.datastax.com/docu Export `DSE_HOME` and append to `PATH` in your shell environment. Here's an example using Bash syntax: -[source,bourne] +[source, bourne] export DSE_HOME=/path/to/dse-version.number export PATH="$DSE_HOME"/bin:"$PATH" Install JTS for Solr. The appropriate version varies with the Spatial4j version. As of DSE 4.5.2, the appropriate version is 1.13. -[source,bourne] +[source, bourne] ---- cd $DSE_HOME/resources/solr/lib curl -O 'http://central.maven.org/maven2/com/vividsolutions/jts/1.13/jts-1.13.jar' @@ -204,7 +204,7 @@ curl -O 'http://central.maven.org/maven2/com/vividsolutions/jts/1.13/jts-1.13.ja Start DSE Cassandra and Solr in a single background daemon: -[source,bourne] +[source, bourne] ---- # The "dse-data" path below was chosen to match the # "Installing DataStax Enterprise using the binary tarball" @@ -217,7 +217,7 @@ The previous command will write some startup information to the console and to t Once DSE with Cassandra and Solr has started normally, check the cluster health with `nodetool status`. A single-instance ring should show one node with flags *U*p and *N*ormal: -[source,bourne] +[source, bourne] ---- nodetool status Note: Ownership information does not include topology; for complete information, specify a keyspace @@ -230,14 +230,14 @@ UN 127.0.0.1 99.89 KB 100.0% 5484ef7b-ebce-4560-80f0-cbdcd9e9f496 -7317038 ---- Next, switch to `gremlin.sh` and open a Titan database against the DSE instance. This will create Titan's keyspace and column families. -[source,gremlin] +[source, gremlin] ---- cd $TITAN_HOME bin/gremlin.sh \,,,/ (o o) ------oOOo-(_)-oOOo----- +-----oOOo-(3)-oOOo----- gremlin> g = TitanFactory.open('conf/titan-cassandra-solr.properties') ==>titangraph[cassandrathrift:[127.0.0.1]] gremlin> @@ -250,7 +250,7 @@ data. Next, upload configuration files for Titan's Solr collection, then create the core in DSE: -[source,bourne] +[source, bourne] ---- # Change to the directory where Titan was extracted. Later commands # use relative paths to the Solr config files shipped with the Titan @@ -276,11 +276,11 @@ SOLR_HOST=localhost:8983 # ships with this http-urls value. # Upload Solr config files to DSE Search daemon -for xml in conf/solr/{solrconfig,schema,elevate}.xml ; do +for xml in conf/solr/{solrconfig, schema, elevate}.xml ; do curl -v http://"$SOLR_HOST"/solr/resource/"$CORE_NAME/$xml" \ --data-binary @"$xml" -H 'Content-type:text/xml; charset=utf-8' done -for txt in conf/solr/{protwords,stopwords,synonyms}.txt ; do +for txt in conf/solr/{protwords, stopwords, synonyms}.txt ; do curl -v http://"$SOLR_HOST"/solr/resource/"$CORE_NAME/$txt" \ --data-binary @"$txt" -H 'Content-type:text/plain; charset=utf-8' done @@ -295,10 +295,10 @@ curl "http://localhost:8983/solr/admin/cores?action=STATUS&core=$CORE_NAME" ---- Now the Titan database and backing Solr core are ready for use. We -can test it out with the <> +can test it out with the <> dataset. Picking up the gremlin.sh session started above: -[source,gremlin] +[source, gremlin] ---- // Assuming g = TitanFactory.open('conf/titan-cassandra-solr.properties')... gremlin> GraphOfTheGodsFactory.load(g) diff --git a/docs/static/images/rexster-dog-house-gremlin.png b/docs/static/images/rexster-dog-house-gremlin.png deleted file mode 100644 index 76d1e548e0d54b3b66ce14b672d7c6c857e8034b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66582 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%0D&(Tlg^=jC_b z@K!J~IGsJ%d zQIV8@HPIwdnQqC>$`Wr3BuJ*L+mRuB<1jP%`yX6iTC{3gbqD6DAr_hfTs$1yG1Lm} zRlEa%`HOH{<|=w)tDflOm8D_N09q!2{+Peqh%O$xY>J+{%yZ{4@aFU~w5x;$z70-A z^HlvRMZq*vj@km?ivY5f2&xXDtnA6-z`!|56t49q6p#d{o`@!l4%LoIoi+zZKrZwV zSU<};Paa<^6k%;Zw?LWZji}h0gY6&@xv9zQAOQ=dFON&@TdVcn9MFgrU?HP90C6+U zY9%8{P!^=!Y+?XzB>MI4uU+RhP;;G zds)n%Zo8NaSYAD|G)D`x^pRqz?+56#>-3TrcfWS5{%AOxB&B1rU5A!QH zEkZo@i8$iXkuj$F_OB}zv;h2j;khZHr#(Ia;3>jIP(MB$DH?l$n9Em~>(n!TUOWIm zAq1kS{URR#b*g>Prt=br0VN3lY5U8H>5%>E(BT#Z3|F4JCgnbbdMmZGArDq=)Bo!@ z?*NWdmN)ek&aI~~7Khc!@{%k1L@9!?K;xx#jOC5ucFkn@FJfp@qzX|ad0LOBa zaP8)BiwDq^dy|gHKNwXS(C^)@6B}Mo@io9m`ai~h`n^{cV_bBlRAwwm=lunsES{kB zhyK7GeKBHja~s*1`+&p*@uXJNuc8AQh6eB;4YI#n3%$7m41$K)5W~;AeSmlL`{!1d zow}Lm59C105)Ul@z}6qI|LF?3zKg|E5uhvB)&l>69)BnA@8tbmc^6LN@5=k@HvhWK ze|Fiwd*0uGSJ~@HbWXn=1TG75>&X z|JFAD7N-9ervIV}e^G^B$m3r~=r5l4|4Teibhqo2rEfOkFsU+p-FwI`U}%9=T!^c@uLT zz^?xff=t<013BFIROVtFR!AAvQ_8%KjfP`NJSCGuhMU?-CrQ0{&+Z{{hPp zS0MVIX#QsmD39Jz*nhG^Zpp}XeHMOnoSpap<350?|DX4vEL~7S14G`3XxATuzf(S; z{a?V>EnkjG-c@8*Zf+%5ISulBUy+{|lUa$f5341KHv84+yMKlDUfsK{M_LxE{r0wJ z>B|Gy7qJft7>6rSg6KBFIE`#}yniSKl*&lV>8-pRZ$eh2pGe#UFKYU3F`tjngX;%y zO@P{TqTc*l?(1&YP`i8%V zg4Q#@m^W*-vMB@V!v*!Ap^GumPE%vs$h5#?da+bJKD{Z$IY6 zwWxKXqP8CYy5aXJIA}b>%>$w2__f51nmuEo!oa0r}A( zWtkOVRUG1Vmicr#BpP`2rDYucW_(mEQogh1f~U#h2I3Ft>;4Cc6GrXhgF3ke;?ppJs7RM$jCoNwbl* zSKdXR;<|R<2(0qE`^ALlQ@gPMA!O$L@W)#imF75~UUl&Qrc=-pVpbbiq=O^&>n7N7tfVELbUBMpp;hv_R-H5tooHoYq zqg}v}D`o{zH}Ifg=?nBAWv*Ss^V%|E;t(Hp>HFdCKiZDRa5SHNS8 zyImOnZSW3o7-stg3_<;y6ZuaQ${4_7yjQaK|J$G|z+r*C%TplxJ$paj9Pi>Wnq=wE zA^qKTh)iYo1c`UXf)t4CS~N+|29YtuyIiHj8K{1fBw(lreXq*L1+7i)!*_<_|}WBj@V%E}nDqx%?JuUVY8km&%5h%)IcPRmf7ZBW?}|7VUvr-rVj8cUQgHrX49eWDQu-G;2-*DN{s0 zgaI?vPt5I;h@H_tw~*He692u`0v#9!hRL{Z&EiyNq)=V|k-QsKgn z%l)IqBN)YN{8qbigotx_i_18jf+MSS_^UL#gwhj3pdzm7uC)@CsBV)^!-TUWNAo zL(pqjb6Bnz-KkdBLX!*o%c4(u?%2OW0yIo3z&)2XOEEuCuU`2GwvN}II8GBv_Q|UW z-&S*P-@1W1od(k6rrE6~?8_W&ABLuu(V7yDa=C z^}G+rG!NEZ#3`5}cZjP!rx+RykUt(G10k^CkX2GTZK^L}8(_W6QuBaFR>rKbxu`KO zlV_oJU#6#L2*#@S}(KkROX+PB&o=bq&Yjk}RC_Hsa_l|F+TYT3X&YF6l3NbPFw||mE ztJI~_Z=O)80nusL0i{nN{}0 zv)N3IS|6ZzbKJ~svSne-(eNgodPB2!OCxfOk>h5xZEJKj3fWYu{MMl{idD(IBFP+C z*E;;ryZ4hxNn@Q&6Ckc!vL+*a$&h@3!zI|%ZA*aQwgI`{RGO5pX(>5!!9p32&213s zT2sY&ppQ~WwkC5YCI{-id|{!4^`u3L+t8`72)%JXhWDyk-DJ@Vc*ymNSfG zKUGwJOB3S(-XbzpYjdZ%Y?fPpt4S}q>rj~%E+W^qvJ#4{N@0>2W%8E0+qI(9h1{Bg z&E&ysC14bdsvYYHB^cA@0(*`pGENaGb7rC8)|+m8Drn&BumMIT3!`0%kicQUa=;ud z?bO|fhi%pGO*;1!);D#jm)eMRf4sM4=`m7JQB+srhMKaeRmwhHW+FB_j|l?ZHlBIm z>TG>5y823ZEUT+MWB1-i!?mJyt?b()QSVhpE$)^ww+$G=3c6ui&vSQ@zGQ5N39dxs z(4dM4P^Y-yrhURa#F)f+O#|xyoND?5&2Mfr@bcA?K;Bu0mZzD=oZMfw;q5`QIiMX8 z!0Rcfx9`}|oxJH7*C{ck5$i7e@-XAT@a#!co-y~v`K(uu{$62C*1pqr+c?PxlV+Y< zLr&~zvNDZAW;Vp7HixUXKU_i8ZBqqRHU_iC(};xg*Z9Hq8N5OC96O|&(RZ^>9zNUG z8=L61{5FeVu`ugC?5E>bncI(@DP$#U{x`n9I8y@%oz>jb(O|d>>fD(q;@1G*tyvv9 zd(3I3n0#*yW#^jUUg(kI>WkCE3fN7x!M zmIH^)FmYQ(N_8a(ltXI5Gc&E#DkXED?KdW5oz!X_x>qeK9p0XbdWOnrK!)B!_HQCZ zfeSJhhIvQx*Ejd5{~SKQuuaxDfa!j}g+!ex=qjovRS(xWcgTsrm1Ho=`fR9f#=Cab zrM)49k*9WVQcyBy)j+e%O`8+_MmBfNSCWA9>d*;%ebRn8;z7kjv&>RUSS@``tx>Wi zJ%gM+y3w<@0#6`*8`dFeq1I}gcTg1?lA&nBULdD8czm)e$NlZHV_)wWur>=<6;k|< zCDT>WBS{lBt+%zpbjdN8*k)1_ZL#k&1{kh9WIjAVgvJIa3eO*U<7KXnm%jd#8F{Ey z`Zmd-K1J8}(Zhi~BTwPUgm z(qQ#ByeDJ@Immef9_&NzgdyA(NhyAeUx_Vqe0zg11^UNF_}D7|XGPY&jP;q^q>{%2 zN51>8?=HJBbYPy>IM5(VQK|VhC;GYJQK?e{MXf@*YO;&rM7>Y0s*{Df>XPD&a?4IO z4TPh7lAG!DAk>m%v@TmaBX6tms|CM))X|tf;f&)m&|!{J4|pU`qjzVx!cuMZrL8Zi zeAKa{s=-P|ethrB!6~!J3e99GNT+KR-#b7nYpTojIJ@62B@t~SCr z@!W#DzMaDg!d9l!(TmK3Fbq7ZxVOJ6wO<-GAsCywe%$=s1J3OLTi^~{?>feX)QpA5 zs-8_`oe*W?+;o&qS*TBc(f+)}=aP@TOOFNYc8X?W?mRWBF`+NOq2nsw406ohK6(^5hmTaYMYY>l2!X}bsZ<7!y>lCmGS+09Udx;! zWSlgNS(#UH#TG;tA-=T-XXqYHU$ZmwzkWoanan^rp ztZU04?VheU+EVXb5|o=a5sCDsK-H}vw~Qniz|TVul}c$PBkiArkT^yz2^O5F>hp>_ z=A>3o**_S@Ma5okACqs-F~rbLk%$2_?eRZOH@(Qb96nu?lV;Wi^XErS1#*}`%WSS_ z14I<44?0fjn-1TRD~iaK9wb5$Sz-vgrR^sub@<3&;%;I7nQDMxn$?NU4dSeih*?(y z;`8(`$L|NrDhA<6t=Vo>DiZ3x(m6DpL-11*{Y@wcoSF04zI$BghE~@j#F2<&oDGKvEk*g-&=n^hlj|VS>t6D&AyRa!0ezl`v%0N$8ynNo3 z4dfirN-P-{YO9Q=nFo0V(-x-lhW5%eoxiU=O02ba$vrY4cXl*-vwe(%TE_u7muw%d zA$1#($F0$+gu~Ziw@#pN6?4msyw>^cKpX^xaQ?3Aa_PHx{kRk{xtCyae$WkLq2z>} zA}kaBr)eu$PasZeH&?V+GV(|i9(*aV3%6J_@X#A2oh!hZI<^ZfwXfZlua2xW;BV?^ zKv5-f^fI=`4DOcWy6pj~0TbWHDFX ztsv((jTFcHBvE~QBdMdkDr5XVtV;x1m%^-(hYiRkHwkDQb-u;}gND+Ctz*0UunVJS;_)CU?0 zQ0F3z-tOXt>1R9GvktNoga!4y%u~#q0hqI{Q{0;dLYL=EG?fO3{s0l8?ZUh^-b5_W zo6)nThDSa@xwBt>*v;8P6g^|IS+a{_HCVO%#cFAest>**N5Vju)g7I@9Ivr4rXh1&SxBYw-hSj zf{D3=h*(TH)2!Zib}mF`K{(XI49pJb2n zI*EVIAF*?nBwOv+KSLrL4R?*A634Wm?b?S?oZBg$xjlI%HB|m{v9XBH_r@3y7y&z2 z{9m}5V??$fb2xBw9Io%w@%-_6ezGN_-q!}I&q`(FCoy+86Qf@`hha3!ibxG4QDTp0 zuWc_>h1!&+)u1!UJE>uU-t{N;?fF84c=jWfo|(!ATO~eb#>SvT`}b2rjdmD)+bfX( z&J#F7y5#4Q@r1%HGnbOPv2B}DXOdX|X6k3d0R2UrLikjatt?rJoU&JIh<~P6^ygjFA2^u2!W1nm|oUz68sif0Z5n zw#oJVna&A_Oivs=kKXJ}y^?Kuc#oq^-nKUcdxmi;$+ zO^7!?aLSeQnxH>F=^(UZ991E#9O|klH^EXQXG|dbR!Ah9GmEk^;mEzFFOn!HA|-b# zgpB$}_#K|OQr%3ch5d`#T(vG(E93JagX^sC8=~H2iJ@VN{`pY4U{a=(c5KbD zseLB$f8O<>iLdnKH(m-&75Rj8`iEM<_$R!9uDn5kQB%vb$1Xc53M8X(7Gwz|5_hPU zqpJdHX(fWLSCkFC7vZudvQA+5^3E6kUBa0P!|7KH<}4-Ge%m0kxJMxyOp^gahd;P8 zuOv;UIeL5vkLTGY5~z|9hcJ`${h$v?W*(C#{`zu#=3tE~AZ>-(R)4u5+hkrRxxtc9 z{>^1;iU+J||E@-!hEzRi?J|6Oz3p?I4&Fv-XyG?Q{?`PhLCyuyqa~!lN1oLBLZU9O z%QBc+7!FAlDV|O$h{tz1M`J!N)ZUJl^0u#uh`py4MVrU>q+QPQ`Pi?B(CbXDJJ!*;H2leC2Blxy;D5(^qAoXii=g`HK)o&r4vm-(O z8B}{Yv~31=G)p17pTC&vpJXyh*UF5oj2GV1V8^i3YF*zDgOAXdFU@ub)!%HA(~ zV?r=Ui{#SmqhZ=hUi5W*oa!V*6G;pv#0e;#a9K8J=k3FY_`n$C`RR@K!>ud<`2gw! zhDCNzQkj|4CV!nvR-;{k03Htd?KSXb3b>!ai1U_>iwhO)TgAZV=uO(%q0;bZx3(UBC7}{h~a$u*#ld zASjl&mAKh9Q+U(WtLP;vZuLQeHZ;qgIwQytb)9Sud^~cu2TPzSR<)NgOIh2j_=OvR z;zM_Y;e&<{zB{jOhVv+7Q9lmIoX5^e1a6!uzJINnFT%FVI}1Vp|5nm|=zpivlp|}K z(i`@Tq??ZQC~`dhYRljPCn9#GjfZ4Hf@1U8djBJ}2iFy4{BH`dvma@+8 zSKe54vF>^WsZNMkYoY&lCKZ91ymmdWemWJSPR0y7@Cw_rBb83JY@Lqh#7?d+0?x2A zAJ?0mTTGULsZ>bI<-QO_*St`~1SP@AZu(E{m1;a43uL=CFuK*&JFk$eE})GEGtzYk zV@OY}zCBF&fOw?P1W&cjk#b5Qc+&LLGhRcfxBq*scHDt8m2G_(O!vI<%uX=jJg3|8Vqc z)pby{nS~l;f;!K?GC*<{^Nk{JB!R)x1F)D@YY2-_OYx6llEh;;w(zP7E=LNoo7M?X}rTu z8~L%E4qtpkQ@bTaPE|FKPNkI_vMFatJK$?gP?yka+r1S@7ZpK2s+6C~7i3!)_451o zpp9*um;M_so%b@8>`FXpW$CK?od;b!R>djm)wgQ|if6j#oq|R#cgS7>n7DVlt7C}q zhLD9V^CGbgvsujAjui{-x}~^VmBp_EGX>%F-%Q(sY;Rw63uvmjek0UGN|rq^VW;%X z>&dwQ!wmOb7V-IK=gg0-}_on2Esv5!xXt4meK_FsGCLtv)pm&yE7P0&}uxG$+Ct&343{tr;V?%Wqe~; zB4ioG{Ilz$-|f7O-U&|}az~s&Pv=+)UD&s%uq}p|!C%nSaE39MSPhsW3(3>wc)_>? zRYMIR4-_I#wl+aR49u- zUBA}Z>%OiplAlm5!+x9m+j@yA5@t=wOhVmh3%b3TTE)CnVAodUrEk26I!SMjzijC> z4}rMS!EG9C^)x2y*3QAp!p9~=Qin{3?h{<${a5p;mghm(2T?rA?way!GYe(W1PVKJ zvTEC)2{t;?+7&tZGAG660wRQf{vud2kiw`QkhKXIF*TBuc&!^AA$}WS27oX^#_J9uL8g`rJzNaF!dnDP-%-(WW zoEd)8Vw7y{Jq2YS0yXIpSPcm-GKFZ^cca_}o4=lIFw}jK)h@02ahtm`l{u+* z9k|gFA|B2cXfvBx_ z0%0j~tN^lE$nDu4X;dhC44)!>g)H$fT5$?F8<&eBrNL-LNqogpSrB`amY^k28}M;A zia=yj7==ov2yxUFw2S#XdlgUbsQ68rKWoY3w-KmRdjic+AUpYj-^og-cl%y-lB%|d zR6GY=y?7U4=FSM*6Eh=?MW#w)dhXpJe36~@$Y zx5B*Tx9|8%*~VODPo%o_x=P-)MK>0M&iA4}t-PRBm*E4w3nZjq;#DHk+f;xHZ40@E zp@#S&I!Cbea@z;?F6j@N!CGC*;S(=~Lyd3(&iT3@-hW9-A2c9;>)bWb^&X#`u`FmiQgnBni90CMC^ONVBrBIWv-BPoCXM^rQGk0`4Nl}7YaO^S~q1axmuj^ZP&Ejp>WxtWKE&?UbjUXs{6^$dF$V>m>kTCe2B)cE+Kw$DlMjn(q9 zG}y#7e1=F3Q#g<+1%+2QU*1skIE~)09SNDifmitkGD%EYw*$JMJDgI-fvuRDa(1M_ zNo_l|*M_x04v@h3X!e0UeC_9q(yH51ItvPKrsUBAB`oGb(yVvrpFG+ylxix1v&;=) zn08$uSaW#eMkjq_N4UD9^j)ALywWu3<~?2XORMA`Up?JFRCKJ+gRICQrqdEzP!k$0L5`(=ihldHXiY@K<&G9j*}<80+y+ECtx@A)In})jrb?oWm=T;Q)x1`uuqq% zXkU`z#2?fckD?GRuFD$c$hNeHmCTPDwOdTwU_^@E@A_vRMLWjey&k+uE{~AKo~EK! zbHX)UF0uH+uD_@z?1V1j9AgSpM*?T&3!Ed1A6}YsVDGyM?0tG49%;e4?N`SNxN;=? z&yWELqmlfwyI_=zX2iK+DT%^%Uhco)WQ1upYI{UoA zn@96jHTMf$gj*br?O^+h@k&-m!jhlWefM2l3jY@3(GVjXBI8Zpp;o4H53CAHv4+Xm z6LV<}{(Up4&vt^J@5b|gl=Sb)8I-f%7l3Y6$qQ-1jnw&Ix=YyY8keIQKx1aR3;XVf z;tP4I8=`hqRPEBQ4VhDp8YGzDgVeoGyVt?7+KMF~swL+Oa}1zj&PWi6N1^ zt^deXU|y}p9u@ZZkVarJFf8n#EyBpUV>`gb&Nzx@>${S^U;pKQ3D?nvXb;qjkm8Wf*LLJ%P*DM9mF6nwV9Y7fYSzZxVX@f4hR0 zIDe~3Mc8~SY*)6TEGSc#5b?}10s@kcDK9DczPG0+FE8&IUBB63gU}<+A|PqU3V)M6 z@v`Y!EMA@9g8JDk7WQsx-|>pxcBnh}z#!rUhvUner^ix^2K6Ve(61Q3MTGGb>V9tE zIvsCaF{oA(CEjzylM!LfC}j}&ko__?CaXI9Q@rWbDU3@i4h@|N_mxK}o-8+-dI7jB zw!4hCN`+@KGtKd75!KsL+4-Q%HumqS&+xA*>3=0sqoHd@%(`(n&R4VUwrwMT8+6AC z^`F^AhTlD388C+v%7PIVq@G}*0?8CAdXB(G zQfZL9a*vJ^uk~anwa1Td5l!dKZ0|JHB#gHMGl!b`ud#4qroI$R(ur})67yXG+&XvP zwaTmiN$oU1Xotq?iRyWyh3Yl>JA;10shMQZYw@T2Ge&WCLmpSvxby|3480{ODl>3r z%*XI*y)`005sr@oy^aj%Qozyl168($8nh=n2XhRK$3m~`omN3S;Q;+>kGu4m^?R^Y zXe{9X-R2L1`T*xokz!!GG4|Syc73q_`nH{0UR-dQQj$PKLtTwYFV<$nj0z{_t%J zUuv5Mc0N^bi*g{x3?gMEBXsb1c`b~gg?Hvy(62Bh?M7>kq@4=wJw~-3UxL`w4tGC` zt+H+v;LAWKxhK|9(A~M_FE@HyK6WRuo+^kv*a3^#Ij)t>8YS_1-PIqbyQ*`iwaZqx zVO$hzB2z9(&}B2{%`I%;qI>7|7dR1iXkd=;moHRq-Qa&|LX`3KQ-i6+L({$^P3p?) zmxlg{6wrH(w+QQ8WFA|L>DD!B7fc(%x`hX|pX}bRflIFqVS6XN7 zo3BU)-T@m@s>Tm`aj0$89Go3*(SblEoB^Q$r;fv&5my*k#Efr@DFWeqjOVlCKo2AD z`g(tn?>v20v?(=_pibJm({(FFUyTyH&M~YL<@YSQ`5thY6+i31Q5V@5KfKwr!)+-P zT8~KQ2uu&{C#)o9?%tSX+L!)n?`p?cd^ws$zgv7Cy_3!|;!|PTL>g{rfxTNrhZ zf7mnSl)Z;V6w9l)Zk;iA^d@&>&F(nU-4RqUyc01#Fz&Tb6-oZ0j!xZBN_Abuo-`*G zQq*{qo03Ao6qO-!1-KLJQ6`=66Kykul(_0#r17HN?*uHE6*nIBP3opaAfs~usvvC*e=?cPG3Yy7R{nVXmuy15hGCQ z8T@|M%XT4tit+zeZMEK@EktqC$4`EAs9z*e_)YeqWIaT3^XreAS3Gh@+HM~W#R||@y01bIs#$!3y`!W18&z|Q-d=;6 zxH{e{IZei=d+xgHqOv0_|cwOSX!jlA?YVA>h zaJXp*3HOhg&5ad}7q$3)k%*VQy3<$rp(yLYb>9#B@z# zb+VMELp?b7#}6`RB8nkR=6bqY*#Q!uO|E<a3z$V?gw6GBO`fs^B? zr;%dD#Kc}ohq2`SVeu7D?)T0;-4aU;{RQO?mHu2YkVMv(UU#x)vO7gdrUhI3$5H93 zS>RROH}0!e?2c#d90c=h;seDPfxal+qL`l69UsNZ0r4x*&Fer|7n*WdF(L#&!;Dj0 zY|qrLWjPO{CLeO3)?}|((_E)+2ong0KAtR#j_h4|Fko*mT`9HO;_w^=?ZY8(Q)Uc$ z?VVP%PIDUeRlKPe6pD+I+JIgc+_KJeg0|0vS*B!%q~2ssIZKb4B^EcvYGwJ@eN8pk<4bo_cO#A$0pnKz%K3iT?+um?U{yJHENq%oktkB&E|WM3{9#+sXEPzcMKjyXmJqsV`6wG+A%s96mFfrM%BO78(SbzgPQ0G?8xnG!gcmF$JrF zZM0g<*Fyj_e*03ij&|KR3g{S*56b8})*fS}ciHZT{dVn_ITp?AH0^jsPjurSB^Nrl z=u5=eg`DyF)?JUAFVU^RW@SUI!vK7D-C zDf9c46$l$hGDb8ZM){3*91Jp&*H3YO>KRcU$yGQ1Rusr$z%Z5Ox&o+HSFYu36$<7*aI#hs>897_$R6st zg*s5&$+2N6LuU556Kodc<0+1X4sppKa*eFZKE){&W({dg$Q?;&J3mXn+2Fv7N^#mxW|D&&(u7FV7DSx>(v2m?OWQ7p}GOUr5X2LJtvhrAb7)zHkSKyiew>jM!M>qfHR0U0D0>T7pTNiAb817LaR^xNBMI!cF(u z4pm8f{gQI0%C=Iz9PWBSGDB-|k<%IjYEjy;8dejwZ{Wr`9`g#61)OO?RGR!*v3DtXK&DM1G3qBl zX1P7-h#!P8x?(4b8k472JgsFCYdUmiMZzL0%v8BH4CG+RoPx4btd882QJf1ILHE`i zdP0=>>VbV#tI>_S6OK{GS@P_%-8lfI0POY2Cu`RWo-v=d^t$UV`MVqV{RqxY-R$qp z+O=adiW25-fi`e*=g6;PHMWG16ODoyP^yTCa*tAa(okH*N-x3JGpkVJKwVMBH|pgqv? z*kzDK^NWr?LrWM?$UsongWvHCKo=#98w8c7OB9gdOsQ1nQ>1cNhZF8Pr#bf^g-*E^ zpg#I>;~bZbWC1!~i^W&V`9rv2gZx^m)l}rUfE|?mVG2PUu6y*!=m3n`@gb^-vC^=d552@!E+vREm z1QMF^Yt*_`tg7XUuh?^2K87|qP9P;wNEnM|t)$$UE)1R{qpP#c?dl~1B{h5Dej~QV zL;TLIn{ib1lPPY_cbzor-?L(=GoQxBkC;t)xIIxD%33XCTBwpXO->7HX@Ce%M&}ri zZ6jXjmk|BOzv7GTB1BoQl&~$e(6KDEd?&3WX>!xz&}82YVgHeIZ&(6{tK@n>I)T#Q zSH63e@ayd@y=JiMwJtHF$7|3PtuA`bu3ZR_%Ncq%w7YLP*}r(9)!??VyD}F_#L?2T zAt=+K(#LC+S=c&zk96BY>)ot5ct6Sf7z2DP-(*NE!PTCWN@1$}t}5rbQ?6b_Ja_iC ziCN;64Sk6&O@+6~#^bmIm0^A^LrnDdRT_YIxVp8CQNvyWy<}-V%z%fx_vxx?lTEvq zb&zEvt{x_Lg!MsaLM{$xw6ujb!TFpqjf^g5;+cqy{^WDi8`B?Ecp&g_(YfBi=FGKQ zMC{K#27mkZt-QSa9kTDuwL2{>E!hfjM<+YCN7RwgnMZxfw_M`CNH<8AhRg-TsaFa#S*`rz#(r_SV~@kQp*zS~A}uU@)>Lf%ggqhRFHJ z&Sb?}46|5SV`RM`zJ#j8Qx5`726YuT+Skwgt`UjxVwkV8lT3@*igzx$SKxXwzQ2j@ zemQ`9<-zDNhUV_D)`M4VYC{(!Dj4GG&--+Rfw3q(2vsYomSeFq^p?OrS3;RXJnNnljAIq?Yq}bF&beZf|LSV=6Q> z^aQ@Nrt-}|t}kk{ieFjL&(-f?xd+|^v2=>SefN?x=v4=!V$Dm_j((RN0=UH|g`qKu z-4@#c)^+ckGWO0h)NJOWom8TH#X)}Q5Y?0ed#03^r(hVPVj>@hh=>6U0;IuTPlUbB zQGSl6nQEtxkPGj-CbfZ3YXzkY3rJrl-#_?K3#Zw$^le*-T=@7WhTN zeB)LUMJ@6zYDlmM#$W}%_4Pl+33N%oTu98O6jJItq#a0KO$tG}e4$6P&m|b*ZtWEh z>C;%B0bIe-(ATSgMVuZVY|YeFnGK}JSFDbD#RI`N5!#}`x-S&zI$04cVpVj&`u}xx z9Z*dyT^M}w6hRRPAW~Ei0up+c5EYRo5TuI;KB{yfMp{5n0eMsj(o7LhBK^^e7;2~i z44@#rCP)bcq=ce>(D(npy5Bi-W@mTKnZ2_+bMJTW>{JC8Tjz^AGaUSjxJNZ=CBF#q zV3fY+^)p*`kPo}YCiTHWS{+?fB9sDVH;72`c?MYuGlxH|znVvT|CbpPb!$S`# z@X%%|P&!nta?fiLlg-uO%8X?}@UGsJ3p~?+Vut+*vp;FrDpF#)%^M^#%Z(qTy^CLg zBZ_B&(X4lb9|s!puAdqO`eIu`xVH40cP~STST?Le>0RxFdPHXwEFpjoqv?t#%0UTW zo^|u*Oc1th&}3Oy?;}zO6HF02XerAY(_%1nYhFGTx{a7#kEY}XVE(4$zL%r#fq8ld zRt=9clF`GxMxa1%)9vJE*F=L*bKK=W!;E(#GHu2o-lId1uOzzwm%J@Fw+(Z8W-WE;hRf7YjN~nvul5ME@UhlxCD{0vYlC+|!$xnC=Vm z`u{dF8T#J%ccj-JUw4h4ojsH4@&$MH8azRFg+TPJXni(tnN{2&&G$qgFSq#$ni;qzv_^9LY>=JK+2>&)s91E(q zV_U#H+MgD@GNJW9*o1`I227s=u_jU5)N4T0>GCl9eY8~^W^q}77n_n&>ac?%9>H|g zby}Jo61lo}+9^rC2IZsVZ#y~>Sc6`?5E_Vzfg0ec;M<`Tt8cXRKq7h8ta8(%JrCEl z(2>6fFmVe%;;*{mmF4Ode={2KcY+)cTdM4m-+~^9vp#QmY(fi~g6O0vN3EzMdNo@o zV3u_pyaW4uyAk41-ysWz@jN^HSrNWmr&Nkw36`3(8OkIZT>nF=_0LOdwSxYQ){vVU z!Hv&FZwUG>crLoXxnb0aTcQpEq^zPWT&=GN(bn!dX<9~VC{+Jt@a40y;hm4oJ#Xo- zDKj13xOvtjXrMopZ6TvMv@rOaa$tnh7UU?J741e)XD;e^)Cp`1EfhWzh7Za5QmA6q z8*r}1_(Xg?Y_ZPB$Kpx#CU%hz5NyRYO$F}kE_oKrKCj5|laQ2l&g^1`-{!sjc7`ka z@xB_MpRucl5Tytx$$#J9`?fva368FG4BRY!J+zF{)SUujssy=!@~HCJ7SY`YRmQ2B zb-9TlcF3&=nhx03Wwl8&6=ih&twvL5)`RGb9p0|9*m5x*digut3;X#vz_^9&(p*P> z#gevqEzz-k?}}V^Ue(C4cz-c%#yC<^dMiNB`8nX>;KW34PHI_guKR7A@tS(D^f@uf zsgK@gR)l-T2i00A?x@|i>lsL>RMYhFS)|m8p3nnRt-WX2Q9(mSX8z?{ItK5*ZrJ2F zl(B~DyG45&BxRBUY1S1b(Z(A!4}3>b=>UOHUJ#d5gij{$8sv(GbD;e{Yp}CKy4+UN zDBG6cD2%9S&`=TXF;h~nGLT-&n@cTIPP9eA2`9QXG8X*^}gXWYkVVdjD`}{IchzqT)4_ zX4J+XQg5o+qB7ucOW@W*ihpp>g9oVo<_}VdSM4Y#ay90d&yUs4)lU@T`UTN8uunDX z)|XS6FDg5b2j=IHQGt<59FvloQGr%?6%Aj5U zT)P4C;|-afiUD?yDarwMWV&y*;9wOf4YEjmT5!|lSi@pf-{ z9Gzvyvz&j0Py$Fu=jwB#R?BBtS%q3zxp}UP8#*PdFP%(*G7RQ%zdKr;gzWLp%qRH- ztm-ucfj90yZO3iLsI+df*2<^#V%~QEvzyL6gR0)YH3Rp`IfD#~EqmJ`e^=M_eyO=- zt10s8#h$k-5^W>x-s)uvv3p9wHTx>pb*t3je}eF7pqG8Hy&NNm8wguImcF{K$1#%2 za2T}AYn=#k=YKpLub_+dv{l!WAOV}#vkrM`y5QsX%iV8N(liK>DCzI-Uz_vtL zPCT=lwH7;FZ`|@+kCOzJ9OUZzqV=X~H|3v}^4Wl1X$>#*=;FMndJz5m1&>&q_9eix z9K1F0$$6Y0&6ZGKHW|(K3FoHLoM4fHy>bmguqT4B)5goQg`b_819-tnYN>(j!zAag zXY(Ti(&vy_(7sATY=1*&**_W6-Ypl}UEzzgaZm}EeN^pYFS|l4gr6#d#J2gVw9c1L61oz<+*IwqGwh&TTY1e~D0`-8{h1b|rA-lIiD2nQhEJR&hjadQa=(5F+ zIgdEUjrUm%F?)jdk$b2h64omVso&nya@BHm+5cdowt^I4O)5@+*^LGg5uxft&6cvg zv91)4L6{>h#GMsM;)sGU76u{L(zK1wn`P^K)@mPfyM5UNRNs3kI{00ss%6stz&vt6 zk2IX_;b-WResgX>s`o?3w;X+XOY59Xfexpl2$mQZE~=Ma> z@){>r+tv=C8lUTtfbRguk>@O+pDL(A+B|4nxG=&pNqU+DlTO4kn^12tzhRfhu*cF(qY>M;%SkiVq$I~pgbYvTD<-`!ao zF(D-Bb5&nF1Gu6*e1mfJWu*9n9(xkeJ94ws7u7%Pol(nDBxGQK=Q$-B{_K7}>lg~N zbqhBb%X$4!0NWJ^NKYH$78&Y3>$;`DF`hA%Uou^hXjWWDBhPYsq!HIT?y*N6c@y6_ zuQ5=LFdfLYnRHUvX`w0geDaW{$@G(OMAx=hY?K|ujRee=vkFUv?7R{xkTH{Ye3&Qx z09L-9L2`>JL6{3)F+oI;$r?&!=kI0> ze0cTZs-9)qL&UM(E@hx?Q2!DNDvZd?+kC5E~YV|OYB_e$s0xrnkO7>AiiSH_35wT8ee8p z1H9N5UcX)*Oh)(#Eq7$%lIIMX>?-U`wVkYYUrEJeXw*l)J2Lo~|5dZm3s7OGnTwQ| zlXx~Xz4Y+LTJ-gvZ9!*=QorGjYnH;^3hX+3A$_-y&=YpH9pV*Gqa_N1*DtcnkPIF` z^JSYA2o`?@ctrX9(8DlmtXmtA5>=1V)9 zza0az+7Q0TGX63IsZrvDYMj7KYlYGhi~sUy$;ZD17fR$9(=~xno#CauUS!Gl4 zG)Ec<*4guZSCaXb0ea_edCoN?p?L!(R@^J z$QBhDzP}8=A)C#O{wm4f2?F$CYx)9@gYI`P@ttD42eqc$LN(`#ZK7xEJgbIP1}9w0 za(IG^xGlR}i|?x3$vZXeTVZOO7`K{UDPg@sH^$&mV@KNp|GXAMsScz&Wwjf~VgrUE zHMnBxhgwET!n>0d6z5Q_@xslyAw`-w!BS+h2o@lnI=wjOb>EI1S`sAk1$U|f8ew!Y z$HSicV`4Rj3x4-1<2!dSPApUp*S9@TTc7lDLUaSj4%?FLAnX%pTXY$8%&7Lv)-!ZQ zvkKx;nt%MIkzOkbve|lsrZzX zH#>R$7%D?JebU2ofJNgcjgl(oO@{72iI@o-&4Q-29hf2PWcf64XMX?_(;qwf+E>im z(slup!w1?*b0QO&Jxvj?p?)=cygvgc(6aui+;_(NhN@Tph&9jGb&pJ2NzWKf$u-GE zS@xC!_Ij;`&ZkUxd$w=;e3YYbn_aQ zcgMVRrqcN_=~p!V3ul_w)6>^y^Uhka)LdYp6JK{rV9NPaZaYl{FzTF-+9#G(+~UX^ z@nxs7Rm%cqLmJN-9?|6Z1;v~JSy=mWzsYK|xr}e6Ci#FSg0L>#{HVO6-Y?!@#vbcf zhC70EDN60oFI)suIN~5eP&TcE`?vC}1D0YQdsUG6Ct8SMLtn-pM49mshgg3rCjpu0 z=3jcx#s6*Y#;+bAb8Ie4hkqhm7?)noGvb9V>`+eX{u)nxHc^&g#jmj_J~;G~ zN0@Ps$(IAdY#;Vi^#4mPzQ-A~^D(@|^hf*}zcLahC3X%gwBzE1G=`504^4NI_q<7$ zlzx96rlZ!#uoA?=2+lP>rMP|*oAYs$^|v?xhAgjP8%Dfr@?_(|oZkjBLq@7>>N}Vv zEKNX#tG@<2oMZ|IrZlV{#{|?jcDM$ zKDj|I#?y8@eDI`L*1MTNULz2CHtG+PJ&t9LZI)kU#}HqGiH1HIGsW>u;L>kh%{bLL dtTguJq4G%2!_N@}M<&Lhf6Z9CNbAm{{{R$~v_t>^ diff --git a/docs/static/images/rexster-dog-house-viz.png b/docs/static/images/rexster-dog-house-viz.png deleted file mode 100644 index 62904443bbb8c35172b1dd398b3962b6be4d54c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125427 zcmaI72UJsA(>_j>sz?*1N)stkMCqX^(g{U+m!>Ekfe=VQx`3gBbVURNrAm>|o76}L zfzW#iJp@Sd&;7pdzQ23#d)J?}SZAHAbN1OY^X!>Dv!994*Hgbr%}Px~M08bCAPA@)te4VjCIt_l%RC5-0Mo}6$`<*8xrLqv3~ z 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�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%0D%`=4?IcWt@J;408}!JEk*id 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 b?}+~o+;#S_kX8ZX00000NkvXXu0mjfL07h$ diff --git a/docs/static/images/rexster-system-arch.png b/docs/static/images/rexster-system-arch.png deleted file mode 100644 index a33a1368557f8d0c2f000f7e0f77a3c6d41983a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150078 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�K 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

34i4+a(>Gv;1NTh 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 JPDHLkV1hpkWJmx2 diff --git a/docs/textsearch.txt b/docs/textsearch.txt index b57cd5a982..412215538f 100644 --- a/docs/textsearch.txt +++ b/docs/textsearch.txt @@ -19,10 +19,10 @@ Full-Text Search By default, strings are indexed as text. To make this indexing option explicit, one can define a mapping when indexing a property key as text. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() summary = mgmt.makePropertyKey('booksummary').dataType(String.class).make() -mgmt.buildIndex('booksBySummary',Vertex.class).addKey(summary,Mapping.TEXT.asParameter()).buildMixedIndex("search") +mgmt.buildIndex('booksBySummary', Vertex.class).addKey(summary, Mapping.TEXT.asParameter()).buildMixedIndex("search") mgmt.commit() This is identical to a standard mixed index definition with the only addition of an extra parameter that specifies the mapping in the index - in this case `Mapping.TEXT`. @@ -42,10 +42,10 @@ String Search To index string properties as character sequences without any analysis or tokenization, specify the mapping as `Mapping.STRING`: -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() name = mgmt.makePropertyKey('bookname').dataType(String.class).make() -mgmt.buildIndex('booksBySummary',Vertex.class).addKey(name,Mapping.STRING.asParameter()).buildMixedIndex("search") +mgmt.buildIndex('booksBySummary', Vertex.class).addKey(name, Mapping.STRING.asParameter()).buildMixedIndex("search") mgmt.commit() When a string mapping is configured, the string value is indexed and can be queried "as-is" - including stop words and non-letter characters. However, in this case the query must match the entire string value. Hence, the string mapping is useful when indexing short character sequences that are considered to be one token. @@ -64,10 +64,10 @@ Full text and string search If you are using ElasticSearch it is possible to index properties as both text and string allowing you to use all of the predicates for exact and fuzzy matching. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() summary = mgmt.makePropertyKey('booksummary').dataType(String.class).make() -mgmt.buildIndex('booksBySummary',Vertex.class).addKey(summary,Mapping.TEXTSTRING.asParameter()).buildMixedIndex("search") +mgmt.buildIndex('booksBySummary', Vertex.class).addKey(summary, Mapping.TEXTSTRING.asParameter()).buildMixedIndex("search") mgmt.commit() Note that the data will be stored in the index twice, once for exact matching and once for fuzzy matching. @@ -81,10 +81,10 @@ Individual Field Mapping By default, Titan will encode property keys to generate a unique field name for the property key in the mixed index. If one wants to query the mixed index directly in the external index backend can be difficult to deal with and are illegible. For this use case, the field name can be explicitly specified through a parameter. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() name = mgmt.makePropertyKey('bookname').dataType(String.class).make() -mgmt.buildIndex('booksBySummary',Vertex.class).addKey(name,Parameter.of('mapped-name','bookname')).buildMixedIndex("search") +mgmt.buildIndex('booksBySummary', Vertex.class).addKey(name, Parameter.of('mapped-name', 'bookname')).buildMixedIndex("search") mgmt.commit() With this field mapping defined as a parameter, Titan will use the same name for the field in the `booksBySummary` index created in the external index system as for the property key. Note, that it must be ensured that the given field name is unique in the index. diff --git a/docs/titanbasics.txt b/docs/titanbasics.txt index e1191ee324..ff6ef98dac 100644 --- a/docs/titanbasics.txt +++ b/docs/titanbasics.txt @@ -23,22 +23,22 @@ Cassandra+Elasticsearch Sets up Titan to use the Cassandra persistence engine running locally and a remote Elastic search indexing system: -[source,properties] +[source, properties] ---- storage.backend=cassandra storage.hostname=localhost index.search.backend=elasticsearch -index.search.hostname=100.100.101.1,100.100.101.2 +index.search.hostname=100.100.101.1, 100.100.101.2 index.search.elasticsearch.client-only=true ---- HBase+Caching ^^^^^^^^^^^^^ -Sets up Titan to use the HBase persistence engine running remotely and uses Titan’s caching component for better performance. +Sets up Titan to use the HBase persistence engine running remotely and uses Titan's caching component for better performance. -[source,properties] +[source, properties] ---- storage.backend=hbase storage.hostname=100.100.101.1 @@ -56,7 +56,7 @@ BerkeleyDB Sets up Titan to use BerkeleyDB as an embedded persistence engine with ElasticSearch as an embedded indexing system. -[source,properties] +[source, properties] ---- storage.backend=berkeleyje storage.directory=/tmp/graph @@ -74,7 +74,7 @@ Further Examples There are several example configuration files in the `conf/` directory that can be used to get started with Titan quickly. Paths to these files can be passed to `TitanFactory.open(...)` as shown below: -[source,java] +[source, java] ---- // Connect to Cassandra on localhost using a default configuration graph = TitanFactory.open("conf/titan-cassandra.properties") @@ -97,9 +97,9 @@ Console The Titan distribution contains a command line Console which makes it easy to get started and interact with Titan. Invoke `bin/gremlin.sh` (Unix/Linux) or `bin/gremlin.bat` (Windows) to start the Console and then open a Titan graph using the factory with the configuration stored in an accessible properties configuration file: -[source,gremlin] +[source, gremlin] ---- -g = TitanFactory.open(‘path/to/configuration.properties’) +g = TitanFactory.open('path/to/configuration.properties') ---- Titan Embedded @@ -112,29 +112,30 @@ Short Codes If the Titan graph cluster has been previously configured and/or only the storage backend needs to be defined, TitanFactory accepts a colon-separated string representation of the storage backend name and hostname or directory. -[source,gremlin] +[source, gremlin] ---- -g = TitanFactory.open(‘cassandra:localhost’) +g = TitanFactory.open('cassandra:localhost') ---- -[source,gremlin] +[source, gremlin] ---- -g = TitanFactory.open(‘berkeleyje:/tmp/graph’) +g = TitanFactory.open('berkeleyje:/tmp/graph') ---- Titan Server ^^^^^^^^^^^^ -To interact with Titan remotely or in another process through a client, a Titan "server" needs to be configured and started. Internally, Titan uses Gremlin Server of the http://tinkerpop.com[TinkerPop] stack to service client requests, therefore, configuring Titan Server is accomplished through a Gremlin Server configuration file. +To interact with Titan remotely or in another process through a client, a Titan "server" needs to be configured and started. Internally, Titan uses Gremlin Server of the http://tinkerpop.incubator.apache.org/[TinkerPop] stack to service client requests, therefore, configuring Titan Server is accomplished through a Gremlin Server configuration file. To configure Gremlin Server with a `TitanGraph` instance the Gremlin Server configuration file requires the following settings: -[source,yaml] +[source, yaml] ---- ... graphs: { - g: conf/titan-berkeleyje.properties} + g: conf/titan-berkeleyje.properties +} plugins: - aurelius.titan ... @@ -161,17 +162,17 @@ Titan distinguishes between local and global configuration options. Local config * *GLOBAL_OFFLINE*: Like _GLOBAL_, but changing these options requires a cluster restart to ensure that the value is the same across the entire cluster. * *FIXED*: Like _GLOBAL_, but the value cannot be changed once the Titan cluster is initialized. -When the first Titan instance in a cluster is started, the global configuration options are initialized from the provided local configuration file. Subsequently changing global configuration options is done through Titan’s management API. To access the management API, call `g.getManagementSystem()` on an open Titan instance handle `g`. For example, to change the default caching behavior on a Titan cluster: +When the first Titan instance in a cluster is started, the global configuration options are initialized from the provided local configuration file. Subsequently changing global configuration options is done through Titan's management API. To access the management API, call `g.getManagementSystem()` on an open Titan instance handle `g`. For example, to change the default caching behavior on a Titan cluster: -[source,gremlin] +[source, gremlin] ---- mgmt = g.openManagement() -mgmt.get(‘cache.db-cache’) +mgmt.get('cache.db-cache') //Prints the current config setting -mgmt.set(‘cache.db-cache’,true) +mgmt.set('cache.db-cache', true) //Changes option -mgmt.get(‘cache.db-cache’) -//Prints ‘true’ +mgmt.get('cache.db-cache') +//Prints 'true' mgmt.commit() //Changes take effect ---- @@ -223,7 +224,7 @@ Edge Label Multiplicity The default multiplicity is MULTI. The definition of an edge label is completed by calling the `make()` method on the builder which returns the defined edge label as shown in the following example. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() follow = mgmt.makeEdgeLabel('follow').multiplicity(MULTI).make() mother = mgmt.makeEdgeLabel('mother').multiplicity(MANY2ONE).make() @@ -261,6 +262,7 @@ Titan natively supports the following data types. |Double |8 byte floating point number |Decimal |Number with 3 decimal digits |Precision |Number with 6 decimal digits +|Date |Date |Geoshape |Geographic shape like point, circle or box |UUID |UUID |===== @@ -280,7 +282,7 @@ Use `cardinality(Cardinality)` to define the allowed cardinality of the values a The default cardinality setting is SINGLE. Note, that property keys used on edges and properties have cardinality SINGLE. Attaching multiple values for a single key on an edge or property is not supported. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() birthDate = mgmt.makePropertyKey('birthDate').dataType(Long.class).cardinality(Cardinality.SINGLE).make() name = mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.SET).make() @@ -292,7 +294,7 @@ Relation Types Edge labels and property keys are jointly referred to as *relation types*. Names of relation types must be unique in the graph which means that property keys and edge labels cannot have the same name. There are methods in the Titan API to query for the existence or retrieve relation types which encompasses both property keys and edge labels. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() if (mgmt.containsRelationType('name')) name = mgmt.getPropertyKey('name') @@ -313,15 +315,15 @@ Although labels are optional at the conceptual and data model level, Titan assig To create a label, call `makeVertexLabel(String).make()` on an open graph or management transaction and provide the name of the vertex label as the argument. Vertex label names must be unique in the graph. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() person = mgmt.makeVertexLabel('person').make(); mgmt.commit() // Create a labeled vertex -person = g.addVertex(label,'person') +person = g.addVertex(label, 'person') // Create an unlabeled vertex v = g.addVertex() -g.commit() +g.tx().commit() Automatic Schema Maker ~~~~~~~~~~~~~~~~~~~~~~ @@ -335,12 +337,12 @@ It is strongly encouraged to explicitly define all schema elements and to disabl Changing Schema Elements ~~~~~~~~~~~~~~~~~~~~~~~~ -The definition of an edge label, property key, or vertex label cannot be changed once its committed into the graph. However, the names of schema elements can be changed via `TitanManagement.changeName(TitanSchemaElement,String)` as shown in the following example where the property key `place` is renamed to `location`. +The definition of an edge label, property key, or vertex label cannot be changed once its committed into the graph. However, the names of schema elements can be changed via `TitanManagement.changeName(TitanSchemaElement, String)` as shown in the following example where the property key `place` is renamed to `location`. -[source,gremlin] +[source, gremlin] mgmt = g.openManagement() place = mgmt.getPropertyKey('place') -mgmt.changeName(place,'location') +mgmt.changeName(place, 'location') mgmt.commit() Note, that schema name changes may not be immediately visible in currently running transactions and other Titan graph instances in the cluster. While schema name changes are announced to all Titan instances, it may take a while for them to take effect and it may require a instance restart in the event of certain failure conditions - like network partitions - if they coincide with the rename. Hence, the user must ensure that either of the following holds: @@ -356,107 +358,104 @@ However, note that this would not affect vertices, edges, or properties previous Gremlin Query Language ---------------------- -image:https://github.com/tinkerpop/gremlin/raw/master/doc/images/gremlin-logo.png[link="http://www.tinkerpop.com/docs/3.0.0.M6/"] +image:http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/images/gremlin-logo.png[link="http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/"] -http://gremlin.tinkerpop.com[Gremlin] is Titan's query language used to retrieve data from and modify data in the graph. Gremlin is a path-oriented language which succinctly expresses complex graph traversals and mutation operations. Gremlin is a http://en.wikipedia.org/wiki/Functional_programming[functional language] whereby traversal operators are chained together to form path-like expressions. For example, "from Hercules, traverse to his father and then his father's father and return the grandfather's name." +http://tinkerpop.incubator.apache.org/[Gremlin] is Titan's query language used to retrieve data from and modify data in the graph. Gremlin is a path-oriented language which succinctly expresses complex graph traversals and mutation operations. Gremlin is a http://en.wikipedia.org/wiki/Functional_programming[functional language] whereby traversal operators are chained together to form path-like expressions. For example, "from Hercules, traverse to his father and then his father's father and return the grandfather's name." Gremlin is developed independently from Titan and supported by most graph databases. By building applications on top of Titan through the Gremlin query language users avoid vendor-lock in because their application can be migrated to other graph databases supporting Gremlin. This section is a brief overview of the Gremlin query language. For more information on Gremlin, refer to the following resources: -* http://www.tinkerpop.com/docs/3.0.0.M6/[Complete Gremlin Manual] +* http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/[Complete Gremlin Manual] * http://sql2gremlin.com[Gremlin for SQL developers *Gremlin2 Syntax*] -[NOTE] -See the http://gremlin.tinkerpop.com[Gremlin Manual] for a complete documentation of the Gremlin query language. - Introductory Traversals ~~~~~~~~~~~~~~~~~~~~~~~ A Gremlin query is a chain of operations/functions that are evaluated from left to right. A simple grandfather query is provided below over the _Graph of the Gods_ dataset discussed in <>. -[source,gremlin] -gremlin> g.V.has('name','hercules').out('father').out('father').name +[source, gremlin] +gremlin> g.traversal().V().has('name', 'hercules').out('father').out('father').values('name') ==>saturn The query above can be read: . `g`: for the current graph. . `V`: for all vertices in this graph -. `has('name','hercules')`: filters the vertices down to those with name property "hercules" (there is only one). +. `has('name', 'hercules')`: filters the vertices down to those with name property "hercules" (there is only one). . `out('father')`: traverse outgoing father edge's from Hercules. . `out('father')`: traverse outgoing father edge's from Hercules' father's vertex (i.e. Jupiter). . `name`: get the name property of the "hercules" vertex's grandfather. Taken together, these steps form a path-like traversal query. Each step can be decomposed and its results demonstrated. This style of building up a traversal/query is useful when constructing larger, complex query chains. -[source,gremlin] +[source, gremlin] gremlin> g ==>titangraph[cassandrathrift:127.0.0.1] -gremlin> g.V.has('name','hercules') +gremlin> g.traversal().V().has('name', 'hercules') ==>v[24] -gremlin> g.V.has('name','hercules').out('father') +gremlin> g.traversal().V().has('name', 'hercules').out('father') ==>v[16] -gremlin> g.V.has('name','hercules').out('father').out('father') +gremlin> g.traversal().V().has('name', 'hercules').out('father').out('father') ==>v[20] -gremlin> g.V.has('name','hercules').out('father').out('father').name +gremlin> g.traversal().V().has('name', 'hercules').out('father').out('father').values('name') ==>saturn For a sanity check, it is usually good to look at the properties of each return, not the assigned long id. -[source,gremlin] -gremlin> g.V.has('name','hercules').name +[source, gremlin] +gremlin> g.traversal().V().has('name', 'hercules').values('name') ==>hercules -gremlin> g.V.has('name','hercules').out('father').name +gremlin> g.traversal().V().has('name', 'hercules').out('father').values('name') ==>jupiter -gremlin> g.V.has('name','hercules').out('father').out('father').name +gremlin> g.traversal().V().has('name', 'hercules').out('father').out('father').values('name') ==>saturn Note the related traversal that shows the entire father family tree branch of Hercules. This more complicated traversal is provided in order to demonstrate the flexibility and expressivity of the language. A competent grasp of Gremlin provides the Titan user the ability to fluently navigate the underlying graph structure. -[source,gremlin] -gremlin> g.V.has('name','hercules').as('x').out('father').jump('x'){true}{true}.name +[source, gremlin] +gremlin> g.traversal().V().has('name', 'hercules').repeat(out('father')).emit().values('name') ==>jupiter ==>saturn Some more traversal examples are provided below. -[source,gremlin] -gremlin> hercules = g.V.has('name','hercules').next() +[source, gremlin] +gremlin> hercules = g.traversal().V().has('name', 'hercules').next() ==>v[1536] -gremlin> hercules.out('father','mother').label +gremlin> g.traversal().V(hercules).out('father', 'mother').label() ==>god ==>human -gremlin> hercules.out('battled').label +gremlin> g.traversal().V(hercules).out('battled').label() ==>monster ==>monster ==>monster -gremlin> hercules.out('battled').valueMap +gremlin> g.traversal().V(hercules).out('battled').valueMap() ==>{name=nemean} ==>{name=hydra} ==>{name=cerberus} -Each _step_ (denoted by a separating `.`) is a function that operates on the objects emitted from the previous step. There are numerous steps in the Gremlin language (see https://github.com/tinkerpop/gremlin/wiki/Gremlin-Steps[Gremlin Steps]). By simply changing a step or order of the steps, different traversal semantics are enacted. The example below returns the name of all the people that have battled the same monsters as Hercules who themselves are not Hercules (i.e. "co-battlers" or perhaps, "allies"). +Each _step_ (denoted by a separating `.`) is a function that operates on the objects emitted from the previous step. There are numerous steps in the Gremlin language (see http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/#graph-traversal-steps[Gremlin Steps]). By simply changing a step or order of the steps, different traversal semantics are enacted. The example below returns the name of all the people that have battled the same monsters as Hercules who themselves are not Hercules (i.e. "co-battlers" or perhaps, "allies"). Given that _The Graph of the Gods_ only has one battler (Hercules), another battler (for the sake of example) is added to the graph with Gremlin showcasing how vertices and edges are added to the graph. -[source,gremlin] +[source, gremlin] gremlin> theseus = g.addVertex('human') ==>v[3328] -gremlin> theseus.setProperty('name','theseus') +gremlin> theseus.property('name', 'theseus') ==>null -gremlin> cerberus = g.V.has('name','cerberus').next() +gremlin> cerberus = g.traversal().V().has('name', 'cerberus').next() ==>v[2816] -gremlin> battle = theseus.addEdge('battled',cerberus,'time',22) +gremlin> battle = theseus.addEdge('battled', cerberus, 'time', 22) ==>e[7eo-2kg-iz9-268][3328-battled->2816] -gremlin> battle.time +gremlin> battle.values('time') ==>22 When adding a vertex, an optional vertex label can be provided. An edge label must be specified when adding edges. Properties as key-value pairs can be set on both vertices and edges. When a property key is defined with SET or LIST cardinality, `addProperty` must be used when adding a respective property to a vertex. -[source,gremlin] -gremlin> hercules.out('battled').in('battled').except([hercules]).name +[source, gremlin] +gremlin> g.traversal().V(hercules).out('battled').in('battled').except([hercules]).values('name') ==>theseus The example above has 4 chained functions: `out`, `in`, `except`, and `values` (i.e. `name` is shorthand for `values('name')`). The function signatures of each are itemized below, where `V` is vertex and `U` is any object, where `V` is a subset of `U`. @@ -476,13 +475,13 @@ The Gremlin overview presented in this section focused on the Gremlin-Groovy lan Titan Server ------------ -image:https://raw.githubusercontent.com/tinkerpop/tinkerpop3/master/docs/static/images/gremlin-server.png[link="http://www.tinkerpop.com/docs/current/#gremlin-server"] +image:http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/images/gremlin-server.png[link="http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/#gremlin-server"] -Titan uses the http://www.tinkerpop.com/docs/current/#gremlin-server[Gremlin Server] engine as the server component to process and answer client queries. +Titan uses the http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/#gremlin-server[Gremlin Server] engine as the server component to process and answer client queries. Gremlin Server provides a way to remotely execute Gremlin scripts against one or more Titan instances hosted within it. By default, client applications can connect to it via WebSockets with a custom subprotocol (there are a number of clients developed in different languages to help support the subprotocol). Gremlin Server can also be configured to serve a simple REST-style endpoint for processing Gremlin as well. These configurations just represent the out-of-the-box options for Gremlin Server. It is certainly possible to also extend it with other means of communication by implementing the interfaces that it provides. -The Titan https://github.com/thinkaurelius/titan/wiki/Downloads[Download] comes pre-configured to run Gremlin Server without any additional configuration. Alternatively, one can http://tinkerpop.com/downloads/3.0.0.M6/gremlin-server-3.0.0.M6.zip[Download Gremlin Server] separately and then install Titan manually. +The Titan https://github.com/thinkaurelius/titan/wiki/Downloads[Download] comes pre-configured to run Gremlin Server without any additional configuration. Alternatively, one can http://tinkerpop.incubator.apache.org/[Download Gremlin Server] separately and then install Titan manually. Gremlin Server with Titan ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -506,11 +505,11 @@ Manual Installation This section describes the process of downloading a stock Gremlin Server distribution and then installing Titan. -Gremlin Server can be downloaded at http://tinkerpop.com/downloads/3.0.0.M6/gremlin-server-3.0.0.M6.zip[here]. +Gremlin Server can be downloaded at http://tinkerpop.incubator.apache.org/[here]. Edit the `GREMLIN_SERVER_HOME/conf/gremlin-server.yaml` and include the following settings to the defaults: -[source,yaml] +[source, yaml] ---- ... graphs: { @@ -524,7 +523,7 @@ The entry for `graphs` defines the bindings to specific `TitanGraph` configurati Next add a `conf/titan-berkeleyje.properties` file which should contain something like: -[source,text] +[source, text] ---- storage.backend=berkeleyje storage.directory=../db/berkeley @@ -532,12 +531,12 @@ storage.directory=../db/berkeley Gremlin Server needs to have Titan and its related library dependencies made available to it. It has an `ext` directory where these libraries can be placed on Gremlin Server's path. To get Titan on the path, issue the following command (it may take a few minutes to complete this step depending on network speed): -[source,text] +[source, text] $ bin/gremlin-server.sh -i com.thinkaurelius.titan titan-all $VERSION Start Gremlin Server with: -[source,text] +[source, text] $ bin/gremlin-server.sh Connecting to Gremlin Server @@ -547,7 +546,7 @@ Regardless of the download and installation method chosen above, Gremlin Server Start Gremlin Console with `bin/gremlin.sh` and use the Remote and Submit commands to issue Gremlin to Gremlin Server: -[source,text] +[source, text] ---- $ bin/gremlin.sh \,,,/ @@ -559,9 +558,9 @@ plugin activated: aurelius.titan plugin activated: tinkerpop.tinkergraph gremlin> :remote connect tinkerpop.server conf/remote.yaml ==>Connected - localhost/127.0.0.1:8182 -gremlin> :> g.addVertex("name","stephen") +gremlin> :> g.addVertex("name", "stephen") ==>v[256] -gremlin> :> g.V().values('name') +gremlin> :> g.traversal().V().values('name') ==>stephen ---- @@ -579,16 +578,16 @@ Graph Index Graph indexes are global index structures over the entire graph which allow efficient retrieval of vertices or edges by their properties for sufficiently selective conditions. For instance, consider the following queries -[source,gremlin] -g.V.has('name','hercules') -g.E.has('reason',CONTAINS,'loves') +[source, gremlin] +g.traversal().V().has('name', 'hercules') +g.traversal().E().has('reason', CONTAINS, 'loves') The first query asks for all vertices with the name `hercules`. The second asks for all edges where the property reason contains the word `loves`. Without a graph index answering those queries would require a full scan over all vertices or edges in the graph to find those that match the given condition which is very inefficient and infeasible for huge graphs. Titan distinguishes between two types of graph indexes: *composite* and *mixed* indexes. Composite indexes are very fast and efficient but limited to equality lookups for a particular, previously-defined combination of property keys. Mixed indexes can be used for lookups on any combination of indexed keys and support multiple condition predicates in addition to equality depending on the backing index store. -Both types of indexes are created through the Titan management system and the index builder returned by `TitanManagement.buildIndex(String,Class)` where the first argument defines the name of the index and the second argument specifies the type of element to be indexed (e.g. `Vertex.class`). The name of a graph index must be unique. -Graph indexes built against newly defined property keys, i.e. property keys that are defined in the same management transaction as the index, are immediately available. Graph indexes built against property keys that are already in use require the execution of a <> to ensure that the index contains all previously added elements. Until the reindex procedure has completed, the index will not be available. It is encouraged to define graph indexes in the same transaction as the initial schema. +Both types of indexes are created through the Titan management system and the index builder returned by `TitanManagement.buildIndex(String, Class)` where the first argument defines the name of the index and the second argument specifies the type of element to be indexed (e.g. `Vertex.class`). The name of a graph index must be unique. +Graph indexes built against newly defined property keys, i.e. property keys that are defined in the same management transaction as the index, are immediately available. Graph indexes built against property keys that are already in use require the execution of a <> to ensure that the index contains all previously added elements. Until the reindex procedure has completed, the index will not be available. It is encouraged to define graph indexes in the same transaction as the initial schema. [NOTE] In the absence of an index, Titan will default to a full graph scan in order to retrieve the desired list of vertices. While this produces the correct result set, the graph scan can be very inefficient and lead to poor overall system performance in a production environment. Enable the `force-index` configuration option in production deployments of Titan to prohibit graph scans. @@ -599,33 +598,42 @@ Composite Index Composite indexes retrieve vertices or edges by one or a (fixed) composition of multiple keys. Consider the following composite index definitions. -[source,gremlin] +[source, gremlin] +g.tx().rollback(); //Never create new indexes while a transaction is active +mgmt = g.openManagement() +name = mgmt.getPropertyKey('name') +age = mgmt.getPropertyKey('age') +mgmt.buildIndex('byNameComposite', Vertex.class).addKey(name).buildCompositeIndex() +mgmt.buildIndex('byNameAndAgeComposite', Vertex.class).addKey(name).addKey(age).buildCompositeIndex() +mgmt.commit() +//Wait for the index to become available +mgmt.awaitGraphIndexStatus(g, 'byNameComposite').call() +mgmt.awaitGraphIndexStatus(g, 'byNameAndAgeComposite').call() +//Reindex the existing data mgmt = g.openManagement() -name = mgmt.makePropertyKey('name').dataType(String.class).make() -age = mgmt.makePropertyKey('age').dataType(Integer.class).make() -mgmt.buildIndex('byName',Vertex.class).addKey(name).buildCompositeIndex() -mgmt.buildIndex('byNameAndAge',Vertex.class).addKey(name).addKey(age).buildCompositeIndex() +mgmt.updateIndex(mgmt.getGraphIndex("byNameComposite"), SchemaAction.REINDEX).get() +mgmt.updateIndex(mgmt.getGraphIndex("byNameAndAgeComposite"), SchemaAction.REINDEX).get() mgmt.commit() -First, two property keys `name` and `age` are defined. Next, a simple composite index on just the name property key is built. Titan will use this index to answer the following query. +First, two property keys `name` and `age` are already defined. Next, a simple composite index on just the name property key is built. Titan will use this index to answer the following query. -[source,gremlin] -g.V.has('name','hercules') +[source, gremlin] +g.traversal().V().has('name', 'hercules') The second composite graph index includes both keys. Titan will use this index to answer the following query. -[source,gremlin] -g.V.has('age',30).has('name','hercules') +[source, gremlin] +g.traversal().V().has('age', 30).has('name', 'hercules') Note, that all keys of a composite graph index must be found in the query's equality conditions for this index to be used. For example, the following query cannot be answered with either of the indexes because it only contains a constraint on `age` but not `name`. -[source,gremlin] -g.V.has('age',30) +[source, gremlin] +g.traversal().V().has('age', 30) Also note, that composite graph indexes can only be used for equality constraints like those in the queries above. The following query would be answered with just the simple composite index defined on the `name` key because the age constraint is not an equality constraint. -[source,gremlin] -g.V.has('name','hercules').interval('age',20,50) +[source, gremlin] +g.traversal().V().has('name', 'hercules').has('age', inside, [20, 50]) Composite indexes do not require configuration of an external indexing backend and are supported through the primary storage backend. Hence, composite index modifications are persisted through the same transaction as graph modifications which means that those changes are atomic and/or consistent if the underlying storage backend supports atomicity and/or consistency. @@ -639,14 +647,21 @@ Index Uniqueness Composite indexes can also be used to enforce property uniqueness in the graph. If a composite graph index is defined as `unique()` there can be at most one vertex or edge for any given concatenation of property values associated with the keys of that index. For instance, to enforce that names are unique across the entire graph the following composite graph index would be defined. -[source,gremlin] +[source, gremlin] +g.tx().rollback(); //Never create new indexes while a transaction is active mgmt = g.openManagement() -name = mgmt.makePropertyKey('name').dataType(String.class).make() -mgmt.buildIndex('byName',Vertex.class).addKey(name).unique().buildCompositeIndex() +name = mgmt.getPropertyKey('name') +mgmt.buildIndex('byNameUnique', Vertex.class).addKey(name).unique().buildCompositeIndex() +mgmt.commit() +//Wait for the index to become available +mgmt.awaitGraphIndexStatus(g, 'byNameUnique').call() +//Reindex the existing data +mgmt = g.openManagement() +mgmt.updateIndex(mgmt.getGraphIndex("byNameUnique"), SchemaAction.REINDEX).get() mgmt.commit() [NOTE] -To enforce uniqueness against an eventually consistent storage backend, the <> of the index must be explicitly set to enabling locking. +To enforce uniqueness against an eventually consistent storage backend, the <> of the index must be explicitly set to enabling locking. [[index-mixed]] Mixed Index @@ -655,22 +670,29 @@ Mixed Index Mixed indexes retrieve vertices or edges by any combination of previously added property keys. Mixed indexes provide more flexibility than composite indexes and support additional condition predicates beyond equality. On the other hand, mixed indexes are slower for most equality queries than composite indexes. -Unlike composite indexes, mixed indexes require the configuration of an <> and use that indexing backend to execute lookup operations. Titan can support multiple indexing backends in a single installation. Each indexing backend must be uniquely identified by name in the Titan configuration which is called the *indexing backend name*. +Unlike composite indexes, mixed indexes require the configuration of an <> and use that indexing backend to execute lookup operations. Titan can support multiple indexing backends in a single installation. Each indexing backend must be uniquely identified by name in the Titan configuration which is called the *indexing backend name*. -[source,gremlin] +[source, gremlin] +g.tx().rollback(); //Never create new indexes while a transaction is active +mgmt = g.openManagement() +name = mgmt.getPropertyKey('name') +age = mgmt.getPropertyKey('age') +mgmt.buildIndex('nameAndAge', Vertex.class).addKey(name).addKey(age).buildMixedIndex("search") +mgmt.commit() +//Wait for the index to become available +mgmt.awaitGraphIndexStatus(g, 'nameAndAge').call() +//Reindex the existing data mgmt = g.openManagement() -name = mgmt.makePropertyKey('name').dataType(String.class).make() -age = mgmt.makePropertyKey('age').dataType(Integer.class).make() -mgmt.buildIndex('nameAndAge',Vertex.class).addKey(name).addKey(age).buildMixedIndex("search") +mgmt.updateIndex(mgmt.getGraphIndex("nameAndAge"), SchemaAction.REINDEX).get() mgmt.commit() The example above defines a mixed index containing the property keys `name` and `age`. The definition refers to the indexing backend name `search` so that Titan knows which configured indexing backend it should use for this particular index. While this index definition looks similar to the composite index above, it provides greater query support and can answer _any_ of the following queries. -[source,gremlin] -g.V.has('name',CONTAINS,'hercules').interval('age',20,50) -g.V.has('name',CONTAINS,'hercules') -g.V.has('age',lt,50) +[source, gremlin] +g.traversal().V().has('name', CONTAINS, 'hercules').has('age', inside, [20, 50]) +g.traversal().V().has('name', CONTAINS, 'hercules') +g.traversal().V().has('age', lt, 50) Mixed indexes support full-text search, range search, geo search and others. Refer to <> for a list of predicates supported by a particular indexing backend. @@ -682,36 +704,44 @@ Adding Property Keys Property keys can be added to an existing mixed index which allows subsequent queries to include this key in the query condition. -[source,gremlin] +[source, gremlin] +g.tx().rollback(); //Never create new indexes while a transaction is active mgmt = g.openManagement() location = mgmt.makePropertyKey('location').dataType(Geoshape.class).make() nameAndAge = mgmt.getGraphIndex('nameAndAge') -mgmt.addIndexKey(nameAndAge,location) +mgmt.addIndexKey(nameAndAge, location) mgmt.commit() +//Wait for the index to become available +mgmt.awaitGraphIndexStatus(g, 'nameAndAge').call() +//Reindex the existing data +mgmt = g.openManagement() +mgmt.updateIndex(mgmt.getGraphIndex("nameAndAge"), SchemaAction.REINDEX).get() +mgmt.commit() + To add a newly defined key, we first retrieve the existing index from the management transaction by its name and then invoke the `addIndexKey` method to add the key to this index. -If the added key is defined in the same management transaction, it will be immediately available for querying. If the property key has already been in use, adding the key requires the execution of a <> to ensure that the index contains all previously added elements. Until the reindex procedure has completed, the key will not be available in the mixed index. +If the added key is defined in the same management transaction, it will be immediately available for querying. If the property key has already been in use, adding the key requires the execution of a <> to ensure that the index contains all previously added elements. Until the reindex procedure has completed, the key will not be available in the mixed index. Mapping Parameters ++++++++++++++++++ -When adding a property key to a mixed index - either through the index builder or the `addIndexKey` method - a list of parameters can be optionally specified to adjust how the property value is mapped into the indexing backend. Refer to the <> for a complete list of parameter types supported by each indexing backend. +When adding a property key to a mixed index - either through the index builder or the `addIndexKey` method - a list of parameters can be optionally specified to adjust how the property value is mapped into the indexing backend. Refer to the <> for a complete list of parameter types supported by each indexing backend. Ordering ^^^^^^^^ -The order in which the results of a graph query are returned can be defined using the `orderBy()` directive. The `orderBy()` method expects two parameters: +The order in which the results of a graph query are returned can be defined using the `order().by()` directive. The `order().by()` method expects two parameters: * The name of the property key by which to order the results. The results will be ordered by the value of the vertices or edges for this property key. * The sort order: either increasing `incr` or decreasing `decr` -For example, the query `g.V.has('name',CONTAINS,'hercules').orderBy('age',decr).limit(10)` retrieves the ten oldest individuals with 'hercules' in their name. +For example, the query `g.traversal().V().has('name', CONTAINS, 'hercules').order().by('age', decr).limit(10)` retrieves the ten oldest individuals with 'hercules' in their name. -When using `orderBy()` it is important to note that: +When using `order().by()` it is important to note that: * Composite graph indexes do not natively support ordering search results. All results will be retrieved and then sorted in-memory. For large result sets, this can be very expensive. -* Mixed indexes support ordering natively and efficiently. However, the property key used in the orderBy method must have been previously added to the mixed indexed for native result ordering support. This is important in cases where the orderBy key is different from the query keys. If the property key is not part of the index, then sorting requires loading all results into memory. +* Mixed indexes support ordering natively and efficiently. However, the property key used in the order().by() method must have been previously added to the mixed indexed for native result ordering support. This is important in cases where the the order().by() key is different from the query keys. If the property key is not part of the index, then sorting requires loading all results into memory. Label Constraint ^^^^^^^^^^^^^^^^ @@ -719,13 +749,21 @@ Label Constraint In many cases it is desirable to only index vertices or edges with a particular label. For instance, one may want to index only gods by their name and not every single vertex that has a name property. When defining an index it is possible to restrict the index to a particular vertex or edge label using the `indexOnly` method of the index builder. The following creates a composite index for the property key `name` that indexes only vertices labeled `god`. -[source,gremlin] +[source, gremlin] +g.tx().rollback(); //Never create new indexes while a transaction is active mgmt = g.openManagement() -name = mgmt.makePropertyKey('name').dataType(String.class).make() +name = mgmt.getPropertyKey('name') god = mgmt.getVertexLabel('god') -mgmt.buildIndex('byName',Vertex.class).addKey(name).indexOnly(god).buildCompositeIndex() +mgmt.buildIndex('byNameAndLabel', Vertex.class).addKey(name).indexOnly(god).buildCompositeIndex() +mgmt.commit() +//Wait for the index to become available +mgmt.awaitGraphIndexStatus(g, 'byNameAndLabel').call() +//Reindex the existing data +mgmt = g.openManagement() +mgmt.updateIndex(mgmt.getGraphIndex("byNameAndLabel"), SchemaAction.REINDEX).get() mgmt.commit() + Label restrictions similarly apply to mixed indexes. When a composite index with label restriction is defined as unique, the uniqueness constraint only applies to properties on vertices or edges for the specified label. Composite vs Mixed Index @@ -733,7 +771,7 @@ Composite vs Mixed Index . Use a composite index for exact match index retrievals. Composite indexes do not require configuring or operating an external index system and are often significantly faster than mixed indexes. .. As an exception, use a mixed index for exact matches when the number of distinct values for query constraint is relatively small or if one value is expected to be associated with many elements in the graph (i.e. in case of low selectivity). -. Use a mixed indexes for numeric range, full-text or geo-spatial indexing. Also, using a mixed index can speed up orderBy queries. +. Use a mixed indexes for numeric range, full-text or geo-spatial indexing. Also, using a mixed index can speed up the order().by() queries. [[vertex-indexes]] @@ -742,37 +780,56 @@ Vertex-centric Index Vertex-centric indexes are local index structures built individually per vertex. In large graphs vertices can have thousands of incident edges. Traversing through those vertices can be very slow because a large subset of the incident edges has to be retrieved and then filtered in memory to match the conditions of the traversal. Vertex-centric indexes can speed up such traversals by using localized index structures to retrieve only those edges that need to be traversed. -Suppose that Hercules battled hundreds of monsters in addition to the three captured in the introductory <>. Without a vertex-centric index, a query asking for those monsters battled between time point `10` and `20` would require retrieving all `battled` edges even though there are only a handful of matching edges. +Suppose that Hercules battled hundreds of monsters in addition to the three captured in the introductory <>. Without a vertex-centric index, a query asking for those monsters battled between time point `10` and `20` would require retrieving all `battled` edges even though there are only a handful of matching edges. -[source,gremlin] -h = g.V.has('name','hercules').next() -h.outE('battled').interval('time',10,20).inV +[source, gremlin] +h = g.traversal().V().has('name', 'hercules').next() +g.traversal().V(h).outE('battled').has('time', inside, [10, 20]).inV() Building a vertex-centric index by time speeds up such traversal queries. -[source,gremlin] +[source, gremlin] +g.tx().rollback(); //Never create new indexes while a transaction is active mgmt = g.openManagement() -time = mgmt.makePropertyKey('time').dataType(Integer.class).make() -battled = mgmt.makeEdgeLabel('battled').make() -mgmt.buildEdgeIndex(battled,'battlesByTime',Direction.BOTH,Order.decr,time); +time = mgmt.getPropertyKey('time') +battled = mgmt.getEdgeLabel('battled') +mgmt.buildEdgeIndex(battled, 'battlesByTime', Direction.BOTH, Order.decr, time); +mgmt.commit() +//Wait for the index to become available +mgmt.awaitGraphIndexStatus(g, 'battlesByTime').call() +//Reindex the existing data +mgmt = g.openManagement() +mgmt.updateIndex(mgmt.getGraphIndex("battlesByTime"), SchemaAction.REINDEX).get() +mgmt.commit() This example builds a vertex-centric index which indexes `battled` edges in both direction by time in decreasing order. A vertex-centric index is built against a particular edge label which is the first argument to the index construction method `TitanManagement.buildEdgeIndex()`. The index only applies to edges of this label - `battled` in the example above. The second argument is a unique name for the index. The third argument is the edge direction in which the index is built. The index will only apply to traversals along edges in this direction. In this example, the vertex-centric index is built in both direction which means that time restricted traversals along `battled` edges can be served by this index in both the `IN` and `OUT` direction. Titan will maintain a vertex-centric index on both the in- and out-vertex of `battled` edges. Alternatively, one could define the index to apply to the `OUT` direction only which would speed up traversals from Hercules to the monsters but not in the reverse direction. This would only require maintaining one index and hence half the index maintenance and storage cost. The last two arguments are the sort order of the index and a list of property keys to index by. The sort order is optional and defaults to ascending order (i.e. `Order.ASC`). The list of property keys must be non-empty and defines the keys by which to index the edges of the given label. A vertex-centric index can be defined with multiple keys. -[source,gremlin] +[source, gremlin] +g.tx().rollback(); //Never create new indexes while a transaction is active mgmt = g.openManagement() -time = mgmt.makePropertyKey('time').dataType(Integer.class).make() -rating = mgmt.makePropertyKey('rating').dataType(Decimal.class).make() -battled = mgmt.makeEdgeLabel('battled').make() -mgmt.buildEdgeIndex(battled,'battlesByRatingAndTime',Direction.OUT,Order.decr,rating,time); +time = mgmt.getPropertyKey('time') +rating = mgmt.makePropertyKey('rating').dataType(Double.class).make() +battled = mgmt.getEdgeLabel('battled') +mgmt.buildEdgeIndex(battled, 'battlesByRatingAndTime', Direction.OUT, Order.decr, rating, time); +mgmt.commit() +//Wait for the index to become available +mgmt.awaitRelationIndexStatus(g, 'battlesByRatingAndTime', 'battled').call() +//Reindex the existing data +mgmt = g.openManagement() +mgmt.updateIndex(mgmt.getRelationIndex(battled, 'battlesByRatingAndTime'), SchemaAction.REINDEX).get() +mgmt.commit() This example extends the schema by a `rating` property on `battled` edges and builds a vertex-centric index which indexes `battled` edges in the out-going direction by rating and time in decreasing order. Note, that the order in which the property keys are specified is important because vertex-centric indexes are prefix indexes. This means, that `battled` edges are indexed by `rating` _first_ and `time` _second_. -[source,gremlin] -h.outE('battled').has('rating',LARGER_THAN,3.0).inV -h.outE('battled').has('rating',5.0).interval('time',10,50).inV -h.outE('battled').interval('time',10,50).inV +[source, gremlin] +//Add some rating data +h = g.traversal().V().has('name', 'hercules').next() +g.traversal().V(h).outE('battled').property('rating', 5.0) //Add some rating properties +g.traversal().V(h).outE('battled').has('rating', gt, 3.0).inV() +g.traversal().V(h).outE('battled').has('rating', 5.0).has('time', inside, [10, 50]).inV() +g.traversal().V(h).outE('battled').has('time', inside, [10, 50]).inV() Hence, the `battlesByLocationAndTime` index can speed up the first two but not the third query. @@ -781,10 +838,10 @@ Multiple vertex-centric indexes can be built for the same edge label in order to [NOTE] The property keys used in a vertex-centric index must have an explicitly defined data type (i.e. _not_ `Object.class`) which supports a native sort order. If the data type are floating point numbers, Titan's custom `Decimal` or `Precision` data types must be used which have a fixed number of decimals. -If the vertex-centric index is built against an edge label that is defined in the same management transaction, the index will be immediately available for querying. If the edge label has already been in use, building a vertex-centric index against it requires the execution of a <> to ensure that the index contains all previously added edges. Until the reindex procedure has completed, the index will not be available. +If the vertex-centric index is built against an edge label that is defined in the same management transaction, the index will be immediately available for querying. If the edge label has already been in use, building a vertex-centric index against it requires the execution of a <> to ensure that the index contains all previously added edges. Until the reindex procedure has completed, the index will not be available. [NOTE] -Titan automatically builds vertex-centric indexes per edge label and property key. That means, even with thousands of incident `battled` edges, queries like `h.out('mother')` or `h.age` are efficiently answered by the local index. +Titan automatically builds vertex-centric indexes per edge label and property key. That means, even with thousands of incident `battled` edges, queries like `g.traversal().V(h).out('mother')` or `g.traversal().V(h).values('age')` are efficiently answered by the local index. Vertex-centric indexes cannot speed up unconstrained traversals which require traversing through all incident edges of a particular label. Those traversals will become slower as the number of incident edges increases. Often, such traversals can be rewritten as constrained traversals that can utilize a vertex-centric index to ensure acceptable performance at scale. @@ -793,9 +850,10 @@ Ordered Traversals The following queries specify an order in which the incident edges are to be traversed. Use the `localLimit` command to retrieve a subset of the edges (in a given order) for EACH vertex that is traversed. -[source,gremlin] -h.outE('battled').orderBy('time',decr).localLimit(10).inV.name -h.outE('battled').has('rating',5.0).orderBy('time',decr).localLimit(10).place +[source, gremlin] +h = g.traversal().V().has('name', 'hercules').next() +g.traversal().V(h).local(outE('battled').order().by('time', decr).limit(10)).inV().values('name') +g.traversal().V(h).local(outE('battled').has('rating', 5.0).order().by('time', decr).limit(10)).values('place') The first query asks for the names of the 10 most recently battled monsters by Hercules. The second query asks for the places of the 10 most recent battles of Hercules that are rated 5 stars. In both cases, the query is constrained by an order on a property key with a limit on the number of elements to be returned. @@ -820,10 +878,10 @@ Transaction Handling Every graph operation in Titan occurs within the context of a transaction. According to the Blueprints' specification, each thread opens its own transaction against the graph database with the first operation (i.e. retrieval or mutation) on the graph:: -[source,java] +[source, gremlin] ---- -TitanGraph g = TitanFactory.open("berkeleyje:/tmp/titan"); -Vertex juno = g.addVertex(); //Automatically opens a new transaction +g = TitanFactory.open("berkeleyje:/tmp/titan"); +juno = g.addVertex(); //Automatically opens a new transaction juno.property("name", "juno"); g.tx().commit(); //Commits transaction ---- @@ -835,18 +893,18 @@ Transactional Scope All graph elements (vertices, edges, and types) are associated with the transactional scope in which they were retrieved or created. Under Blueprint's default transactional semantics, transactions are automatically created with the first operation on the graph and closed explicitly using `commit()` or `rollback()`. Once the transaction is closed, all graph elements associated with that transaction become stale and unavailable. However, Titan will automatically transition vertices and types into the new transactional scope as shown in this example:: -[source,java] -TitanGraph g = TitanFactory.open("berkeleyje:/tmp/titan"); -Vertex juno = g.addVertex(); //Automatically opens a new transaction +[source, gremlin] +g = TitanFactory.open("berkeleyje:/tmp/titan"); +juno = g.addVertex(); //Automatically opens a new transaction g.tx().commit(); //Ends transaction juno.property("name", "juno"); //Vertex is automatically transitioned Edges, on the other hand, are not automatically transitioned and cannot be accessed outside their original transaction. They must be explicitly transitioned. -[source,java] -Edge e = juno.addEdge("knows",g.addVertex()); +[source, gremlin] +e = juno.addEdge("knows", g.addVertex()); g.tx().commit(); //Ends transaction -e = g.e(e); //Need to refresh edge +e = g.traversal().E(e).next(); //Need to refresh edge e.property("time", 99); Transaction Failures @@ -854,15 +912,16 @@ Transaction Failures When committing a transaction, Titan will attempt to persist all changes to the storage backend. This might not always be successful due to IO exceptions, network errors, machine crashes or resource unavailability. Hence, transactions can fail. In fact, transactions *will eventually fail* in sufficiently large systems. Therefore, we highly recommend that your code expects and accommodates such failures. -[source,java] +[source, gremlin] try { - if (g.V.has("name",name).iterator().hasNext()) + if (g.traversal().V().has("name", name).iterator().hasNext()) throw new IllegalArgumentException("Username already taken: " + name); - Vertex user = g.addVertex(); + user = g.addVertex(); user.property("name", name); g.tx().commit(); -} catch (TitanException e) { +} catch (Exception e) { //Recover, retry, or return error message + println(e.getMessage()); } The example above demonstrates a simplified user signup implementation where `name` is the name of the user who wishes to register. First, it is checked whether a user with that name already exists. If not, a new user vertex is created and the name assigned. Finally, the transaction is committed. @@ -882,18 +941,20 @@ Permanent exceptions that can fail a transaction include: Multi-Threaded Transactions ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Titan supports multi-threaded transactions through Blueprint's https://github.com/tinkerpop/blueprints/wiki/Graph-Transactions[ThreadedTransactionalGraph] interface. Hence, to speed up transaction processing and utilize multi-core architectures multiple threads can run concurrently in a single transaction. +Titan supports multi-threaded transactions through Blueprint's http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/#transactions[ThreadedTransactionalGraph] interface. Hence, to speed up transaction processing and utilize multi-core architectures multiple threads can run concurrently in a single transaction. With Blueprints' default transaction handling, each thread automatically opens its own transaction against the graph database. To open a thread-independent transaction, use the `newTransaction()` method. -[source,java] -TransactionalGraph tx = g.newTransaction(); -Thread[] threads = new Thread[10]; -for (int i=0;i> for more detail) and since the transaction is running for a long time, lock congestion and expensive transactional failures are likely. -[source,java] -Vertex v1 = g.addVertex(); +[source, gremlin] +v1 = g.addVertex(); //Do many other things -Vertex v2 = g.addVertex(); -v2.property("uniqueName","foo"); -v1.addEdge("related",v2); +v2 = g.addVertex(); +v2.property("uniqueName", "foo"); +v1.addEdge("related", v2); //Do many other things g.tx().commit(); // This long-running tx might fail due to contention on its uniqueName lock One way around this is to create the vertex in a short, nested thread-independent transaction as demonstrated by the following pseudo code:: -[source,java] -Vertex v1 = g.addVertex(); +[source, gremlin] +v1 = g.addVertex(); //Do many other things -TransactionalGraph tx = g.newTransaction(); -Vertex v2 = tx.addVertex(); -v2.singleProperty("uniqueName","foo"); +tx = g.newTransaction(); +v2 = tx.addVertex(); +v2.property("uniqueName", "foo"); tx.commit(); // Any lock contention will be detected here -v1.addEdge("related",g.v(v2); // Need to load v2 into outer transaction +v1.addEdge("related", g.traversal().V(v2).next()); // Need to load v2 into outer transaction //Do many other things g.tx().commit(); // Can't fail due to uniqueName write lock contention involving v2 @@ -938,37 +999,37 @@ g.tx().commit(); // Can't fail due to uniqueName write lock contention involving Common Transaction Handling Problems ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Transactions are started automatically with the first operation executed against the graph. One does NOT have to start a transaction manually. The method `newTransaction` is used to start <> only. +Transactions are started automatically with the first operation executed against the graph. One does NOT have to start a transaction manually. The method `newTransaction` is used to start <> only. Transactions are automatically started under the Blueprints semantics but *not* automatically terminated. Transactions have to be terminated manually with `g.commit()` if successful or `g.rollback()` if not. Manual termination of transactions is necessary because only the user knows the transactional boundary. A transaction will attempt to maintain its state from the beginning of the transaction. This might lead to unexpected behavior in multi-threaded applications as illustrated in the following artificial example:: -[source,java] -v = g.v(4) //Retrieve vertex, first action automatically starts transaction -v.bothE +[source, gremlin] +v = g.traversal().V(4).next() //Retrieve vertex, first action automatically starts transaction +g.traversal().V(v).bothE() >> returns nothing, v has no edges //thread is idle for a few seconds, another thread adds edges to v -v.bothE +g.traversal().V(v).bothE() >> still returns nothing because the transactional state from the beginning is maintained -Such unexpected behavior is likely to occur in client-server applications where the server maintains multiple threads to answer client requests. It is therefore important to terminate the transaction after a unit of work (e.g. code snippet, query, etc). For instance, https://github.com/tinkerpop/rexster[Rexster] manages the transactional boundary for each gremlin query. So, the example above should be:: +Such unexpected behavior is likely to occur in client-server applications where the server maintains multiple threads to answer client requests. It is therefore important to terminate the transaction after a unit of work (e.g. code snippet, query, etc). So, the example above should be: -[source,java] -v = g.v(4) //Retrieve vertex, first action automatically starts transaction -v.bothE +[source, gremlin] +v = g.traversal().V(4).next()//Retrieve vertex, first action automatically starts transaction +g.traversal().V(v).bothE() g.tx().commit() //thread is idle for a few seconds, another thread adds edges to v -v.bothE +g.traversal().V(v).bothE() >> returns the newly added edge g.tx().commit() -When using multi-threaded transactions via `newTransaction` all vertices and edges retrieved or created in the scope of that transaction are *not* available outside the scope of that transaction. Accessing such elements after the transaction has been closed will result in an exception. As demonstrated in the example above, such elements have to be explicitly refreshed in the new transaction using `g.v(existingVertex)` or `g.e(existingEdge)`. +When using multi-threaded transactions via `newTransaction` all vertices and edges retrieved or created in the scope of that transaction are *not* available outside the scope of that transaction. Accessing such elements after the transaction has been closed will result in an exception. As demonstrated in the example above, such elements have to be explicitly refreshed in the new transaction using `g.traversal().V(existingVertex)` or `g.traversal().E()(existingEdge)`. [[tx-config]] Transaction Configuration ~~~~~~~~~~~~~~~~~~~~~~~~~ -Titan's `TitanGraph.buildTransaction()` method gives the user the ability to configure and start a new <> against a `TitanGraph`. Hence, it is identical to `TitanGraph.newTransaction()` with additional configuration options. +Titan's `TitanGraph.buildTransaction()` method gives the user the ability to configure and start a new <> against a `TitanGraph`. Hence, it is identical to `TitanGraph.newTransaction()` with additional configuration options. `buildTransaction()` returns a `TransactionBuilder` which allows the following aspects of a transaction to be configured: @@ -1062,7 +1123,7 @@ Storage Backend Caching Each storage backend maintains its own data caching layer. These caches benefit from compression, data compactness, coordinated expiration and are often maintained off heap which means that large caches can be used without running into garbage collection issues. While these caches can be significantly larger than the database level cache, they are also slower to access. -The exact type of caching and its properties depends on the particular <>. Please refer to the respective documentation for more information about the caching infrastructure and how to optimize it. +The exact type of caching and its properties depends on the particular <>. Please refer to the respective documentation for more information about the caching infrastructure and how to optimize it. [[log]] Transaction Log @@ -1070,49 +1131,52 @@ Transaction Log Titan can automatically log transactional changes for additional processing or as a record of change. To enable logging for a particular transaction, specify the name of the target log during the start of the transaction. -[source,gremlin] -tx = g.buildTransaction().setLogIdentifier('addedPerson').start() -u = tx.addVertex(label,'human') -u.property('name','proteros') -u.property('age',36) +[source, gremlin] +tx = g.buildTransaction().logIdentifier('addedPerson').start() +u = tx.addVertex(label, 'human') +u.property('name', 'proteros') +u.property('age', 36) tx.commit() Upon commit, any changes made during the transaction are logged to the user logging system into a log named `addedPerson`. The *user logging system* is a configurable logging backend with a Titan compatible log interface. By default, the log is written to a separate store in the primary storage backend which can be configured as described below. The log identifier specified during the start of the transaction identifies the log in which the changes are recorded thereby allowing different types of changes to be recorded in separate logs for individual processing. -[source,gremlin] -tx = g.buildTransaction().setLogIdentifier('battle').start() -h = tx.V.has('name','hercules').next() -m = tx.addVertex(label,'monster') -m.property('name','phylatax') -h.addEdge('battled',m,'time',22) +[source, gremlin] +tx = g.buildTransaction().logIdentifier('battle').start() +h = tx.traversal().V().has('name', 'hercules').next() +m = tx.addVertex(label, 'monster') +m.property('name', 'phylatax') +h.addEdge('battled', m, 'time', 22) tx.commit() Titan provides a user transaction log processor framework to process the recorded transactional changes. The transaction log processor is opened via `TitanFactory.openTransactionLog(TitanGraph)` against a previously opened Titan graph instance. One can then add processors for a particular log which holds transactional changes. -[source,java] -LogProcessorFramework logProcessor = TitanFactory.openTransactionLog(g); -final AtomicInteger totalHumansAdded = new AtomicInteger(0); -final AtomicInteger totalGodsAdded = new AtomicInteger(0); -logProcessor.addLogProcessor("addedPerson") - .setProcessorIdentifier("addedPersonCounter") - .setStartTime(System.currentTimeMillis(), TimeUnit.MILLISECONDS) - .addProcessor(new ChangeProcessor() { +[source, gremlin] +import java.util.concurrent.atomic.*; +import com.thinkaurelius.titan.core.log.*; +import java.util.concurrent.*; +logProcessor = TitanFactory.openTransactionLog(g); +totalHumansAdded = new AtomicInteger(0); +totalGodsAdded = new AtomicInteger(0); +logProcessor.addLogProcessor("addedPerson"). + setProcessorIdentifier("addedPersonCounter"). + setStartTime(System.currentTimeMillis(), TimeUnit.MILLISECONDS). + addProcessor(new ChangeProcessor() { @Override public void process(TitanTransaction tx, TransactionId txId, ChangeState changeState) { - for (TitanVertex v : changeState.getVertices(Change.ADDED)) { + for (v in changeState.getVertices(Change.ADDED)) { if (v.label().equals("human")) totalHumansAdded.incrementAndGet(); } } - }) - .addProcessor(new ChangeProcessor() { + }). + addProcessor(new ChangeProcessor() { @Override public void process(TitanTransaction tx, TransactionId txId, ChangeState changeState) { - for (TitanVertex v : changeState.getVertices(Change.ADDED)) { + for (v in changeState.getVertices(Change.ADDED)) { if (v.label().equals("god")) totalGodsAdded.incrementAndGet(); } } - }) - .build(); + }). + build(); In this example, a *log processor* is built for the user transaction log named `addedPerson` to process the changes made in transactions which used the `addedPerson` log identifier. Two *change processors* are added to this log processor. The first processor counts the number of humans added and the second counts the number of gods added to the graph. @@ -1126,21 +1190,21 @@ Change processors are executed individually and in multiple threads. If a change Note, that log processors run each registered change processor at least once for each record in the log which means that a single transactional change record may be processed multiple times under certain failure conditions. One cannot add or remove change processor from a running log processor. In other words, a log processor is immutable after it is built. To change log processing, start a new log processor and shut down an existing one. -[source,java] -userlogs.addLogProcessor("battle") - .setProcessorIdentifier("battleTimer") - .setStartTime(System.currentTimeMillis(), TimeUnit.MILLISECONDS) - .addProcessor(new ChangeProcessor() { +[source, gramlin] +logProcessor.addLogProcessor("battle"). + setProcessorIdentifier("battleTimer"). + setStartTime(System.currentTimeMillis(), TimeUnit.MILLISECONDS). + addProcessor(new ChangeProcessor() { @Override public void process(TitanTransaction tx, TransactionId txId, ChangeState changeState) { - TitanVertex h = (TitanVertex)tx.V.has("name","hercules").toList().iterator().next(); - for (TitanEdge edge : changeState.getEdges(h,Change.ADDED,Direction.OUT,"battled")) { + h = tx.V.has("name", "hercules").toList().iterator().next(); + for (edge in changeState.getEdges(h, Change.ADDED, Direction.OUT, "battled")) { if (edge.getProperty("time")>1000) - h.property("oldFighter",true); + h.property("oldFighter", true); } } - }) - .build(); + }). + build(); The log processor above processes transactions for the `battle` log identifier with a single change processor which evaluates `battled` edges that were added to Hercules. This example demonstrates that the transaction handle passed into the change processor is a normal `TitanTransaction` which query the Titan graph and make changes to it. @@ -1195,7 +1259,7 @@ Edges should not be accessed outside the scope in which they were originally cre Locking Exceptions ~~~~~~~~~~~~~~~~~~ -When defining unique types with <> (i.e. requesting that Titan ensures uniqueness) it is likely to encounter locking exceptions of the type `PermanentLockingException` under concurrent modifications to the graph. +When defining unique types with <> (i.e. requesting that Titan ensures uniqueness) it is likely to encounter locking exceptions of the type `PermanentLockingException` under concurrent modifications to the graph. Such exceptions are to be expected, since Titan cannot know how to recover from a transactional state where an earlier read value has been modified by another transaction since this may invalidate the state of the transaction. In most cases it is sufficient to simply re-run the transaction. If locking exceptions are very frequent, try to analyze and remove the source of congestion. @@ -1207,21 +1271,10 @@ Titan does not allow property keys with `Double` or `Float` data type to be part Ghost Vertices ~~~~~~~~~~~~~~ -When the same vertex is concurrently removed in one transaction and modified in another, both transactions will successfully commit on eventually consistent storage backends and the vertex will still exist with only the modified properties or edges. This is referred to as a ghost vertex. It is possible to guard against ghost vertices on eventually consistent backends using key <> but this is prohibitively expensive in most cases. A more scalable approach is to allow ghost vertices temporarily and clearing them out in regular time intervals, for instance using https://github.com/StartTheShift/titan-tools[Titan tools]. +When the same vertex is concurrently removed in one transaction and modified in another, both transactions will successfully commit on eventually consistent storage backends and the vertex will still exist with only the modified properties or edges. This is referred to as a ghost vertex. It is possible to guard against ghost vertices on eventually consistent backends using key <> but this is prohibitively expensive in most cases. A more scalable approach is to allow ghost vertices temporarily and clearing them out in regular time intervals, for instance using https://github.com/StartTheShift/titan-tools[Titan tools]. Another option is to detect them at read-time using the option `checkInternalVertexExistence()` documented in <>. -Snappy 1.0.4.1 Compatibility Problems -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Cassandra 1.2.5 and earlier 1.2.x releases use Snappy 1.0.4.1. This version of Snappy had compatibility problems with Mac OSX and Java 1.7. Upgrading to Snappy 1.0.5 fixes the bug. Cassandra 1.2.6 and later ship with Snappy 1.0.5. Any users still affected by this bug are strongly urged to upgrade both their client and server Cassandra installs to a newer Cassandra version carrying a newer Snappy library unaffected by the bug. - -Historical issue links: - -* https://issues.apache.org/jira/browse/CASSANDRA-4958 -* https://github.com/xerial/snappy-java/issues/6 -* https://github.com/ptaoussanis/carmine/issues/5 - Debug-level Logging Slows Execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1241,7 +1294,7 @@ When launching Titan with embedded Cassandra, the following warnings may be disp Cassandra uses a Java agent called `MemoryMeter` which allows it to measure the actual memory use of an object, including JVM overhead. To use https://github.com/jbellis/jamm[JAMM] (Java Agent for Memory Measurements), the path to the JAMM jar must be specific in the Java javaagent parameter when launching the JVM (e.g. `-javaagent:path/to/jamm.jar`) through either titan.sh, gremlin.sh, or Rexster: -[source,bash] +[source, bash] export TITAN_JAVA_OPTS=-javaagent:$TITAN_HOME/lib/jamm-0.2.5.jar Cassandra Connection Problem @@ -1309,11 +1362,11 @@ limitations could reasonably be removed in upcoming versions of Titan. Limited Mixed Index Support ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Mixed indexes only support a subset of the data types that Titan supports. See <> for a current listing. Also, mixed indexes do not currently support property keys with SET or LIST cardinality. +Mixed indexes only support a subset of the data types that Titan supports. See <> for a current listing. Also, mixed indexes do not currently support property keys with SET or LIST cardinality. Batch Loading Speed ^^^^^^^^^^^^^^^^^^^ -Titan provides a batch loading mode that can be enabled through the <>. However, this batch mode only facilitates faster loading into the storage backend, it does not use storage backend specific batch loading techniques that prepare the data in memory for disk storage. As such, batch loading in Titan is currently slower than batch loading modes provided by single machine databases. <> contains information on speeding up batch loading in Titan. +Titan provides a batch loading mode that can be enabled through the <>. However, this batch mode only facilitates faster loading into the storage backend, it does not use storage backend specific batch loading techniques that prepare the data in memory for disk storage. As such, batch loading in Titan is currently slower than batch loading modes provided by single machine databases. <> contains information on speeding up batch loading in Titan. Another limitation related to batch loading is the failure to load millions of edges into a single vertex at once or in a short time of period. Such *supernode loading* can fail for some storage backends. This limitation also applies to dense index entries. For more information, please refer to https://github.com/thinkaurelius/titan/issues/11[Issue #11]. diff --git a/docs/upgrade.txt b/docs/upgrade.txt index eab1a24303..b8c1244744 100644 --- a/docs/upgrade.txt +++ b/docs/upgrade.txt @@ -223,7 +223,7 @@ When upgrading to Titan 0.3.0, please note the following interface changes: * In `TypeMaker`, `functional()` has been replaced by `unique(Direction.OUT)`. Likewise, `functional(boolean)` has been replaced by `unique(Direction.OUT, UniquenessConsistency)`, where the argument `true` corresponds to `UniquenessConsistency.LOCK` and `false` corresponds to `UniquenessConsistency.NO_LOCK`. * In `TypeMaker`, `unique()` for property keys has been replaced by `unique(Direction.IN)`. -* In `TypeMaker`, `indexed()` takes additional arguments because Titan now supports vertex _and_ edge indexing. Use `indexed(Class)` to create a standard index for the key. Use `indexed(String,Class)` to create an external index for the key. +* In `TypeMaker`, `indexed()` takes additional arguments because Titan now supports vertex _and_ edge indexing. Use `indexed(Class)` to create a standard index for the key. Use `indexed(String, Class)` to create an external index for the key. * In `TypeMaker`, `simple()` is no longer available. Simply remove it. * In `TitanFactory`, `openInMemoryGraph()` is no longer available. Instead, use `open(Configuration)` where the configuration sets `storage.backend=inmemory`. * In `AttributeSerializer`, `writeObjectData()` now uses `DataOutput` to write elements instead of `ByteBuffer`. A simple replace in any particular implementation of `AttributeSerializer` should do the trick. @@ -234,7 +234,7 @@ Version 0.2.1 (March 22, 2013) From Version 0.2.0 ^^^^^^^^^^^^^^^^^^ -No special upgrade necessary. Since 0.2.1 has upgraded to Blueprints 2.3.0, there are some incompatible interface changes. In particular, `Graph.startTransaction()` has been renamed to `Graph.newTransaction()`. Please refer to the https://github.com/tinkerpop/blueprints/wiki[Blueprints documentation] for more information. +No special upgrade necessary. Since 0.2.1 has upgraded to Blueprints 2.3.0, there are some incompatible interface changes. In particular, `Graph.startTransaction()` has been renamed to `Graph.newTransaction()`. Please refer to the http://tinkerpop.incubator.apache.org/docs/3.0.0.M8-incubating/#transactions[Blueprints documentation] for more information. From prior versions ^^^^^^^^^^^^^^^^^^^ diff --git a/titan-all/src/main/java/com/thinkaurelius/titan/graphdb/tinkerpop/plugin/TitanGremlinPlugin.java b/titan-all/src/main/java/com/thinkaurelius/titan/graphdb/tinkerpop/plugin/TitanGremlinPlugin.java index 55edf0e993..4863cdfc55 100644 --- a/titan-all/src/main/java/com/thinkaurelius/titan/graphdb/tinkerpop/plugin/TitanGremlinPlugin.java +++ b/titan-all/src/main/java/com/thinkaurelius/titan/graphdb/tinkerpop/plugin/TitanGremlinPlugin.java @@ -11,6 +11,7 @@ import java.util.HashSet;; import java.util.Set; +import java.util.concurrent.TimeUnit; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -34,6 +35,7 @@ public class TitanGremlinPlugin implements GremlinPlugin { add(IMPORT_STATIC + Text.class.getName() + DOT_STAR); add(IMPORT_STATIC + Multiplicity.class.getName() + DOT_STAR); add(IMPORT_STATIC + Cardinality.class.getName() + DOT_STAR); + add(IMPORT_STATIC + TimeUnit.class.getName() + DOT_STAR); }}; @Override diff --git a/titan-core/src/main/java/com/thinkaurelius/titan/graphdb/configuration/GraphDatabaseConfiguration.java b/titan-core/src/main/java/com/thinkaurelius/titan/graphdb/configuration/GraphDatabaseConfiguration.java index 106fc14493..62ed7e3d7b 100644 --- a/titan-core/src/main/java/com/thinkaurelius/titan/graphdb/configuration/GraphDatabaseConfiguration.java +++ b/titan-core/src/main/java/com/thinkaurelius/titan/graphdb/configuration/GraphDatabaseConfiguration.java @@ -1284,6 +1284,12 @@ public boolean apply(@Nullable String s) { ConfigOption.Type.LOCAL, Boolean.class, false); + public static final ConfigNamespace GREMLIN_NS = new ConfigNamespace(ROOT_NS,"gremlin", + "Gremlin configuration options"); + + public static final ConfigOption GREMLIN_GRAPH = new ConfigOption(GREMLIN_NS, "graph", + "The implementation of graph factory that will be sued by gremlin server", ConfigOption.Type.LOCAL, "com.thinkaurelius.titan.core.TitanFactory"); + // ################ Begin Class Definition ####################### // ############################################################### diff --git a/titan-dist/src/assembly/cfilter/conf/titan-cassandra-embedded-es.properties b/titan-dist/src/assembly/cfilter/conf/titan-cassandra-embedded-es.properties index 714b00173c..014a7c2406 100644 --- a/titan-dist/src/assembly/cfilter/conf/titan-cassandra-embedded-es.properties +++ b/titan-dist/src/assembly/cfilter/conf/titan-cassandra-embedded-es.properties @@ -13,7 +13,7 @@ #TITANCFG{storage.backend=embeddedcassandra} -#TITANCFG{storage.conf-file=cassandra.yaml} +#TITANCFG{storage.conf-file=cassandra/cassandra.yaml} #TITANCFG{cache.db-cache = true} diff --git a/titan-dist/src/assembly/cfilter/conf/titan-cassandra-embedded-solr.properties b/titan-dist/src/assembly/cfilter/conf/titan-cassandra-embedded-solr.properties index 1da00414a8..6b55986f98 100644 --- a/titan-dist/src/assembly/cfilter/conf/titan-cassandra-embedded-solr.properties +++ b/titan-dist/src/assembly/cfilter/conf/titan-cassandra-embedded-solr.properties @@ -14,7 +14,7 @@ #TITANCFG{storage.backend=embeddedcassandra} -#TITANCFG{storage.conf-file=cassandra.yaml} +#TITANCFG{storage.conf-file=cassandra/cassandra.yaml} #TITANCFG{cache.db-cache = true} diff --git a/titan-dist/src/assembly/cfilter/conf/titan-cassandra-embedded.properties b/titan-dist/src/assembly/cfilter/conf/titan-cassandra-embedded.properties index 5c2b8dadc0..86545779dc 100644 --- a/titan-dist/src/assembly/cfilter/conf/titan-cassandra-embedded.properties +++ b/titan-dist/src/assembly/cfilter/conf/titan-cassandra-embedded.properties @@ -9,7 +9,7 @@ #TITANCFG{storage.backend=embeddedcassandra} -#TITANCFG{storage.conf-file=cassandra.yaml} +#TITANCFG{storage.conf-file=cassandra/cassandra.yaml} #TITANCFG{cache.db-cache = true} diff --git a/titan-dist/src/assembly/resources/conf/rexster-cassandra-es.xml b/titan-dist/src/assembly/resources/conf/rexster-cassandra-es.xml deleted file mode 100644 index 0c74cc523e..0000000000 --- a/titan-dist/src/assembly/resources/conf/rexster-cassandra-es.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - - 8182 - 0.0.0.0 - http://localhost - public - UTF-8 - false - true - 2097152 - 8192 - 30000 - - - 8 - 8 - - - 4 - 4 - - - leader-follower - - - 8184 - 0.0.0.0 - 1790000 - 3000000 - 180000 - 3000000 - 65536 - false - - - 8 - 8 - - - 4 - 4 - - - leader-follower - - 8183 - 127.0.0.1 - 10000 - - - gremlin-groovy - 500 - ${imports} - ${staticimports} - - - - - none - - - - rexster - rexster - - - - - - - - jmx - - - http - - - console - - SECONDS - SECONDS - 10 - MINUTES - http.rest.* - http.rest.*.delete - - - - - - graph - com.thinkaurelius.titan.tinkerpop.rexster.TitanGraphConfiguration - - false - - cassandra - elasticsearch - 127.0.0.1 - true - - - - tp:gremlin - - - - - diff --git a/titan-dist/src/assembly/resources/conf/rexster-cassandra.xml b/titan-dist/src/assembly/resources/conf/rexster-cassandra.xml deleted file mode 100644 index 80c566227d..0000000000 --- a/titan-dist/src/assembly/resources/conf/rexster-cassandra.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - 8182 - 0.0.0.0 - http://localhost - public - UTF-8 - false - true - 2097152 - 8192 - 30000 - - - 8 - 8 - - - 4 - 4 - - - leader-follower - - - 8184 - 0.0.0.0 - 1790000 - 3000000 - 180000 - 3000000 - false - - - 8 - 8 - - - 4 - 4 - - - leader-follower - - 8183 - 127.0.0.1 - - - gremlin-groovy - -1 - ${imports} - ${staticimports} - - - - - none - - - - rexster - rexster - - - - - - - - jmx - - - http - - - console - - SECONDS - SECONDS - 10 - MINUTES - http.rest.* - http.rest.*.delete - - - - - - graph - com.thinkaurelius.titan.tinkerpop.rexster.TitanGraphConfiguration - - false - - cassandra - - - - tp:gremlin - - - - - diff --git a/titan-dist/src/assembly/static/bin/gremlin-server.sh b/titan-dist/src/assembly/static/bin/gremlin-server.sh index bffb76caca..a28e791482 100755 --- a/titan-dist/src/assembly/static/bin/gremlin-server.sh +++ b/titan-dist/src/assembly/static/bin/gremlin-server.sh @@ -45,5 +45,9 @@ if [ "$1" = "-i" ]; then shift exec $JAVA -Dtitan.logdir="$TITAN_LOGDIR" -Dlog4j.configuration=conf/gremlin-server/log4j-server.properties $JAVA_OPTIONS -cp $CP:$CLASSPATH org.apache.tinkerpop.gremlin.server.util.GremlinServerInstall "$@" else - exec $JAVA -Dtitan.logdir="$TITAN_LOGDIR" -Dlog4j.configuration=conf/gremlin-server/log4j-server.properties $JAVA_OPTIONS -cp $CP:$CLASSPATH org.apache.tinkerpop.gremlin.server.GremlinServer "$@" + ARGS="$@" + if [ $# = 0 ] ; then + ARGS="conf/gremlin-server/gremlin-server.yaml" + fi + exec $JAVA -Dtitan.logdir="$TITAN_LOGDIR" -Dlog4j.configuration=conf/gremlin-server/log4j-server.properties $JAVA_OPTIONS -cp $CP:$CLASSPATH org.apache.tinkerpop.gremlin.server.GremlinServer $ARGS fi diff --git a/titan-dist/src/assembly/static/conf/gremlin-server/gremlin-server.yaml b/titan-dist/src/assembly/static/conf/gremlin-server/gremlin-server.yaml index 19a68321e6..74cb83b432 100644 --- a/titan-dist/src/assembly/static/conf/gremlin-server/gremlin-server.yaml +++ b/titan-dist/src/assembly/static/conf/gremlin-server/gremlin-server.yaml @@ -17,8 +17,8 @@ scriptEngines: { imports: [java.lang.Math], staticImports: [java.lang.Math.PI]}} serializers: - - { className: org.apache.tinkerpop.gremlin.driver.ser.KryoMessageSerializerV1d0 } - - { className: org.apache.tinkerpop.gremlin.driver.ser.KryoMessageSerializerV1d0, config: { serializeResultToString: true }} + - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0 } + - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true }} - { className: org.apache.tinkerpop.gremlin.driver.ser.JsonMessageSerializerGremlinV1d0 } - { className: org.apache.tinkerpop.gremlin.driver.ser.JsonMessageSerializerV1d0 } processors: diff --git a/titan-dist/src/assembly/static/conf/remote-objects.yaml b/titan-dist/src/assembly/static/conf/remote-objects.yaml index a7329b37dd..368b3de351 100644 --- a/titan-dist/src/assembly/static/conf/remote-objects.yaml +++ b/titan-dist/src/assembly/static/conf/remote-objects.yaml @@ -1,3 +1,3 @@ hosts: [localhost] port: 8182 -serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.KryoMessageSerializerV1d0} \ No newline at end of file +serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0} \ No newline at end of file diff --git a/titan-dist/src/assembly/static/conf/remote.yaml b/titan-dist/src/assembly/static/conf/remote.yaml index c1addb94e1..32cb815550 100644 --- a/titan-dist/src/assembly/static/conf/remote.yaml +++ b/titan-dist/src/assembly/static/conf/remote.yaml @@ -1,3 +1,3 @@ hosts: [localhost] port: 8182 -serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.KryoMessageSerializerV1d0, config: { serializeResultToString: true }} \ No newline at end of file +serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true }} \ No newline at end of file diff --git a/titan-es/pom.xml b/titan-es/pom.xml index d59880a22b..e43ba23804 100644 --- a/titan-es/pom.xml +++ b/titan-es/pom.xml @@ -55,7 +55,19 @@ org.elasticsearch elasticsearch ${elasticsearch.version} + + + org.antlr + antlr-runtime + + + + org.antlr + antlr-runtime + ${antlr.version} + +