private void createRelationshipforCollectionOfComponents()

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" );
	}