in neo4j/src/main/java/org/hibernate/ogm/datastore/neo4j/embedded/dialect/impl/EmbeddedNeo4jAssociationQueries.java [184:256]
private void createRelationshipforCollectionOfComponents(AssociationKey associationKey, String collectionRole, String[] embeddedColumnNames, Object[] embeddedColumnValues, StringBuilder queryBuilder) {
int offset = associationKey.getEntityKey().getColumnNames().length;
EmbeddedNodesTree tree = createEmbeddedTree( collectionRole, embeddedColumnNames, embeddedColumnValues, offset );
if ( isPartOfEmbedded( collectionRole ) ) {
String[] pathToEmbedded = appendEmbeddedNodes( collectionRole, queryBuilder );
queryBuilder.append( " CREATE (e) -[r:" );
appendRelationshipType( queryBuilder, pathToEmbedded[ pathToEmbedded.length - 1] );
}
else {
queryBuilder.append( " CREATE (owner) -[r:" );
appendRelationshipType( queryBuilder, collectionRole );
}
queryBuilder.append( "]-> " );
queryBuilder.append( "(target:" );
queryBuilder.append( EMBEDDED );
queryBuilder.append( ":" );
escapeIdentifier( queryBuilder, associationKey.getMetadata().getAssociatedEntityKeyMetadata().getEntityKeyMetadata().getTable() );
int index = 0;
int embeddedNumber = 0;
// Append primitive properties
if ( !tree.getProperties().isEmpty() ) {
queryBuilder.append( " {" );
for ( EmbeddedNodeProperty property : tree.getProperties() ) {
escapeIdentifier( queryBuilder, property.getColumn() );
queryBuilder.append( ": {" );
queryBuilder.append( property.getParam() );
queryBuilder.append( "}" );
if ( index++ < tree.getProperties().size() - 1 ) {
queryBuilder.append( ", " );
}
}
queryBuilder.append( "}" );
}
queryBuilder.append( ")" );
// Append relationships representing embedded properties
Map<String, EmbeddedNodesTree> children = tree.getChildren();
boolean first = true;
for ( Entry<String, EmbeddedNodesTree> entry : children.entrySet() ) {
index = 0;
String relationshipType = entry.getKey();
EmbeddedNodesTree child = entry.getValue();
if ( first ) {
first = false;
}
else {
queryBuilder.append( ", (target)" );
}
queryBuilder.append( " - [:" );
appendRelationshipType( queryBuilder, relationshipType );
queryBuilder.append( "] -> " );
queryBuilder.append( "(a" );
queryBuilder.append( embeddedNumber++ );
queryBuilder.append( ":" );
queryBuilder.append( EMBEDDED );
if ( !child.getProperties().isEmpty() ) {
queryBuilder.append( " {" );
for ( EmbeddedNodeProperty property : child.getProperties() ) {
escapeIdentifier( queryBuilder, property.getColumn() );
queryBuilder.append( ": {" );
queryBuilder.append( property.getParam() );
queryBuilder.append( "}" );
if ( index++ < child.getProperties().size() - 1 ) {
queryBuilder.append( ", " );
}
}
queryBuilder.append( "}" );
}
queryBuilder.append( ")" );
}
queryBuilder.append( " RETURN r" );
}