2012-05-26 12 views
6

Usando la primavera-data-Neo4j, que quieren crear dos clases usando @RelationshipEntity(type="OWNS") para vincular una clase Person a la vez un Pet y Car.Clases de relación múltiple con el mismo tipo

@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 ahorra a la base de datos Gráfico correctamente sin ningún problema, ya que puedo consultar el real Node y Relationship y ver que tipo , etc.

Pero cuando intento utilizar @RelatedTo(type="OWNS", elementClass=Pet.class) I o bien obtener una excepción de conversión de clase, o cuando uso la inicialización diferida obtengo 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 me sale cuando intento imprimir nuestro mi persona (mi toString() se ha omitido, pero simplemente llama al toString() para cada campo) es la siguiente:

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?

Respuesta

3

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.

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.

Cuestiones relacionadas