2016-07-20 18 views
0

Siehe nachstehende Elemente.Federdaten mit Abfrage von neo4j

Person Entity

@NodeEntity 
public class Person { 

    @GraphId Long personId; 

    private String name; 

    private String surname; 

    @Relationship(type = "ATTENDS", direction = Relationship.OUTGOING) 
    private Set<Event> events; 

Attends Entity

@RelationshipEntity(type = "ATTENDS") 
public class Attends { 

    @GraphId 
    private Long id; 

    @StartNode 
    private Person person; 

    @EndNode 
    private Event event; 

    private Date attendingDate; 

Ereignis Entity

@NodeEntity 
public class Event { 

    @GraphId 
    private Long eventId; 

    private String eventName; 

    @Relationship(type = "ATTENDS", direction = Relationship.INCOMING) 
    private Set<Person> persons; 

Hier ist meine API

/Personen/{PersonId}/besucht

kehre ich möchte eine Liste aller Objekt mit einer Beziehung mit der ID der Person, die Teilnahme an vorausgesetzt, im folgenden Beispiel wäre es eine Liste von Ereignissen.

[{ 
"attends":{ 
"attendsId":"1234", 
"startDate":"98098098", 
"endDate":"098098098", 
event:{ "eventId":"1234", "name":"ComicCon" } 
}, 
"attends":{ 
"attendsId":"1235", 
"startDate":"984548098", 
"endDate":"45454545", 
event:{ "eventId":"1235", "name":"AWS Summit" } 

}] 

ich dieses folgende Abfrage versuchen, aber nicht Ergebnis zu erzielen,

List<Attends> findByPersonPersonId(Long personId);

So Wie kann durch Abfrage dieses Ergebnis erreichen?

Bitte führen Sie, Danke.

Antwort

1

Nicht sehr sicher, was genau Sie wollen? Wenn Sie alle Attends aller Personen oder alle Attends für eine bestimmte Person erhalten möchten.

Trotzdem habe ich Antworten für beide zur Verfügung gestellt.

Erstellen Sie ein AttendsRepository und fügen Sie eine findByPersonId (String personId) hinzu.

public interface AttendsRepository extends GraphRepository<Attends>{ 

    @Query("Match(p:Person {personId:{0}})-[a:ATTENDS]->(e:Event) return a") 
    Iterable<Attends> findByPersonId(String personId); 

} 

Dann können Sie die gewünschten Ergebnisse erhalten, indem

@Test 
public void getAllAttends(){ 

    Iterable<Attends> allAttends = attendsRepository.findAll(); 
    allAttends.forEach(attend -> { 
     System.out.println(attend); 
    }); 

} 

@Test 
public void getAttendsByPerson(){ 

    String personId = "283f51e9-9ade-4f46-a005-7353b5211c8b"; 

    Iterable<Attends> allAttends = attendsRepository.findByPersonId(personId); 
    allAttends.forEach(attend -> { 
     System.out.println(attend); 
    }); 

} 
+0

Vielen Dank Mann, das ist, was ich will, Jetzt verstehe ich, wie Abfrage so machen ... Schätzen Sie Ihre Hilfe !!! –

+0

Gern geschehen. – Soumya

+0

Hallo Soumya, und noch eine Sache, die wir nicht direkt auf graphId Anfrage erstellen können? Warum generieren wir UUID? –

2
@NodeEntity 
public class Person { 

    @GraphId Long id; 

    private String personId; 

    private String name; 

    private String surname; 

    @Relationship(type = "ATTENDS", direction = Relationship.OUTGOING) 
    private Set<Attends> attendedEvents =new HashSet<Attends>(); 
} 

@NodeEntity 
public class Event { 

    @GraphId 
    private Long id; 

    private String eventId; 

    private String eventName; 

    @Relationship(type = "ATTENDS", direction = Relationship.INCOMING) 
    private List<Attends> attendedEvents = new ArrayList<Attends>(); 
} 


@RelationshipEntity(type = "ATTENDS") 
public class Attends { 

    @GraphId 
    private Long id; 

    private String attendId; 

    @StartNode 
    private Person person; 

    @EndNode 
    private Event event; 

    private Date attendingDate; 
} 

@Repository 
public interface PersonRepository extends GraphRepository<Person>{ 

    Person findByPersonId(String personId); 

} 


public class PersonServiceTest extends AbstractTest{ 

    @Autowired 
    PersonRepository personRepository; 

    @Test 
    public void save(){ 

     Person person = new Person(); 
     person.setName("Person1"); 
     person.setPersonId(UUID.randomUUID().toString()); 
     person.setSurname("Surname1"); 

     Event event1 = new Event(); 
     event1.setEventId(UUID.randomUUID().toString()); 
     event1.setEventName("Event1"); 

     Event event2 = new Event(); 
     event2.setEventId(UUID.randomUUID().toString()); 
     event2.setEventName("Event2"); 

     Attends attends1 = new Attends(); 
     attends1.setAttendId(UUID.randomUUID().toString()); 
     attends1.setAttendingDate(new Date()); 
     attends1.setPerson(person); 
     attends1.setEvent(event1); 

     Attends attends2 = new Attends(); 
     attends2.setAttendId(UUID.randomUUID().toString()); 
     attends2.setAttendingDate(new Date()); 
     attends2.setPerson(person); 
     attends2.setEvent(event2); 

     person.getAttendedEvents().add(attends1); 
     person.getAttendedEvents().add(attends2); 

     personRepository.save(person); 


    } 

    @Test 
    public void get(){ 
     Person person = personRepository.findByPersonId("ebc17b4b-2270-4e78-ac68-87bce5444ef4"); 

     person.getAttendedEvents().forEach(attendedEvent -> { 
      System.out.println(attendedEvent.getEvent()); 
     }); 

    } 


} 
+1

Die Änderung ist @Relationship (type = "ATTENDS", direction = Relationship.OUTGOING) privat attendedEvents = new HashSet () ; Dies muss auf die Beziehungsentität verweisen, nicht auf den Endknoten der Beziehungsentität. – Luanne

+0

Danke Soumya, Aber ich brauche eine Liste von Attends nicht Feuer Abfrage auf Personen-Repository. 'Liste ' Feuer Abfrage auf 'AttendsRepository' –

+0

Hallo @Luanne, können Sie mir sagen, wie bekomme ich eine Liste von' Attends' bekommen? –