docs: private String[] createPredicateTemplateAndPropertyString(final Part part) {
  		int varsUsed = 0;
  		final String PREDICATE_TEMPLATE = "(%s FILTER %%s RETURN 1)[0] == 1";
  		final PersistentPropertyPath<?> persistentPropertyPath = context.getPersistentPropertyPath(part.getProperty());
  		StringBuilder simpleProperties = new StringBuilder();
  		String predicateTemplate = "";
  		int propertiesLeft = persistentPropertyPath.getLength();
  		for (final Object object : persistentPropertyPath) {
  			--propertiesLeft;
  			final ArangoPersistentProperty property = (ArangoPersistentProperty) object;
  			if (propertiesLeft == 0) {
  				simpleProperties.append("." + property.getFieldName());
  				break;
  			}
  			if (property.getRelations().isPresent()) {
  				// graph traversal
  				final String TEMPLATE = "FOR %s IN %s %s %s%s._id %s";
  				final String nested = simpleProperties.toString();
  				final Relations relations = property.getRelations().get();
  				final String direction = relations.direction().name();
  				final String depths = format("%s..%d", relations.minDepth(), relations.maxDepth());
  				final Class<?>[] edgeClasses = relations.edges();
  				final StringBuilder edgesBuilder = new StringBuilder();
  				for (final Class<?> edge : edgeClasses) {
  					String collection = context.getPersistentEntity(edge).getCollection();
  					if (collection.split("-").length > 1) {
  						collection = "`" + collection + "`";
  					}
  					edgesBuilder.append((edgesBuilder.length() == 0 ? "" : ", ") + collection);
  				}
  				final String prevEntity = "e" + (varsUsed == 0 ? "" : Integer.toString(varsUsed));
  				final String entity = "e" + Integer.toString(++varsUsed);
  				final String edges = edgesBuilder.toString();
  				simpleProperties = new StringBuilder();
  				final String iteration = format(TEMPLATE, entity, depths, direction, prevEntity, nested, edges);
  				final String predicate = format(PREDICATE_TEMPLATE, iteration);
  				predicateTemplate = predicateTemplate.length() == 0 ? predicate : format(predicateTemplate, predicate);
  			} else if (property.isCollectionLike()) {
  				if (property.getRef().isPresent()) {
  					// collection of references
  					final String TEMPLATE = "FOR %s IN %s FILTER %s._id IN %s%s";
  					final String prevEntity = "e" + (varsUsed == 0 ? "" : Integer.toString(varsUsed));
  					final String entity = "e" + Integer.toString(++varsUsed);
  					String collection = context.getPersistentEntity(property.getComponentType()).getCollection();
  					if (collection.split("-").length > 1) {
  						collection = "`" + collection + "`";
  					}
  					final String name = simpleProperties.toString() + "." + property.getFieldName();
  					simpleProperties = new StringBuilder();
  					final String iteration = format(TEMPLATE, entity, collection, entity, prevEntity, name);
  					final String predicate = format(PREDICATE_TEMPLATE, iteration);
  					predicateTemplate = predicateTemplate.length() == 0 ? predicate
  							: format(predicateTemplate, predicate);
  				} else {
  					// collection
  					final String TEMPLATE = "FOR %s IN TO_ARRAY(%s%s)";
  					final String prevEntity = "e" + (varsUsed == 0 ? "" : Integer.toString(varsUsed));
  					final String entity = "e" + Integer.toString(++varsUsed);
  					final String name = simpleProperties.toString() + "." + property.getFieldName();
  					simpleProperties = new StringBuilder();
  					final String iteration = format(TEMPLATE, entity, prevEntity, name);
  					final String predicate = format(PREDICATE_TEMPLATE, iteration);
  					predicateTemplate = predicateTemplate.length() == 0 ? predicate
  							: format(predicateTemplate, predicate);
  				}
  			} else {
  				if (property.getRef().isPresent() || property.getFrom().isPresent() || property.getTo().isPresent()) {
  					// single reference
  					final String TEMPLATE = "FOR %s IN %s FILTER %s._id == %s%s";
  					final String prevEntity = "e" + (varsUsed == 0 ? "" : Integer.toString(varsUsed));
  					final String entity = "e" + Integer.toString(++varsUsed);
  					String collection = context.getPersistentEntity(property.getType()).getCollection();
  					if (collection.split("-").length > 1) {
  						collection = "`" + collection + "`";
  					}
  					final String name = simpleProperties.toString() + "." + property.getFieldName();
  					simpleProperties = new StringBuilder();
  					final String iteration = format(TEMPLATE, entity, collection, entity, prevEntity, name);
  					final String predicate = format(PREDICATE_TEMPLATE, iteration);
  					predicateTemplate = predicateTemplate.length() == 0 ? predicate
  							: format(predicateTemplate, predicate);
  				} else {
  					// simple property
  					simpleProperties.append("." + property.getFieldName());
  				}
  			}
  		}
  		return new String[] { predicateTemplate,
  				"e" + (varsUsed == 0 ? "" : Integer.toString(varsUsed)) + simpleProperties.toString() };
  	}