From b9af5707a1c9982a491227bd0833f246c622512b Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Thu, 15 Dec 2011 13:22:44 +0100 Subject: [PATCH 1/5] updated documentation --- .../programming-model/conversion.xml | 16 ++ .../reference/programming-model/indexing.xml | 87 +++++-- .../programming-model/introducedmethods.xml | 10 +- .../programming-model/projection.xml | 6 +- .../programming-model/repositories.xml | 237 ++++++++++++------ .../reference/programming-model/spatial.xml | 6 +- .../reference/programming-model/template.xml | 35 ++- .../programming-model/transactions.xml | 29 ++- 8 files changed, 303 insertions(+), 123 deletions(-) create mode 100644 src/docbkx/reference/programming-model/conversion.xml diff --git a/src/docbkx/reference/programming-model/conversion.xml b/src/docbkx/reference/programming-model/conversion.xml new file mode 100644 index 000000000..d1efd64fc --- /dev/null +++ b/src/docbkx/reference/programming-model/conversion.xml @@ -0,0 +1,16 @@ + + +
+ Conversion + + Neo4jTemplate has a generic convert method which might also use projection underneath. + The same conversion facilities that are used by default in the result handling DSL are offered here for individual use. + + + Supported conversions are: Nodes to Paths and to Entities, Relationships to Paths and to Entities, Paths to Node (EndNode), + Relationships (LastRelationship) and to EntityPaths. Entities to Nodes or Relationships. + + + It is also possible to provide a custom ResultConverter that additionally takes care of conversions. + +
\ No newline at end of file diff --git a/src/docbkx/reference/programming-model/indexing.xml b/src/docbkx/reference/programming-model/indexing.xml index 5faa250c9..cf13a6cc3 100644 --- a/src/docbkx/reference/programming-model/indexing.xml +++ b/src/docbkx/reference/programming-model/indexing.xml @@ -3,10 +3,16 @@
Indexing + + Indexing is used in Neo4j to quickly find nodes and relationships to start graph operations from. + Either for manually traversing the graph, using the traversal framework, cypher or gremlin queries + or for "global" graph operations. Indexes are also employed to ensure uniqueness of elements with + certain properties. + - The Neo4j graph database can use different so-called index providers for exact lookups and fulltext + The Neo4j graph database employs different index providers for exact lookups and fulltext searches. Lucene is the default index provider implementation. Each named index is configured to be - fulltext or exact. + fulltext or exact. There is also a spatial index provider for geo-searches.
@@ -23,20 +29,29 @@ other fields are indexed with their string representation. - The @Indexed annotation also provides the option of using a custom index. The default index + The @Indexed annotation also provides the option of using a custom index name. The default index name is the simple class name of the entity, so that each class typically gets its own index. It is recommended to not have two entity classes with the same class name, regardless of package. + + If a field is declared in a superclass but different indexes for subclasses are needed, the + level attribute declares what will be used as index. Level.CLASS + uses the class where the field was declared and Level.INSTANCE uses the class + that is provided or of the actual entity instance. The indexes can be queried by using a repository (see ). - Typically, the repository is an instance of - org.springframework.data.neo4j.repository.DirectGraphRepositoryFactory. + The repository is an instance of + org.springframework.data.neo4j.repository.IndexRepository. The methods findByPropertyValue() and findAllByPropertyValue() work on the exact indexes and return the first or all matches. To do range queries, use findAllByRange() (please note that currently both values are inclusive). + + For providing explicit index names the repository has to extend NamedIndexRepository. + This adds the shown methods with another signature that take the index name as first parameter. + Indexing entities Spring Data Neo4j also supports fulltext indexes. By default, indexed fields are stored in an exact lookup index. To have them analyzed and prepared for fulltext search, the - @Indexed annotation has the boolean fulltext attribute. + @Indexed annotation has the type attribute which can be set to IndexType.FULLTEXT. Please note that fulltext indexes require a separate index name as the fulltext configuration is stored in the index itself. @@ -72,7 +87,7 @@ for (Person middleAgedDeveloper : graphRepository.findAllByRange("age", 20, 40)) Access to the fulltext index is provided by the findAllByQuery() repository method. Wildcards like * are allowed. Generally though, the fulltext querying rules of the underlying index provider apply. See the - Lucene documentation for more + Lucene documentation for more information on this. @@ -101,41 +116,73 @@ Person mark = graphRepository.findAllByQuery("people-search", "name", "ma*");
Manual index access - The index for a domain class is also available from GraphDatabaseContext via + The index for a domain class is also available from Neo4jTemplate via the getIndex() method. The second parameter is optional and takes the index name if it should not be inferred from the class name. It returns the index implementation that is provided by Neo4j. - Manual index usage - Manual index retrieval by type and name + personIndex = gdc.getIndex(Person.class); +Index personIndex = template.getIndex(null, Person.class); personIndex.query(new QueryContext(NumericRangeQuery.newÍntRange("age", 20, 40, true, true)) .sort(new Sort(new SortField("age", SortField.INT, false)))); // Named index -Index namedPersonIndex = gdc.getIndex(Person.class, "people"); +Index namedPersonIndex = template.getIndex("people",Person.class); namedPersonIndex.get("name", "Mark"); // Fulltext index -Index personFulltextIndex = gdc.getIndex(Person.class, "people-search", true); +Index personFulltextIndex = template.getIndex("people-search", Person.class); +personFulltextIndex.query("name", "*cha*"); +personFulltextIndex.query("{name:*cha*}"); +]]> + + + It is also possible to pass in the property name of the entity with an @Indexed annotation whose + index should be returned. + + + Manual index retrieval by property configuration + personIndex = template.getIndex(Person.class, "age"); +personIndex.query(new QueryContext(NumericRangeQuery.newÍntRange("age", 20, 40, true, true)) + .sort(new Sort(new SortField("age", SortField.INT, false)))); + +// Fulltext index +Index personFulltextIndex = template.getIndex(Person.class,"name"); personFulltextIndex.query("name", "*cha*"); personFulltextIndex.query("{name:*cha*}"); ]]>
- Indexing in Neo4jTemplate - - Neo4jTemplate also offers index support, providing auto-indexing for fields at creation time. - There is an autoIndex method that can also add indexes for a set of fields in one go. - + Index queries in Neo4jTemplate For querying the index, the template offers query methods that take either the exact match - parameters or a query object/expression, and push the results wrapped uniformly as Paths to - the supplied PathMapper to be converted or collected. + parameters or a query object/expression, return the results as Result objects which + then can be converted and projected further using the result-conversion-dsl (see ).
+
+ Neo4j Auto Indexes + + Neo4j allows to configure auto-indexing + for certain properties on nodes and relationships. This auto-indexing differs + from the approach used in Spring Data Neo4j because it only updates the indexes when the transaction is committed. So the + index modifications will only be available after the successful commit. + It is possible to use the specific index names node_auto_index and relationship_auto_index when + querying indexes in Spring Data Neo4j either with the query methods in template and repositories or via Cypher and Gremlin. + +
+
+ Spatial Indexes + + Spring Data Neo4j offers limited support for spatial queries using the neo4j-spatial library. See the + separate chapter for details. + +
diff --git a/src/docbkx/reference/programming-model/introducedmethods.xml b/src/docbkx/reference/programming-model/introducedmethods.xml index cf93ea093..96be16a13 100644 --- a/src/docbkx/reference/programming-model/introducedmethods.xml +++ b/src/docbkx/reference/programming-model/introducedmethods.xml @@ -1,8 +1,14 @@
- Introduced methods + Active Record Methods for Advanced Mapping Mode + This chapter only applies to the advanced mapping. Currently the Aspects introduce the following + methods by default, this will change in the future, there will be separate Mixin-Interfaces that + can selectively mixed into the domain entities if needed. Otherwise the AspectJ interaction will + be restricted to field access interception and post constructor handling. + + The node and relationship aspects introduce (via AspectJ ITD - inter type declaration) several methods to the entities. @@ -114,7 +120,7 @@ - Executes the given query, providing the {self} variable with the node-id and returning the results converted to the target type. + Executes the given Cypher query, providing the {self} variable with the node-id and returning the results converted to the target type. <T> Iterable<T> NodeBacked.findAllByQuery(final String query, final Class<T> targetType) diff --git a/src/docbkx/reference/programming-model/projection.xml b/src/docbkx/reference/programming-model/projection.xml index 3b8bfac1d..71545eac8 100644 --- a/src/docbkx/reference/programming-model/projection.xml +++ b/src/docbkx/reference/programming-model/projection.xml @@ -16,8 +16,8 @@ context and only offers the attributes and methods needed here would be very beneficial. Spring Data Neo4j offers initial support for projecting node and relationship entities to different target - types. All instances of this projected entity share the same backing node or relationship, so data changes are - reflected immediately. + types. All instances of this projected entity share the same backing node or relationship, so changes are + reflected on the same data. This could for instance also be used to handle nodes of a traversal with a unified (simpler) type (e.g. for @@ -41,6 +41,4 @@ for (Person person : graphRepository.findAllByPropertyValue("occupation","develo } ]]> - -
diff --git a/src/docbkx/reference/programming-model/repositories.xml b/src/docbkx/reference/programming-model/repositories.xml index 3b7f837a5..3e1b4b9d7 100644 --- a/src/docbkx/reference/programming-model/repositories.xml +++ b/src/docbkx/reference/programming-model/repositories.xml @@ -4,37 +4,32 @@ CRUD with repositories The repositories provided by Spring Data Neo4j build on the composable repository infrastructure - in Spring Data Commons. + in Spring Data Commons. They allow for interface based composition of repositories consisting of provided default implementations for certain interfaces and additional custom implementations for other methods. - - - - - - - - - - - Spring Data Neo4j repositories support annotated and named queries for the Neo4j - Cypher query-language. + Cypher query-language and + Gremlin graph DSL. Spring Data Neo4j comes with typed repository implementations that provide methods for - locating node and relationship entities. There are 3 types of basic repository interfaces + locating node and relationship entities. There are several types of basic repository interfaces and implementations. CRUDRepository provides basic operations, IndexRepository and NamedIndexRepository delegate to Neo4j's internal indexing subsystem for queries, and TraversalRepository handles Neo4j traversals. - GraphRepository is a convenience repository interface, extending CRUDRepository, + With the RelationshipOperationsRepository it is possible to access, create and delete + relationships between entitites or nodes. + The SpatialRepository allows geographic searches () + + + GraphRepository is a convenience repository interface, combining CRUDRepository, IndexRepository, and TraversalRepository. Generally, it has all the - desired repository methods. If named index operations are required, then NamedIndexRepository - may also be included. + desired repository methods. If other operations are required then the additional repository interfaces should + be added to the individual interface declaration.
@@ -45,41 +40,38 @@ for type based queries. - Load an instance via a Neo4j node id + Load an entity instance via an id T findOne(id) - Check for existence of a Neo4j node id + Check for existence of a id in the graph boolean exists(id) - Iterate over all nodes of a node entity type - Iterable<T> findAll() - (supported in future versions: - Iterable<T> findAll(Sort) and - Page<T> findAll(Pageable)) + Iterate over all entities instances of the repository entity type + + + Iterable<T> findAll() + Iterable<T> findAll(Sort) + Page<T> findAll(Pageable) + + - Count the instances of a node entity type + Count the instances of the repository entity type Long count() - Save a graph entity + Save entities T save(T) and Iterable<T> save(Iterable<T>) - Delete a graph entity + Delete graph entities void delete(T), void; delete(Iterable<T>), and deleteAll() - - Important to note here is that the save, delete, and deleteAll - methods are only there to conform to the org.springframework.data.repository.Repository - interface. The recommended way of saving and deleting entities is by using entity.persist() - and entity.remove(). -
@@ -128,30 +120,33 @@
- Cypher queries + Query and Finder Methods
Annotated queries Queries using the Cypher graph query language can be supplied with the @Query annotation. - That means every method annotated with @Query("start n=(%node) match (n)-->(m) return m") - will use the supplied query string. The named parameter %node will be replaced by the actual method parameters. - Node and Relationship-Entities are resolved to their respective id's and all other parameters are + That means every method annotated with @Query("start n=node:IndexName(key={node or 0}) match (n)-->(m) return m") + will use the supplied query string. The named or indexed parameter {node} will be substituted by the actual method parameter. + Node and Relationship-Entities are handled directly, Iterables thereof as well. All other parameters are replaced directly (i.e. Strings, Longs, etc). There is special support for the Sort and Pageable parameters from Spring Data Commons, which are supported to add programmatic paging and sorting (alternatively static paging and sorting can be supplied in the query string itself). For using the named parameters you have to either annotate the parameters of the method with the - @Param("node") annotation or enable debug symbols. + @Param("node") annotation or enable debug symbols. Indexed parameters are always usable. + + Gremlin queries can be used similarly, the @Query annotation would just need a type=QueryType.GREMLIN attribute. + Parameters are supported in the same way. +
Named queries Spring Data Neo4j also supports the notion of named queries which are externalized in property-config-files (META-INF/neo4j-named-queries.properties). Those files have the format: - Entity.finderName=query (e.g. Person.findBoss=start p=({p_person}) match (p)<-[:BOSS]-(boss) return boss). - Otherwise named queries support the same parameters as annotated queries. For using the named parameters you have to either - annotate the parameters of the method with the @Param("p_person") annotation or enable debug symbols. + Entity.finderName=query (e.g. Person.findBoss=start p=node({0}) match (p)<-[:BOSS]-(boss) return boss). + Otherwise named queries support the same parameters as annotated queries.
@@ -189,36 +184,118 @@
+
+ Queries derived from finder-method names + As known from Rails or Grails it is possible to derive queries for domain entities from finder method names + like Iterable<Person> findByNameAndAgeGreaterThan(String name, int age). + + Using the infrastructure in Spring Data Commons that allows to collect the meta information about entities and their properties a finder method + name can be split into its semantic parts and converted into a cypher query. + @Indexed fields will be converted into index-lookups of the start clause, + navigation along relationships will be reflected in the match clause properties with operators will end up as expressions in the + where clause. Order and limiting of the query will by handled by provided Pageable or parameters. + The other parameters will be used in the order they appear in the method signature so that should align with the expressions stated in the method name. + + + + Some examples of methods and resulting cypher queries of a PersonRepository + { + +// start person=node:Person(id={0}) return person +Person findById(String id) + +// start person=node:Person({0}) return person - {0} will be "id:"+name +Iterable findByNameLike(String name) + +// start person=node:__types__("className"="com...Person") +// where person.age = {0} and person.married = {1} +// return person +Iterable findByAgeAndMarried(int age, boolean married) + +// start person=node:__types__("className"="com...Person") +// match person<-[:CHILD]-parent +// where parent.age > {0} and person.married = {1} +// return person +Iterable findByParentAgeAndMarried(int age, boolean married) +} +]]> + + +
+
+ + CypherDSL repository + + Spring Data Neo4j supports the new cypher-dsl to write Cypher queries in a statically typed way. Just by including + CypherDslRepository to your repository you get the Page query(Execute query, params, Pageable page) + and the EndResult query(Execute query, params);. The result type of the Cypher-DSL builder is called + Execute + + + Examples for Cypher-DSL repository + + , + CypherDslRepository {} + + @Autowired PersonRepository repo; + // START company=node:Company(name={name}) MATCH company<-[:WORKS_AT]->person RETURN person + + Execute query = start( lookup( "company", "Company", "name", param("name") ) ). + match( path().from( "company" ).in( "WORKS_AT" ).to( "person" )). + returns( nodes( "person" )) + Page people = repo.query(query , map("name","Neo4j"), new PageRequest(1,10)); + + QPerson person = QPerson.person; + QCompany company = QCompany.company; + Execute query = start( lookup( company, "Company", company.name, param("name") ) ). + match( path().from( company ).in( "WORKS_AT" ).to( person ). + .where(person.firstName.like("P*").and(person.age.gt(25))). + returns( nodes( person )) + EndResult people = repo.query(query , map("name","Neo4j")); + + ]]> + +
+ + +
Creating repositories - The Repository instances are either created manually via a - DirectGraphRepositoryFactory, bound to a concrete node or relationship entity class. - The DirectGraphRepositoryFactory is configured in the Spring context and can be injected. + The Repository instances should normally be injected but can also be created manually via the + Neo4jTemplate. - Using GraphRepositories - graphRepository = template - .repositoryFor(Person.class); + Using basic GraphRepository methods + {} -Person michael = graphRepository.save(new Person("Michael", 36)); +@Autowired PersonRepository repo; +// OR +GraphRepository repo = template + .repositoryFor(Person.class); -Person dave = graphRepository.findOne(123); +Person michael = repo.save(new Person("Michael", 36)); -Long numberOfPeople = graphRepository.count(); +Person dave = repo.findOne(123); -Person mark = graphRepository.findByPropertyValue("name", "mark"); +Long numberOfPeople = repo.count(); -Iterable devs = graphRepository.findAllByProperyValue("occupation", "developer"); +Person mark = repo.findByPropertyValue("name", "mark"); -Iterable middleAgedPeople = graphRepository.findAllByRange("age", 20, 40); +Iterable devs = repo.findAllByProperyValue("occupation", "developer"); -Iterable aTeam = graphRepository.findAllByQuery("name", "A*"); +Iterable middleAgedPeople = repo.findAllByRange("age", 20, 40); -Iterable davesFriends = graphRepository.findAllByTraversal(dave, +Iterable aTeam = repo.findAllByQuery("name", "A*"); + +Iterable davesFriends = repo.findAllByTraversal(dave, Traversal.description().pruneAfterDepth(1) .relationships(KNOWS).filter(returnAllButStartNode())); ]]> @@ -237,6 +314,29 @@ Iterable davesFriends = graphRepository.findAllByTraversal(dave, Composing repositories , PersonRepositoryExtension {} +// configure the repositories, preferably via the datagraph:repositories namespace +// (template reference is optional) + + +// have it injected +@Autowired +PersonRepository personRepository; +// or created via the template +PersonRepository personRepository = template.repositoryFor(Person.class); + + +Person michael = personRepository.save(new Person("Michael",36)); + +Person dave=personRepository.findOne(123); + +Iterable devs = personRepository.findAllByPropertyValue("occupation","developer"); + +Iterable aTeam = graphRepository.findAllByQuery( "name","A*"); + +Iterable friends = personRepository.findFriends(dave); + + // alternatively select some of the required repositories individually public interface PersonRepository extends CRUDGraphRepository, IndexQueryExecutor, TraversalQueryExecutor, @@ -254,27 +354,14 @@ public class PersonRepositoryImpl implements PersonRepositoryExtension { return baseRepository.findAllByTraversal(person, friendsTraversal); } } - -// configure the repositories, preferably via the datagraph:repositories namespace -// (template reference is optional) - - -// have it injected -@Autowired -PersonRepository personRepository; - -Person michael = personRepository.save(new Person("Michael",36)); - -Person dave=personRepository.findOne(123); - -Iterable devs = personRepository.findAllByPropertyValue("occupation","developer"); - -Iterable aTeam = graphRepository.findAllByQuery( "name","A*"); - -Iterable friends = personRepository.findFriends(dave); ]]> - + + + If you use <context:component-scan> in your spring config, please make sure to put it behind + <neo4j:repositories>, as the RepositoryFactoryBean adds new bean definitions for all the declared + repositories, the context scan doesn't pick them up otherwise. + +
\ No newline at end of file diff --git a/src/docbkx/reference/programming-model/spatial.xml b/src/docbkx/reference/programming-model/spatial.xml index adfcbe35a..1766fe28b 100644 --- a/src/docbkx/reference/programming-model/spatial.xml +++ b/src/docbkx/reference/programming-model/spatial.xml @@ -4,7 +4,7 @@ Geospatial Queries SpatialRepository is a dedicated Repository for spatial queries. - Spring Data Neo4j provides an optional dependency to neo4j-spatial which is an advanced library + Spring Data Neo4j provides an optional dependency to neo4j-spatial which is an advanced library for GIS operations. So if you include the maven dependency in your pom.xml, Neo4j-Spatial and the required SPATIAL index provider is available. @@ -28,12 +28,12 @@ - Fields of + Fields of Well Known Text
+ Neo4jTemplate + The Neo4jTemplate offers the convenient API of Spring templates for the Neo4j graph - database. + database. The Spring Data Neo4j Object Graph mapping builds upon the core functionality of the + template to persist objects to the graph and load them in a variety of ways. + The template handles the active mapping mode () transparently. + + + Besides methods for creating, storing and deleting entities, nodes and relationships in the graph, Neo4jTemplate + also offers a wide range of query methods. To reduce the proliferation of query methods a simple result handling + DSL was added. @@ -17,8 +26,9 @@ ResultConverter<FROM,TO> which takes care of custom conversions. By default most query methods can already handle conversions from and to: Paths, Nodes, Relationship and GraphEntities as well as conversions backed by registered ConversionServices. A converted Result<FROM> is an - Iterable<TO>. Results can be limited to a single value using the result.single() - method. It also offers support for a pure callback function using a Handler<T>. + Iterable<TO>. Results can be limited to a single value using the + result.single() or result.singleOrNull() + methods. It also offers support for a pure callback function using a Handler<T>.
@@ -37,7 +47,7 @@ The traversal methods are at the core of graph operations. The traverse() method covers the full traversal operation that takes a - TraversalDescription (typically built with the Traversal.description() + TraversalDescription (typically built with the template.getGraphDatabase().traversalDescription() DSL) and runs it from the given start node. traverse returns a Result<Path> to be used or transformed. @@ -62,18 +72,21 @@
Transactions - The Neo4jTemplate provides configurable implicit transactions for all its methods. By - default it creates a transaction for each call (which is a no-op if there is already a transaction - running). If you call the constructor with the useExplicitTransactions parameter set to - true, it won't create any transactions so you have to provide them using @Transactional - or the TransactionTemplate. + The Neo4jTemplate provides implicit transactions for some of its methods. For instance + save uses them. For other modifying operations please provide Spring Transaction management + using @Transactional or the TransactionTemplate.
Neo4j REST Server - If the template is configured to use a RestGraphDatabase the expensive operations + If the template is configured to use a SpringRestGraphDatabase the operations that would + be expensive over the wire, like traversals and querying are executed efficiently on the server side by using the REST API to forward - those calls. All the other template methods require single network operations. + those calls. All the other template methods require individual network operations. + + The REST-batch-mode of the SpringRestGraphDatabase is not yet exposed via the template, but it is available + via the graph database. +
diff --git a/src/docbkx/reference/programming-model/transactions.xml b/src/docbkx/reference/programming-model/transactions.xml index d38081147..0f210754d 100644 --- a/src/docbkx/reference/programming-model/transactions.xml +++ b/src/docbkx/reference/programming-model/transactions.xml @@ -4,14 +4,24 @@ Transactions Neo4j is a transactional database, only allowing modifications to be performed within transaction - boundaries. Reading data does however not require transactions. + boundaries. Reading data does however not require transactions. Spring Data Neo4j integrates nicely + with both the declarative transaction support with @Transactional as well as the + manual transaction handling with TransactionTemplate. It also supports the rollback + mechanisms of the Spring Testing library. Spring Data Neo4j integrates with transaction managers configured using Spring. The simplest - scenario of just running the graph database uses a SpringTransactionManager provided by the - Neo4j kernel to be used with Spring's JtaTransactionManager. That is, configuring Spring to + scenario of just running the graph database uses a SpringTransactionManager provided by the + Neo4j kernel to be used with Spring's JtaTransactionManager. That is, configuring Spring to use Neo4j's transaction manager. + + + To avoid name collisons the transaction manager configured by Spring Data Neo4j is called neo4jTransactionManager + and is aliased to transactionManager. So defining a separate transactionManager bean should not + interfere with Spring Data Neo4j operations. + + The explicit XML configuration given below is encoded in the Neo4jConfiguration @@ -22,7 +32,8 @@ Simple transaction manager configuration - + @@ -35,12 +46,12 @@ - + ]]> For scenarios with multiple transactional resources there are two options. The first option - is to have Neo4j participate in the externally configured transaction manager by using the + is to have Neo4j participate in the externally configured transaction manager using the Spring support in Neo4j by enabling the configuration parameter for your graph database. Neo4j will then use Spring's transaction manager instead of its own. @@ -49,13 +60,15 @@ - + - + From e22f052bd4945ebc2f534e53422c4099b901cf53 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Thu, 15 Dec 2011 13:42:14 +0100 Subject: [PATCH 2/5] cineasts: changed usages of Person to concrete types Actor and Director --- .../src/main/java/org/neo4j/cineasts/domain/Movie.java | 8 ++++---- .../src/main/java/org/neo4j/cineasts/domain/Role.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Movie.java b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Movie.java index c7e4f4fe0..3c6c88406 100644 --- a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Movie.java +++ b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Movie.java @@ -26,10 +26,10 @@ public class Movie { String description; @RelatedTo(type="DIRECTED", direction = INCOMING) - Person director; + Director director; @RelatedTo(type = "ACTS_IN", direction = INCOMING) - Set actors; + Set actors; @RelatedToVia(type = "ACTS_IN", direction = INCOMING) Iterable roles; @@ -57,7 +57,7 @@ public class Movie { this.title = title; } - public Collection getActors() { + public Collection getActors() { return actors; } @@ -106,7 +106,7 @@ public class Movie { return allRatings == null ? Collections.emptyList() : IteratorUtil.asCollection(allRatings); } - public Person getDirector() { + public Director getDirector() { return director; } diff --git a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Role.java b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Role.java index d58ba10d1..fdbc52690 100644 --- a/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Role.java +++ b/spring-data-neo4j-examples/cineasts/src/main/java/org/neo4j/cineasts/domain/Role.java @@ -13,7 +13,7 @@ import org.springframework.data.neo4j.annotation.StartNode; public class Role { @GraphId Long id; @EndNode Movie movie; - @StartNode Person actor; + @StartNode Actor actor; String name; @@ -38,7 +38,7 @@ public class Role { return movie; } - public Person getActor() { + public Actor getActor() { return actor; } From 6356ab063f174c80cc9d3a5b75df6e2df367f9f2 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Thu, 15 Dec 2011 14:17:42 +0100 Subject: [PATCH 3/5] fixed XML errors in docs --- src/docbkx/reference/programming-model/indexing.xml | 3 ++- src/docbkx/reference/programming-model/repositories.xml | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/docbkx/reference/programming-model/indexing.xml b/src/docbkx/reference/programming-model/indexing.xml index cf13a6cc3..f8a6fb8e7 100644 --- a/src/docbkx/reference/programming-model/indexing.xml +++ b/src/docbkx/reference/programming-model/indexing.xml @@ -39,6 +39,7 @@ level attribute declares what will be used as index. Level.CLASS uses the class where the field was declared and Level.INSTANCE uses the class that is provided or of the actual entity instance. +
The indexes can be queried by using a repository (see ). @@ -170,7 +171,7 @@ personFulltextIndex.query("{name:*cha*}");
Neo4j Auto Indexes - Neo4j allows to configure auto-indexing + Neo4j allows to configure auto-indexing for certain properties on nodes and relationships. This auto-indexing differs from the approach used in Spring Data Neo4j because it only updates the indexes when the transaction is committed. So the index modifications will only be available after the successful commit. diff --git a/src/docbkx/reference/programming-model/repositories.xml b/src/docbkx/reference/programming-model/repositories.xml index 3e1b4b9d7..1e3f0ce37 100644 --- a/src/docbkx/reference/programming-model/repositories.xml +++ b/src/docbkx/reference/programming-model/repositories.xml @@ -232,8 +232,8 @@ Iterable findByParentAgeAndMarried(int age, boolean married) CypherDSL repository Spring Data Neo4j supports the new cypher-dsl to write Cypher queries in a statically typed way. Just by including - CypherDslRepository to your repository you get the Page query(Execute query, params, Pageable page) - and the EndResult query(Execute query, params);. The result type of the Cypher-DSL builder is called + CypherDslRepository to your repository you get the Page<T> query(Execute query, params, Pageable page) + and the EndResult<T> query(Execute query, params);. The result type of the Cypher-DSL builder is called Execute From 99c12a7e963aee8b4b5c7cbe608bf74ce8c548e6 Mon Sep 17 00:00:00 2001 From: Werner Nickl Date: Thu, 15 Dec 2011 14:32:45 +0100 Subject: [PATCH 4/5] - Made a IndexProvider.customizeIndexName(String indexName, Class type). If you override the default implementation you can do something with the name for the hi level indices. With this change you are independent for the most part from upcoming changes. - Added indexProvider related naming logic for relationships (compare with pull request #20 branch junisphere_unleash_IndexProvider features for node types) --- .../neo4j/support/index/IndexProvider.java | 11 ++++++- .../support/index/IndexProviderImpl.java | 17 +++++++---- ...elationshipTypeRepresentationStrategy.java | 30 +++++++++++++------ .../TypeRepresentationStrategyFactory.java | 12 ++++---- 4 files changed, 48 insertions(+), 22 deletions(-) diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/IndexProvider.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/IndexProvider.java index be7fbdf73..d7a7a011f 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/IndexProvider.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/IndexProvider.java @@ -44,9 +44,18 @@ public interface IndexProvider { /** * adjust your indexName for the "__types__" indices * - * @param Class type + * @param type * @return prefixed indexName for Type */ String createIndexValueForType(Class type); + + /** + * possibility to do something with the high level index name + * + * @param indexName + * @param type + * @return + */ + String customizeIndexName(String indexName, Class type); } \ No newline at end of file diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/IndexProviderImpl.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/IndexProviderImpl.java index ab2d8bd3f..7e7f164da 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/IndexProviderImpl.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/index/IndexProviderImpl.java @@ -58,16 +58,16 @@ public class IndexProviderImpl implements IndexProvider { } final Neo4jPersistentEntityImpl persistentEntity = mappingContext.getPersistentEntity(type); - if (indexName == null) indexName = Indexed.Name.get(type); + if (indexName == null) indexName = customizeIndexName(Indexed.Name.get(type), type); final boolean useExistingIndex = indexType == null; if (useExistingIndex) { - if (persistentEntity.isNodeEntity()) return (Index) graphDatabase.getIndex(indexName); - if (persistentEntity.isRelationshipEntity()) return (Index) graphDatabase.getIndex(indexName); + if (persistentEntity.isNodeEntity() || persistentEntity.isRelationshipEntity()) return (Index) graphDatabase.getIndex(indexName); throw new IllegalArgumentException("Wrong index type supplied: " + type + " expected Node- or Relationship-Entity"); } - if (persistentEntity.isNodeEntity()) return (Index) createIndex(Node.class, indexName, indexType); + if (persistentEntity.isNodeEntity()) + return (Index) createIndex(Node.class, indexName, indexType); if (persistentEntity.isRelationshipEntity()) return (Index) createIndex(Relationship.class, indexName, indexType); throw new IllegalArgumentException("Wrong index type supplied: " + type + " expected Node- or Relationship-Entity"); @@ -99,11 +99,11 @@ public class IndexProviderImpl implements IndexProvider { final Class declaringType = property.getOwner().getType(); final String providedIndexName = indexedAnnotation==null || indexedAnnotation.indexName().isEmpty() ? null : indexedAnnotation.indexName(); final Indexed.Level level = indexedAnnotation == null ? Indexed.Level.CLASS : indexedAnnotation.level(); - String indexName = Indexed.Name.get(level, declaringType, providedIndexName, instanceType); + String indexName = customizeIndexName(Indexed.Name.get(level, declaringType, providedIndexName, instanceType), instanceType); if (!property.isIndexed() || property.getIndexInfo().getIndexType() == IndexType.SIMPLE) { return getIndex(declaringType, indexName, IndexType.SIMPLE); } - String defaultIndexName = Indexed.Name.get(level, declaringType, null, instanceType.getClass()); + String defaultIndexName = customizeIndexName(Indexed.Name.get(level, declaringType, null, instanceType.getClass()), instanceType); if (providedIndexName==null || providedIndexName.equals(defaultIndexName)) throw new IllegalStateException("Index name for "+property+" must differ from the default name: "+defaultIndexName); return getIndex(declaringType, indexName, property.getIndexInfo().getIndexType()); } @@ -112,5 +112,10 @@ public class IndexProviderImpl implements IndexProvider { public String createIndexValueForType(Class type) { return type.getName(); } + + @Override + public String customizeIndexName(String indexName, Class type) { + return indexName; + } } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategy.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategy.java index 802d2a11b..179a99f44 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategy.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/IndexingRelationshipTypeRepresentationStrategy.java @@ -24,6 +24,7 @@ import org.springframework.data.neo4j.annotation.RelationshipEntity; import org.springframework.data.neo4j.core.GraphDatabase; import org.springframework.data.neo4j.core.RelationshipTypeRepresentationStrategy; import org.springframework.data.neo4j.support.index.ClosableIndexHits; +import org.springframework.data.neo4j.support.index.IndexProvider; import org.springframework.data.neo4j.support.index.IndexType; public class IndexingRelationshipTypeRepresentationStrategy implements RelationshipTypeRepresentationStrategy { @@ -31,11 +32,14 @@ public class IndexingRelationshipTypeRepresentationStrategy implements Relations public static final String INDEX_NAME = "__rel_types__"; public static final String TYPE_PROPERTY_NAME = "__type__"; public static final String INDEX_KEY = "className"; - private GraphDatabase graphDb; + private final GraphDatabase graphDb; private final EntityTypeCache typeCache; + + private final IndexProvider indexProvider; - public IndexingRelationshipTypeRepresentationStrategy(GraphDatabase graphDb) { + public IndexingRelationshipTypeRepresentationStrategy(GraphDatabase graphDb, IndexProvider indexProvider) { this.graphDb = graphDb; + this.indexProvider = indexProvider; typeCache = new EntityTypeCache(); } @@ -50,12 +54,16 @@ public class IndexingRelationshipTypeRepresentationStrategy implements Relations } private void addToTypesIndex(Relationship node, Class entityClass) { - Class type = entityClass; - while (type.getAnnotation(RelationshipEntity.class) != null) { - getRelTypesIndex().add(node, INDEX_KEY, type.getName()); - type = type.getSuperclass(); - } - } + Class type = entityClass; + while (type.getAnnotation(RelationshipEntity.class) != null) { + String value = entityClass.getName(); + if (indexProvider != null) + value = indexProvider.createIndexValueForType(entityClass); + + getRelTypesIndex().add(node, INDEX_KEY, value); + type = type.getSuperclass(); + } + } @Override public ClosableIterable findAll(Class clazz) { @@ -63,7 +71,11 @@ public class IndexingRelationshipTypeRepresentationStrategy implements Relations } private ClosableIterable findAllRelBacked(Class clazz) { - final IndexHits allEntitiesOfType = getRelTypesIndex().get(INDEX_KEY, clazz.getName()); + String value = clazz.getName(); + if (indexProvider != null) + value = indexProvider.createIndexValueForType(clazz); + + final IndexHits allEntitiesOfType = getRelTypesIndex().get(INDEX_KEY, value); return new ClosableIndexHits(allEntitiesOfType); } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/TypeRepresentationStrategyFactory.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/TypeRepresentationStrategyFactory.java index 14492e797..de3a25ad3 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/TypeRepresentationStrategyFactory.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/support/typerepresentation/TypeRepresentationStrategyFactory.java @@ -79,7 +79,7 @@ public class TypeRepresentationStrategyFactory { } public RelationshipTypeRepresentationStrategy getRelationshipTypeRepresentationStrategy() { - return strategy.getRelationshipTypeRepresentationStrategy(graphDatabaseService); + return strategy.getRelationshipTypeRepresentationStrategy(graphDatabaseService, indexProvider); } public void setIndexProvider(IndexProvider indexProvider) { @@ -94,7 +94,7 @@ public class TypeRepresentationStrategyFactory { } @Override - public RelationshipTypeRepresentationStrategy getRelationshipTypeRepresentationStrategy(GraphDatabase graphDatabaseService) { + public RelationshipTypeRepresentationStrategy getRelationshipTypeRepresentationStrategy(GraphDatabase graphDatabaseService, IndexProvider indexProvider) { return new NoopRelationshipTypeRepresentationStrategy(); } }, @@ -105,8 +105,8 @@ public class TypeRepresentationStrategyFactory { } @Override - public RelationshipTypeRepresentationStrategy getRelationshipTypeRepresentationStrategy(GraphDatabase graphDatabaseService) { - return new IndexingRelationshipTypeRepresentationStrategy(graphDatabaseService); + public RelationshipTypeRepresentationStrategy getRelationshipTypeRepresentationStrategy(GraphDatabase graphDatabaseService, IndexProvider indexProvider) { + return new IndexingRelationshipTypeRepresentationStrategy(graphDatabaseService, indexProvider); } }, Noop { @@ -116,13 +116,13 @@ public class TypeRepresentationStrategyFactory { } @Override - public RelationshipTypeRepresentationStrategy getRelationshipTypeRepresentationStrategy(GraphDatabase graphDatabaseService) { + public RelationshipTypeRepresentationStrategy getRelationshipTypeRepresentationStrategy(GraphDatabase graphDatabaseService, IndexProvider indexProvider) { return new NoopRelationshipTypeRepresentationStrategy(); } }; public abstract NodeTypeRepresentationStrategy getNodeTypeRepresentationStrategy(GraphDatabase graphDatabaseService, IndexProvider indexProvider); - public abstract RelationshipTypeRepresentationStrategy getRelationshipTypeRepresentationStrategy(GraphDatabase graphDatabaseService); + public abstract RelationshipTypeRepresentationStrategy getRelationshipTypeRepresentationStrategy(GraphDatabase graphDatabaseService, IndexProvider indexProvider); } } From c9996cff4436e685f38a015a58ce632c4f96f8b7 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Mon, 19 Dec 2011 10:24:43 +0100 Subject: [PATCH 5/5] updated documentation for spring data neo4j 2.0 --- src/docbkx/reference/aspectj-details.xml | 2 +- src/docbkx/reference/attachdetach.png | Bin 0 -> 123456 bytes src/docbkx/reference/cross-store.xml | 5 ++- src/docbkx/reference/performance.xml | 31 +++++++++---- .../programming-model/attachdetach.xml | 23 +++++++--- .../programming-model/beanvalidation.xml | 5 ++- .../programming-model/node-entities.xml | 20 +++++++++ .../programming-model/repositories.xml | 2 +- .../programming-model/simple_mapping.xml | 7 +++ .../programming-model/transactions.xml | 2 +- .../typerepresentationstrategy.xml | 8 ++-- src/docbkx/reference/samples.xml | 34 +++++++++++++- src/docbkx/reference/setup.xml | 42 ++++++++++++++---- 13 files changed, 146 insertions(+), 35 deletions(-) create mode 100644 src/docbkx/reference/attachdetach.png diff --git a/src/docbkx/reference/aspectj-details.xml b/src/docbkx/reference/aspectj-details.xml index ccca1cab4..62b3962dc 100644 --- a/src/docbkx/reference/aspectj-details.xml +++ b/src/docbkx/reference/aspectj-details.xml @@ -3,7 +3,7 @@ AspectJ details - The object graph mapper of Spring Data Neo4j relies heavily on AspectJ. AspectJ is a Java implementation + The advanced mapping mode of Spring Data Neo4j relies heavily on AspectJ. AspectJ is a Java implementation of the aspect-oriented programming paradigm that allows easy extraction and controlled application of so-called cross-cutting concerns. Cross-cutting concerns are typically repetitive tasks in a system (e.g. logging, diff --git a/src/docbkx/reference/attachdetach.png b/src/docbkx/reference/attachdetach.png new file mode 100644 index 0000000000000000000000000000000000000000..4d535acc683af2b8add916f3ef6f49de15091322 GIT binary patch literal 123456 zcmeFYV{~5a*Drd<*oyImA+qP{x`_9AvyZfFo&N$e& zLV#*kZCOoRrJBilO()=mVU0?6qgaMT~g{FDMHMYVPTX)ATU|}l!Sql zSSZNA%P>-yFM*VV83mMF{Ww=CE~h%TEqWdmGk#?W>KWwe zKn3)@H}Y~9bB83k;|G+NT4=hH0tyg5@gt*RhZtV5fKP^!KoZ|A^WQuNCEQf>I)n?o z##hu$g8@3>0cnE7!H=MVTM~Oq<7us7_*wh_%>`tJS7g9m3QF<*zQhHne=c$i3KAmX za&Ia$#?2iEU+Zg#6ls*-hi{UtuWJIgf#IU$Gq+LDaKzout#@rlfk9c(yVp(Q#C$}g zea@>K;eAY}ViO!9BS(GbG_-qlqsZ7{(>z_j5HpWW&XJL1irUKa6zVhS0%IzoT{Uw~ z_{Gz(w@@*x>|QbXm{t@<-~9srl(vg!bXJ!}1426KldeR3)wHfuiwM0V;iw~8oeB~d z6BcN`@qCo}@=fdfV&?TLVkiGg2)UoBq4ulf_veN^l=Mr;kmTb<{~-t(P!?qHW+60a zi3emtkf8wlvDcym0Kfky$1D_maA@#!WZdv@XtAD8#EFj#TrIB|STFdyU&9|y-!}wM z5aV2rrudm}itjw>Bu-X{b`O^QIeChDn$EU3%rZh%BdgXqRyqZuO zqr`tk%qD|voZ25}ILsX4oux-Lvo=&ou)2slbvyD9VY1I_t&@S@nO^!{#~7!YgutgJ zzf*iamw-(Nt5?6$*G|y2)w(;!a|bv;*j1$13K-x@xO1c9+2@(K!8Mv=RwreVv`a-f zMMqs*+&umHHSf4g%P(B7_PGT^DE#>~D<+yvN(%$vyzDnF9OIV5P5|@#^)(BI*l8pS zv|UeUwBT${;9=~M0=^PanFwV7loNyiSv;+ZRuSA<5C;pOVhC{*0LS^MD~jM<&^jR` zE*OO%bsu1!kU$qSHv?BSKxd8K9Xk0J>KR%y0L&1)8A8Pn!y81#5W!Xi`BP9BGF}&` zlMrY$7AYK+NOClYDdM~^eKgM&T(F?h7}FkUEJ$i7y^uzx^&a9BG+#iPNYEJ09#}Qt z`BSYSnyml65uzq?d|;dr-W+^wC{jo3844%9e8A|hU`K3k)Y8!Oc7`<+ci0!uvMj(C z(C)AeA*qa5B~MD4SegMS^hjyZ+-z7yvjS~Z)So!lux!EFqIOvomfWly+Mu6ROsc^a zP<_Bt!$w36gf%h`$5Zz-_K^0-t{C7^IwMg!3yftMN3aZJ;mOfe{0qBy+dmkIGgc+C z(P9jSp?6RlMO4tw0gjYx$!o!NLhU*cjq@vtIB_E(C_*ONwbmu;C3UG!h)>8%(K$Z- z=(byW8l<9cGpW=jGjQ754%VQS%OVQ4{Up=t@t)6TPV zAv7R2KsNAs0PbNfgfFx&=r7#12GP*an$f7y*wJ3lq|k!V>ZsC`yffxV$KHv;c!F~X zqpjnvb7w}Jg_O&ZzJvI@AgWJSUVwYOgqyN0j^pY1buOk-GMjAyuKTu7vNNY5AYMDp)Dki#y?9@@Ai zge4#)n0BysTy{{$tax7{qvWGTzMqilLFi#F)AGgZhpl|#_va6K!SEq?eg{Su#2Z8+ zLMwvOX%a#uj+RZB4P%0Ag0ZRBqtru3j!2G2?vTftr=3TX=W5PwZfEYW^I?a32W5v2 z!yW@HUN9avK9m-<*iv0d9cKn>X0TYV_^a)et+j2M?Y^zse9yemN2QNCH`zzqM=eK1 zxGA{exJI~`T-=-(T-aPSTwt7+oI0GC^?UWK4Nnah_1X>mE-a3Rj!;gR&Th^O=jE4J zm!jvo+xwgIJLns(YjQg!o2hFgyDB@E>w}v%yE+@Y8+B^}JqDcu^n&CWv}+WOLK!-S zdWw=`QfJj`BELL{%!yDl-80{3x^;*e(XEqon00g#YoeIN2*$jN0a4Oa6`E40maH~_ z$527L#H2yNLF)}G3JVQO_#7pLO!|Q|i_DsoUy@lmS%zGOKlX{dn_-(ej%1qdT1H!l zTe4C3p#;7pyim4M_WO{6mXemjJn_5{S5`{qk`vHA2ri5-RxT2@4QR%wG$~WmEj8xU zRF&a1iq&)#H#D3zsMX)AsNjqZ!p~l0N z$kpK*_SyK_k#XH+=2@?F*gV|himJ;^kK*$ z|Crva%CyXw&7{OW&VK&kE%w-ZPApyKMAj{~E4E@LU1nuQZtE%Ya3*$^5hi?=b;fhn zLUt`?HD)=+V^)&H`6NB&M@xEZeESts5S>KrE$!wiv~u_gZ%c?`*<$As^5Wp)C{2ON zUkjRxX!G8caTR>#i*^zgZgVFg%gHUJKJm{wP)4DYp&uovB{+JmdtE7f@-O98MwCZj zMi_K8^`7+J>pGQ2md2G9LBS(#5hS{*ILf%<@KJtXyji;xDGm)pF~wobpEVV(PMa?Y>)Pk!IB9mrmzn^KD90$f!rUhXKN>?ka=;T^ned zm>=J(%!>eMIG8lp3|I+h8Po{`7sNEgX3%mFj)<32`be0O9+k-n0&6&P{j-M+K^rldR#bAcK_p-(PDk*=W6wf~`#Dwu?f z%IqO_yf9gHVCrnDV$wQaW;A2;E`49-yG&E!4b3u53xx=GHlYc{Bumw9@z8unmDjHK z$h8@jx!y>Rd8ldBj^(y$YCac%pD*_;aUFjY4+EbA*{kErCFp(N1l$&87QHNbGA6t3 zR$HQv)9$y`+!*5JtVZLTjp~i-cV*u)2Nx1-WVobRr0YuW3_N_M_pE)A47G%~YIz%< zRDw;!ZrQeNrsIm^u;ZF$MM@Ra=G9%*Y1A}U4clVWz-C3KX_r1UaXHGos*99}9#3=k zG=?v(eVjTTbz3?OUtw!n^i{amKlTZD>_*zd&zTjucDj~9dd8P$t7nC0PiC*>C}iVv zC%xbEWKnP#Hwo$0qT8aQqVp;_FDbG!viqvwoi1BPVDGoMzQnX-H90?PHgkPcxIP(a zpL#N5@qRQpy@=o8Na@7mPWW8Rr%d=XC;^s%;EL*I`j+OJ1HJ&B72zjRExZ*1pGWTN z!G3xF*;kaom|sevk1Ep^ID{qNU5A)FS z@%_eL#~#N|HW#f%_Ze7FSa_?yfHq|NG|JM z{nWPnTKe4L*6(3;BXJkilAbh3J2ag$uzkZ;Q(+{z*xN$_`HKe&u&{F`%-wOv=zP)8x>P>`)3ffow$=Q^NL8ib;d zzapbauOLoDQ$-hzsw;#!)p=R4F&iL*$%vv8<>n=8BuRu0KgU)Fu|4J*V0FU1_;6#wpk-C8GPP(sOv5oPNWMF*> zSaT#c!r;VRn%rCS zaPw9H9=8*lnbD)^l$y(;h9VCgh&?#?;0??OdJhad2721UmL=_nje)c2^UA`D;4g8~ zQ?4P@C~BZ|q<{6Q@mqM{r&0@6tH+QyG$w>Q3z z=}3(TP#LC5mwP;kq{S@qU<^X!qV%G_WTMG`DlaH{C{s+tPSlRkF)Ff9v&1BhmM>YP zn&z)XZ}PUsb@{~Q$KBGc{saUQCPW98e-3N1Owla8!~3icwB2g>sN%+yBJUjG5aVFw z>vaX*)z174e_dDM}RPa~9Gn zWa>sgNV>^7eQ~*Qsc@SX$k;Y_AG=l@TKB$P%=s9FKT2N)wbIQm;gkB5^9=Ly6$C6m zPH6g<7?D8OM-3Ao^S2Zl0LXz-gNt$pVPK@ zC@xiuhwwjfgm+cm(8I0%+JSMkko*j4eh#kmKixG9l zk@+O#%V3rc>H8Sm>To`891Cx;Wle|AIjl9+YRzqL{HmX2AH=U#mg-32Zgg+EJ}y!1l`Y%#=d~9OBn|_+9!Hx!!V&VvUcW~J z_z%M7V>WX*!D42a-DA&*?!{;yLEI2dCCJ5UrB+0gq{E07ln0cRluMM_GOe;p@&;H-|T5wxcizVctVK!P!CIeu@1e9)|t( zQnLLW+&2^D(VQQq_I(%wWc^Jv1(e3lWc;bI;en5QdJ4N(7>gLg>FmHpxT%pjBm`bvKF6 zO+WnR{_q#HdH>dl$P&^VL^BYnewc zP<0f4UDDAHykBwQ09(A^f@dfI*)4!3DoD8o$l1O&0B0JM@@z`r5ej@v5+V||aL5q^ zg)quAd8ZxyE=V&v#59&e2o6iw8lMN5juh02ZmeZ!Q>tjE_v z?E@7=*U4&vh8kb!uNB=8(EZIU?Hc|E{35FtRVY+G)-L3%%855VgT4np?W)d;7pPXC zkg$1&F|lY2**Hpt#6|+yJF?{*)tvp@1XKNim1vpowN8pxvUQD-kZfv`x0NIR1=y5lJr(Goqo( zt+%^Gi6~9r%+`dmF(V@@C;L_)(7U2^a>h7HcB!ka1P0CEZdRY$x za{CK~JQ}A2o|5C5i{9mG#i>PuXIfeenFj8TcAOTncf)HN6rCCe0(DxNju@RwRKi;N~lWN|PTv`gr! zpy`gZF8*GnO~tR z%!6$99Q*9?9IM>v?BmR;>>q;6lXM}p;z~W3vJ#2dNrzgtn*0?#6)5x6b2al8oX(tb z4U`S!^{3}4o7cOO+ZH>o#Alj}I(-tF8lr-+>hKJaG3_$S(&N&TeQRdyX1m)xTV7~s zl>ABuO1?!GDiO+h+MVK)1~ke%y1fdsTBDK%-GVEM^L>4H5YF{mOEYk2` zHoB&-9>?v|;3r~fW4|zQ-+Fp_zbp@U?Sb91KGVLYoD2WTnz+5%9=OgJZat1oja-g1 z_|f)^MB*TTpltUIklYSg=t}Mn>WFg{2t@XjaVq^gGKC8e9^hFz9vn$^VWP4v70C7CBxnz4QP9+%C`4^G zCgL zKX6>L+th~X80m;C!Y&3c3Vf9PIPkI7?byxXS@_xc#nlCA!DX(g;`9}ofGbD;GizAJ z*H{9I+naa@koHt4LkN1vXauK(oG5HfhS}HlJ#XFlhF!6lO~pv zni{^WTKw=xlLDPLXa4SuSk}+Gt2M$k`sl&RwaYciMMMu{m;r#G6a;})^an-z`!Yie zuG(tcqW63D?`wkShF|~(@c;7s+fM~)kPX2EY3loU#eQ1@-~il_{&Ryr_tFjkE@=M} z+o4kakInzQoCCCb{dSXb3>JJ2Fa}G{tPt}rwSPU<4hdKR`-g?Ue;c4q*beEh?il0o z<+n8ucEB0_-#q{Q0}$A1P~bv!;MXCQoZr|l2l2oC?WSS|I&?Wm2D+|k8u4$k^hW?R zL;ddp_6IEy1TK`U5nrNF{cpne2ek#P@%?ra%@P8*UtSiZ{&~UQJGS=%6@SLW_&xtO%L5MtdJyP3bvgX+#!UcM z4$|J+E}Qn7ryxTEUkLrFsGa$Dp9GR<1@QS#68(u7jXJo)FwsM^~dJK zAV2VwTnJ}5H)8{%!c!Jnh7S6Eo7qg_)!lB~H@fbG{P_S+{zJ5X5h+Kcs9%oiaLOHV z=4fNRj%PgHeyJWKI$My1Bs1?S8=}b1tuZKsIPd~VCzB6y#iX;+z z$=ZexeIQ{GNQq*oDxh@7$v&Q}p*1(nw!TIK-y-;8gkp{Tc)yu-;E`z{YN&m85n{Li zJPg000gZ$1qVgi=4~8?yU_XgnDJ#%8$wN9{I>-EI!kfpLG1`Apeg1ICA`6n2} z>Br{>##r3Gcr;v2w|;?QwLIIDYx=T%!!oga9wz>q+pI!9?Fy(QxZxI=%9xtmjF4xW zHU;6L5uui#o3x+noCIag2AAZ05);hdzHZP>foI4Df}%l_zS-i$w4v5tYIa2_VAV*i z0V75wH#$Cnf8Jx$e4Z7Skq%`q6O~pD<6WQS->0d|TAJ(B@{ik(T35@xAvZEVFp*SH z=-h}1tw!GtE%%)V%^{^|h*FSF`dSid?JlaT6c#bKLo78a(a%6d1%ZRq;4(QO%DNy0 z^Raa51_AE-^S51N3xw=zy}Bb$>w($U;lXIy`{3Zh#L)kov?CY+dD z+uGq@PgA0;P9SD-KK_oVjZ;+*hNNKg>I5 zc~&OJI}4EKmvtH3YQFL?yErDj=}i%qauV=Q7)HJWy~i#bm};Sa{IXnwR@+t65n}zg zRZ?Db7;B)@nDMWr|5)-MBo;uHHkbRWA-H(f{8cvM(O|HI3m$;K_I zkkZ1LZl84Fn7)ZliBBDJebSBA#cbia`CZX2%#a%%8<|IE<>6!UZIu-EvA$K=oZXg# zbTc-Fi?g%tjsgo>W(Y0c?QqJ`cV`~c`qSW{pai~0gI)gq(Ww);&6V-i<5J$|mx4pS z*t(9CNVyY^rjKpprH$19aPFtaJPlX#@JIalH1Bfaql(lt1}q>YtPKi%3s z`jX{68@dcf1Hr`w7Tq14<)99-H;4R1=D$WwFC+73h_h?~<*)}hHiY{yngq!dHtO+L z3YGQcG}fk1(eRQr>9I^nD`nYyt&snzf$iD7q@p!jTqJ+;(QcIICmRN35k0|&;aQrw zv@fnnHp}qY!VWHWeH=e+=rz=|l8T1(W|`RllGr<@J3rBj1|_PlLtuW`JYv(WHpaIc znASE`#>coR^Jq$YIeLXORdlGx`?#?9v|LTd&|l^!eKG2_#7DVS$APolgZi-Nmuo{PJpt=x@2|5$@GB~(56Hk*P^c9po{wNGNA=l1P;+y03&IWph%T@U zLN-WOQ#G1y z+S|WC<7!_8O=umrwz=v5Y~9UGD_k-TVv|RtUIwo(~1`prD( zePB-ZwrQ^kDysF|FRwVf{Z%}3Eh|<*ESf`|kB?`Iyb);D#M8afj1xO`^okWoHdnu1 zxjz6hYe9E9AukDDs);3##t5Vxvr)2fp<;nn@Bt7gP(M8 z7`$eEPq=hT%IKq5Y=+6^JmRHB4S7@fV&&cNbHaV#KHRSZ%#)DV8FrQl1vnXMhKGSliOr%#H=~-d0o^1`?Mx2uuR`;t zBaw;@4KSsjoAaQWrj?6r=C#(##NC3>#a{1%*zeMh68K!QxWBaB5)CFebazng=TTg& zcr8)tw|Nzqn5Jsy`oD+lRFzQ{0TVsQLdRN^Lu6Wh*>i^qZ!)lvi0-N4Uj5F&ZDIeG zt|BLbx;~@hCFWWb{&ggvIl`gY>PK!{)1t8CTaz?ss2x1lS;&e!OsXtB&Uj?rfeoq9 zycYKHC4F`}A4o@(*VUvj(Ei~cAFG;Dol;qGzDW$Pz|O5a%aw1#@>Ns0OA>rG%jV~t;`wvB(J z`1=Ppyi=l0Pm8u2#4qLuZf@PT(j_NKw|p>j>8ZhmHOt>lo(CNDlWN+Rihv2s!O1Wm zm0&;y@){OE$SFxv@~Al#!8IIS$(t{(4_ucNB4kEUWo2$c=jA+2~}EQvMql~ zHEi1IqEgw@IS#u`Re(Rx#-BHP`ADd*fSTJ>K_;_EL@etU^4sd_ecrDAbEmItbZ??whlkXJi&3g6uv|M5uuMDKdvrkqxi(4Z;lrMWdBFRm!Cc#zk3zdrhiye-ZomL#|Aq@7 ze|W1R8fAJw|43y8Z7}=v zg7sse%{(f;Y^eIEOFKUyER~hjHw%tA%!4u!ESQT$;t2)qjP8(`Q8n) zuQ6%gJ{4&4d^}9mqNPxh5w-D;_PU7EEpYRjk-dtLj(_xIQ!i7UfESu8P+K7M&wM^_ z=HJUSSvM6W%O{k(IEuHdYkp^BKUF}cQ=0cC);rK&e4jyN{>t<%`9Ps&ttJ!t4KV2s zDaPZtErMxoGb|4HilpOc1iT8pqa z-mHu}=`cB4LC$ik$@tNJmfOd(Zpd54+*9l6HSYWOO=iC*15lFQ>{79x8d)}-D5Gdz zJ?gi&NxHW_-;H$3wNFsD6Q5i!#jU4e?P4Vw1?~`5@D~8AO2BvO`oVU$~nBw#<;;2B}aBe-U^SJeL zdF1HdN-1dN0OZ`Ii?84QuCM|y7!(6Gvfil%2NO{#ThN3k7RC7vunSXYw)X+xO(?Tmg9V!cudS}-NsL$Vq(PPGwvy_JeKMtT2DsR(#W&)dZeQT~p_ z|8Clf0j#FWf|K}vE8Kx3atg=;bipzHk@XDGnj6j~CBICH)iC145u3k=sKG&avKPFGPMe&Cwo-y0H69 zyk?25NQVAoO|-#_?DKAql3-is{*%n1AdVHDB0rG^3i0arx?ogo>KI2cTu9B=ZoSmT z3^z$6Qe#H$44)d)1|TH!w_#@71Fc}}Y1W_Y?amr%KxeL?IDh#%+*Lnhv^9_0z;)+#2rDxGT!nw;QILAUtEl?_%}Vu|q4U1=9dFO!ar%7adhTsfWK@DQ&dXw!7Mu8*fS2vK?YbmpB{7%?p`= zMzY5cu|xll^$;A{9G+R2o&~GRD4~kgVmQwRaaDA%gJtV$xyrcFqnPMq_3wyEkOmIH zD<+-=v1u~m%kfTy?!$kjx}!5}(l03urs@9cWRzo5Z!yAJDNh1uaX@Br(c49S_#@f4 z9}p04*V`?5;x?Hu(bvQ&y;?)3B1b?umhnar6#CltA{QPEj=j#p4LC$%J(C!yDX(fk zVm(dfx1Y8Zh?-eof5>QR4jNNvBq2Ql7tW2=UkCFhzMroU^aN`T~nUIUJMj$wWqirIHa33E13zTDnWA7_Jo9#9=Y&9*& zDgEopdAw^aFU}t^1e!H~9oT(~5BFm7|KYNh(r<2@OFo(PX5ml)Hq6zpS9I+f`YjKq#|Td>YK`lwPi1|99}pNJ za*JN6pWvHvE(G4y{iwY&SF(bhV-*{?@Rwyp&f9h3hPfMb$Ymmg8`tpEWabZ0NhEZE zIO-G{^!&Tu^X6E|^1$FAXVD+~7D(>I*7BPGq0KH1h)76)T3@I;y)K6{j4i1qs;=xN z-t*N@esLBr1A@LU@K!+qc1VNKASijdaCY@)i@4!!S9FuoYpf$1{Jhk1Ao+BM*ndXl zKLly{9wZWEj5Sg=7$`}91Mmye^0o>;@KR|80LhXY>RH_>XnM%j;NF9ZBZOKH`BKQs z9nK7iP|u~qNVEa`(k+G}tq3SqrVbA#{@sdqF@lawv2q)QVf7H&Sw0SuxFy#Y6j<=k zx0V*#lzElbM)+T+gf|tirD|}%YzGUTBsiX_M;ZM^`!yyTnZRSS1M_t7S2|vL<~x)< ztaN`Tq@~c8aopkO9%qDAlMQjg-TK`-{Nrl-SEl2#zPo33kFPHUUMBF|>*;qq_TONh zL5ZG321-~#6LA<+9AZ9eb+>s>Vt)UN96`TCoF#97yXE=er9K$WtS6)~G z{U{%Fd+u(}GMqr*y_T2EbqaO4!=ZR{t1r!$l$jwo_7SnVuFr{FUhL+hX`e0f! zwr5g7xz!&V?z87cviLM#A3Tq!e)5ay+ugVMO=#b1-01K~;kch7*p{ol#Mvdevl#+y z(BmXd=*7>uu5t^;j~`T)r$#Z4IAu+XN=D{P<|x4k9t!P-uWfI z>W9H=-_dwTW#%{4&#rZVJ}u$xg8rR$0CDEcx9IOKk|!8|L5G}fE0J|fRPDk6+qcin zu>Q?+=5zTn54@8T3|3r9cmPwt>~mX|A&IiEa5S$QOLKaShCtoFt%P^&EG1JT}pVMBxUI#;v=gtb_gi^ zeR@sKZLE42Lxm$o&lF)5GhRUD^HDQ12VP-^*t|(n zEoFUNQS;s_ZSqv64iS`r?_UtCy<)P*mLIJ0;R&v1o&Kmx;soLA7F$ROa~RQov}WG~3YKvmA{zi2ffk)V@^v!$TkSiD z?cBL$TDdgAP(msxeyXn(3LYh`Spb^J@6*=1yj+GMEhp!mVmhn)OelVbuu zvO|^VR`;q2T0?|wuW~{<2rIamPAt9l#vqE1mY32weGN3bh29ey_Se#*l#|S8>aipi z+q$ItkK|;d-SU$>*MIjpy8iBSgu5_JjBmV)5fxT}H>OULR5txolz*sX(tGF{zJ_t8ju>C#pKw7T2mCkAWqfEo4 zdQRh{Wc8@yuw+fcX04cxu3BEprTQG-qOywK$FeJpBl_`M_5pLZ?KrCr0BxYZfuqS{TkPg3t|(nV?aLT zzM@6^$0ecVL2dxi$sk}5$vT7`s{Xn2_t6I|BU@&cHkVb=ap_@0&Dqhf!)tr-Vh0c2 zNxq}*$@)s=_}LZ~g@+0D0$*BwsGD3b;7XCG9Q64E(WK^Dg~dg!YOR}Td>4zYRMC-z znz`yaSg1OSK2qoDASL!qh=2fvvXCNL1;|8|K)ePrWsUF7d;;BwR(;XYQLA>UX%0A< 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

F0%}Y59WOLfs&dqG-Tq}U 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 RWdQ+yk0lhu3&jjy{x9W^9M%8; literal 0 HcmV?d00001 diff --git a/src/docbkx/reference/cross-store.xml b/src/docbkx/reference/cross-store.xml index ae617c0de..b94389069 100644 --- a/src/docbkx/reference/cross-store.xml +++ b/src/docbkx/reference/cross-store.xml @@ -3,7 +3,8 @@ Cross-store persistence - The Spring Data Neo4j project support cross-store persistence, which allows for parts of the data to be + The Spring Data Neo4j project support cross-store persistence for the advanced mapping mode, + which allows for parts of the data to be stored in a traditional JPA data store (RDBMS), and other parts in a graph store. This means that an entity can be partially stored in e.g. MySQL, and partially stored in Neo4j. @@ -23,7 +24,7 @@ A backing node in the graph store is only created when the entity has been assigned a JPA ID. Only then will the association between the two stores be established. Until the entity has been persisted, its state is just kept inside the POJO (in detached state), and then flushed to the backing graph - database on persist(). + database on the persist operation. The association between the two entities is maintained via a FOREIGN_ID field in the node, that diff --git a/src/docbkx/reference/performance.xml b/src/docbkx/reference/performance.xml index 10b2b4eaa..501f53786 100644 --- a/src/docbkx/reference/performance.xml +++ b/src/docbkx/reference/performance.xml @@ -8,7 +8,7 @@ of using Spring Data Neo4j instead of the Neo4j API directly.

- When is Spring Data Neo4j right + When to use Spring Data Neo4j The focus of Spring Data Neo4j is to add a convenience layer on top of the Neo4j API. This enables developers to get up and running with a graph database very quickly, having their domain objects @@ -16,23 +16,38 @@ more efficient ways to explore and process the graph - if the performance requirements demand it. - Like any other object mapping framework, the domain entities that are created, read, or persisted + Like with any other object mapping framework, the domain entities that are created, read, or persisted represent only a small fraction of the data stored in the database. This is the set needed for a certain use-case to be displayed, edited or processed in a low throughput fashion. The main advantages of using an object mapper in this case are the ease of use of real domain objects in your business - logic and also with existing + logic and also the integration with existing frameworks and libraries that expect Java POJOs as input or create them as results. Spring Data Neo4j, however, was not designed with a major focus on performance. It does add some overhead - to pure graph operations. Something to keep in mind is that any access of properties and relationships - will in general read through down to the database. To avoid multiple reads, it is sensible to store the - result in a local variable in suitable scope (e.g. method, class or jsp). - + to pure graph operations. + Most of the overhead comes from the use of the Java Reflection API, which is used to provide information about annotations, fields and constructors. Some of the information is already cached - by the JVM and the library, so that only the first access gets a performance penalty. + by the JVM and the library infrastructure from Spring-Data-Commons, so that only the first access gets a performance penalty. + Other reflection penalties like field or method access will occur all the time. + + For the simple mapping it is important to be aware of the size graph of data that is pulled out of the + graph database in a single read and copied to domain entities. That's why Spring Data Neo4j loads + related data not by default. You have to provide an indicator (@Fetch) to do so. Alternatively + the Neo4jTemplate.fetch method offers means of of loading entities and collections of those. + + + For the advanced mapping mode keep in mind that any access of properties and relationships + will in general read through down to the database. To avoid multiple reads, it is sensible to store the + result in a local variable in suitable scope (e.g. method, class or jsp). + + + To evaluate if the performance of Spring Data Neo4j impacts a certain use-case it is sensible to define + performance requirements and measure the actual time in realistic test scenarios for the use-case. Only if + Spring Data Neo4j doesn't perform as fast as required it is recommended to drop down to the native Neo4j API. +
diff --git a/src/docbkx/reference/programming-model/attachdetach.xml b/src/docbkx/reference/programming-model/attachdetach.xml index 42e558b77..a8ea87689 100644 --- a/src/docbkx/reference/programming-model/attachdetach.xml +++ b/src/docbkx/reference/programming-model/attachdetach.xml @@ -1,24 +1,35 @@
- Detached node entities + Detached node entities in advanced mapping mode + + This section only applies to the advanced mapping (AspectJ-backed). The simple mapping always detaches entities on + load as it copies the data out of the graph into the entities and stores it back fully too. + Node entities can be in two different persistence states: attached or detached. By default, newly created node - entities are in the detached state. When persist() is called on the entity, it becomes + entities are in the detached state. When persist() or template.save() is called on the entity, it becomes attached to the graph, and its properties and relationships are stores in the database. If - persist() is not called within a transaction, it automatically creates an implicit - transaction for the operation. + the save operation is not called within a transaction, it automatically creates an implicit + transaction only for the operation. Changing an attached entity inside a transaction will immediately write through the changes to the datastore. Whenever an entity is changed outside of a transaction it becomes detached. The - changes are stored in the entity itself until the next call to persist(). + changes are stored in the entity (its fields) itself until the next call to a save operation. All entities returned by library functions are initially in an attached state. Just as with any other entity, changing them outside of a transaction detaches them, and they must be reattached with persist() for the data to be saved. + + + + + + + @@ -82,7 +93,7 @@ movie.setTopActor(actor); It is a matter of Java references and is not related to the data model in the database. - The persist operation (merge) stores all properties of the entity to the graph database + The save operation (merge) stores all properties of the entity to the graph database and puts the entity in attached mode. There is no need to update the reference to the Java POJO as the underlying backing node handles the read-through transparently. If multiple object instances that point to the same node are persisted, the ordering is not important diff --git a/src/docbkx/reference/programming-model/beanvalidation.xml b/src/docbkx/reference/programming-model/beanvalidation.xml index 989b4060a..e3fc8e3f8 100644 --- a/src/docbkx/reference/programming-model/beanvalidation.xml +++ b/src/docbkx/reference/programming-model/beanvalidation.xml @@ -3,11 +3,12 @@
Bean validation (JSR-303) - Spring Data Neo4j supports property-based validation support. When a property is changed, it is + Spring Data Neo4j supports property-based validation support. When a property is changed and persisted, it is checked against the annotated constraints, e.g. @Min, @Max, @Size, etc. Validation errors throw a ValidationException. The validation support that comes with Spring is used for evaluating the constraints. To use this feature, a validator - has to be registered with the GraphDatabaseContext. + has to be registered with the Neo4jTemplate, which is done automatically by the Neo4jConfiguration + if one is present in the Spring Config. Bean validation diff --git a/src/docbkx/reference/programming-model/node-entities.xml b/src/docbkx/reference/programming-model/node-entities.xml index ed7c4b08f..83748f340 100644 --- a/src/docbkx/reference/programming-model/node-entities.xml +++ b/src/docbkx/reference/programming-model/node-entities.xml @@ -39,6 +39,26 @@ public class Movie {
+
+ @GraphId: Neo4j -id field + + For the simple mapping this is a required field which must be of type Long. It is used + by Spring Data Neo4j to store the node or relationship-id to re-connect the entity to the graph. + + + + It must not be a primitive type because then the "non-attached" case can not be represented as the + default value 0 would point to the reference node. Please make also sure that + an equals() and hashCode() method have to be provided which take the id + field into account (and also handle the "non-attached", null case). + + + + For the advanced mapping such a field is optional. Only if the underlying id has to be accessed, it is + needed. + +
+
@GraphProperty: Optional annotation for property fields diff --git a/src/docbkx/reference/programming-model/repositories.xml b/src/docbkx/reference/programming-model/repositories.xml index 1e3f0ce37..3c391f11e 100644 --- a/src/docbkx/reference/programming-model/repositories.xml +++ b/src/docbkx/reference/programming-model/repositories.xml @@ -314,7 +314,7 @@ Iterable davesFriends = repo.findAllByTraversal(dave, Composing repositories , PersonRepositoryExtension {} -// configure the repositories, preferably via the datagraph:repositories namespace +// configure the repositories, preferably via the neo4j:repositories namespace // (template reference is optional) diff --git a/src/docbkx/reference/programming-model/simple_mapping.xml b/src/docbkx/reference/programming-model/simple_mapping.xml index be19a3ac5..9658ea7c5 100644 --- a/src/docbkx/reference/programming-model/simple_mapping.xml +++ b/src/docbkx/reference/programming-model/simple_mapping.xml @@ -30,6 +30,13 @@ for classes. Both Neo4jPersistentEntitity as well as Neo4jPersistentProperty provide access to that information on their scope. + + + Please note that if you have two collections in an entity pointing to the same relationship and one of them has data and the other is + empty due to the nature of persisting it, one will override the other in the graph so that you might end up with no data. If you want + a relationship-collection to be ignored on save set it to null. + + Examples for loading entities from the graph diff --git a/src/docbkx/reference/programming-model/transactions.xml b/src/docbkx/reference/programming-model/transactions.xml index 0f210754d..c8980ebc4 100644 --- a/src/docbkx/reference/programming-model/transactions.xml +++ b/src/docbkx/reference/programming-model/transactions.xml @@ -82,7 +82,7 @@ One can also configure a stock XA transaction manager (e.g. Atomikos, JOTM, App-Server-TM) to be - used with Neo4j and the other resources. For a bit less secure but fast 1 phase commit best effort, + used with Neo4j and the other resources. For a bit less secure but fast 1-phase-commit-best-effort, use ChainedTransactionManager, which comes bundled with Spring Data Neo4j. It takes a list of transaction managers as constructor params and will handle them in order for transaction start and commit (or rollback) in the reverse order. diff --git a/src/docbkx/reference/programming-model/typerepresentationstrategy.xml b/src/docbkx/reference/programming-model/typerepresentationstrategy.xml index 22eaa80a6..e4e388f41 100644 --- a/src/docbkx/reference/programming-model/typerepresentationstrategy.xml +++ b/src/docbkx/reference/programming-model/typerepresentationstrategy.xml @@ -8,16 +8,16 @@ this type information is saved in the graph database. - Implementations of TypeRepresentationStrategy take care of persisting this information on entity instance + Implementations of TypeRepresentationStrategy take care of persisting this information during entity instance creation. They also provide the repository methods that use this type information to perform their operations, - like findAll and count. + like findAll and count. The derived finderMethods also use the type information for graph global queries. There are three available implementations for node entities to choose from. - IndexingNodeTypeRepresentationStrategy + IndexingNodeTypeRepresentationStrategy this is the default strategy used. Stores entity types in the integrated index. Each entity node gets indexed with its type and @@ -25,7 +25,7 @@ is called__types__. Additionally, in order to get the type of an entity node, each node has a property __type__ - with the type of that entity. + with the fully qualified type of that entity. diff --git a/src/docbkx/reference/samples.xml b/src/docbkx/reference/samples.xml index 04f318781..07489a7f2 100644 --- a/src/docbkx/reference/samples.xml +++ b/src/docbkx/reference/samples.xml @@ -24,6 +24,10 @@ The unit tests demonstrate some other features of Spring Data Neo4j as well. The sample comes with a minimal configuration for Maven and Spring to get up and running quickly. + + The Hello Worlds application is available both for the simple mapping (hello-worlds) + and for the advanced mapping (hello-world-aspects). + Executing the application creates the following graph in the graph database: @@ -42,7 +46,7 @@ roles in different movies. It also uses graph traversal operations to calculate the Bacon number of any given actor. This sample application shows the usage of Spring Data Neo4j in a more complex setting, using several - annotated entities and relationships as well as indexes and graph traversals. + annotated entities and relationships as well as indexes and in-graph indexes and graph traversals. See the readme file for instructions on how to compile and run the application. @@ -98,5 +102,33 @@
+
+ Cineasts social movie database + + The cineasts.net application was introduced extensively in the first part of this guide, the + tutorial. The tutorial covers the development of the simple mapping version of cineasts. + + + To document the differences, versions for the advanced mapping (cineasts-aspects) + and accessing the remote server (cineasts-rest) are also available. + + + A online version of cineasts can be found on cineasts.net. + A sample dataset of the cineasts databse is available at the neo4j sample-data page. + + + This is a subset of the visualization of the cineasts graph for the "Matrix" movie. + + + + + + + + + + + +
diff --git a/src/docbkx/reference/setup.xml b/src/docbkx/reference/setup.xml index 5c122cd34..f0104b493 100644 --- a/src/docbkx/reference/setup.xml +++ b/src/docbkx/reference/setup.xml @@ -17,15 +17,15 @@
Dependencies for Spring Data Neo4j Simple Mapping - For the POJO mapping it is enough to add the org.springframework.data:spring-data-neo4j:2.0.0.RC1 dependency - to your project. If you want to use the Cypher query language please add org.neo4j:neo4j-cypher:1.5 + For the simple POJO mapping it is enough to add the org.springframework.data:spring-data-neo4j:2.0.0.RELEASE dependency + to your project. If you want to use the Cypher query language please add org.neo4j:neo4j-cypher:1.6.M02 Maven dependencies for Spring Data Neo4j org.springframework.data spring-data-neo4j -2.0.0.RC1 +2.0.0.RELEASE ]]> @@ -43,8 +43,8 @@ org.springframework.data spring-data-neo4j-aspects - 2.0.0.RC1 + 2.0.0.RELEASE @@ -139,7 +139,7 @@ repositories { [ org.neo4j neo4j-cypher - 1.5 + 1.6.M02 ] ]]> @@ -272,6 +272,29 @@ repositories { ]]>
+
+ Repository Configuration + + Spring Data Neo4j repositories are configured using the <neo4j:repositories> + element which defines the base-package (or packages) for the repositories. + A reference to an existing Neo4jTemplate bean reference can be passed in as well. + + + As Spring Data Neo4j repositories build upon the infrastructure provided by + + Spring Data Commons, + the configuration options for repositories described there work here as well. + + + XML configuration for repositories + + + + + ]]> + +
Java-based bean configuration @@ -279,7 +302,7 @@ repositories { - For those not familiar with Java-based bean metadata in Spring, we recommend that you + For those not familiar with Java-based bean configuration in Spring, we recommend that you read up on it first. The Spring documentation has a high-level introduction as well as @@ -316,7 +339,8 @@ repositories { - Additional beans can be configured to be included in the Neo4j-Configuration. ConversionService for custom conversions, + Additional beans can be configured to be included in the Neo4j-Configuration just by defining them in the Spring context. + ConversionService for custom conversions, Validators for bean validation, TypeRepresentationStrategyFactory for configuring the in graph type representation, IndexProviders for custom index handling (e.g. for multi-tenancy), Entity-Instantiators (with their config) to have more control over the creation of entity instances and much more.