spring - Múltiples clases de relación con el mismo tipo
neo4j spring-data-neo4j (1)
Parece que el problema es que la anotación hace que springDataNeo4j priorice el nombre de la relación. Intenté lo mismo en otra muestra que creé. Si ambas anotaciones contienen type="OWNS"
, mezcla ambos "objetos". Cuando omito esta información, y solo uso la dirección y el tipo, funciona para mí.
Desafortunadamente, esto generará un problema si está utilizando otra anotación @RelatedTo con más mascotas o automóviles relacionados con otra anotación. Como no difería entre "OWNS" y cualquier otra relación con un Pet-Type, el conjunto devuelve todas las mascotas relacionadas (por ejemplo: peter -> (HATES-Relationsip) -> dogs).
Si es un error o no, no puedo decir ... Pero para la base de datos: solo hay nodos y relaciones. Ambos no están tipeados, por lo que neo4j no sabe nada acerca de su ''Pet''- o'' Car''-Class ''. Spring data neo4j maneja esto, ya sea indexando todos los nodos por tipo y configurando un atributo de tipo, o usando un diseño de gráfico específico (con subreferencias). Incluso si desea buscar todas las mascotas de una persona con una descripción transversal, tendría mucho más código para escribir, ya que las relaciones salientes con el nombre ''OWNS'' contienen dos tipos de objetos.
Yo recomendaría usar dos nombres diferentes. Es más fácil escribir sus cruzadas / consultas personalizadas más tarde, y probablemente sea incluso más rápido, porque no será necesaria una comparación de tipo de clase. ¿Hay alguna razón por la que necesitarías estos nombres específicos?
PD: es posible que no todo sea 100% exacto. No conozco springdataneo4j en detalle, pero eso es lo que descubrí hasta ahora.
Usando spring-data-neo4j, quiero crear dos clases usando @RelationshipEntity(type="OWNS")
para vincular una clase Person
a un Pet
y un Car
.
@RelationshipEntity(type="OWNS")
public class OwnsCar {
@Indexed
private String name;
@StartNode
private Person person;
@EndNode
private Car car;
}
@RelationshipEntity(type="OWNS")
public class OwnsPet {
@Indexed
private String name;
@EndNode
private Person person;
@StartNode
private Pet pet;
}
Esto se guarda correctamente en la Base de Datos de Gráficos sin problemas, ya que puedo consultar el Node
y la Relationship
reales y ver que escriben , etc.
Pero cuando intento usar @RelatedTo(type="OWNS", elementClass=Pet.class)
obtengo una excepción de clase o cuando uso la inicialización @RelatedTo(type="OWNS", elementClass=Pet.class)
recibo resultados incorrectos.
@NodeEntity
public class Person {
@Indexed
private String name;
@RelatedTo(type="OWNS", direction=Direction.OUTGOING, elementClass=Pet.class)
private Set<Pet> pets;
@RelatedTo(type="OWNS", direction=Direction.OUTGOING, elementClass=Car.class)
private Set<Car> cars;
}
El resultado que obtengo cuando intento imprimir nuestra persona (se ha omitido my toString()
, pero simplemente llama a toString()
para cada campo) es esto:
Person [nodeId=1, name=Nick, pets=[Car [nodeId=3, name=Thunderbird]], cars=[Car [nodeId=3, name=Thunderbird]]]
¿Alguien sabe si esto se puede hacer, se debe hacer, es solo un error o una característica que falta?