WebHU - Programozási kérdések és válaszok

a template.createRelationBetween megfelelője az SDN4-ben

A projektem jelenleg a Spring-Data-Neo4J 3.3.0-t használja, és az új 4.0.0.Release verziót próbálom használni. A kódomban a következő kód szerepel:

neo4jTemplate.createRelationshipBetween(eltOrRel, attribute, valueClass, GraphRelationType.HAS_ATT_VALUE, true)

Mi a megfelelője ennek a kódnak (amely a ez a módszer api-ban az SDK új verziójában kérem ?

Pontosabban nem tudom, hogyan kell egy adott típusú relációt létrehozni, de egy adott osztályhoz. Hogyan írhatok egy ilyen alkotást cypherben?

@Luanne Itt van egy kis példa a problémámra.

Osztály elem:

@NodeEntity
public class Element {

@GraphId
private Long id;

private int age;

private String  uuid;

@Relationship(type = "HAS_ATT_VALUE")
private Set<HasAttValue> values = new HashSet<HasAttValue>();
...

Osztály attribútum:

@NodeEntity
public class Attribute {
@GraphId
private Long id;

private String attName;

És a HasAttValue osztály:

@RelationshipEntity(type = "HAS_ATT_VALUE")
public class HasAttValue {

@GraphId
private Long id;

@StartNode
Element element;

@EndNode
Attribute attribute;

private String value;

public HasAttValue() {
}

public HasAttValue(Element element, Attribute attribute, String value) {
    this.element = element;
    this.attribute = attribute;
    this.value = value;
    this.element.getValues().add(this);
}

Ebben az első esetben minden úgy működik, mint egy varázslat, és mint az Ön példájában, a következő grafikonom van (a kiszolgáló böngészőjében) a HAS_ATT_VALUE kapcsolatEntity értékemmel:

(Element)->[HAS_ATT_VALUE]->(attribute)

De a problémám a következő esetben van (ami jól működött az előző SDN-nel). Az előző HasAttValue osztály helyett a következőt használom:

@RelationshipEntity(type = "HAS_ATT_VALUE")
public abstract class HasAttValue<T> {

@GraphId
private Long id;

@StartNode
Element element;

@EndNode
Attribute attribute;

private T value;

public HasAttValue() {
}

public HasAttValue(Element element, Attribute attribute, T value) {
    this.element = element;
    this.attribute = attribute;
    this.value = value;
    this.element.getValues().add(this);
}

például két alosztállyal. Első :

public class HasBooleanValue extends HasAttValue<Boolean> {

public HasBooleanValue() {
}

public HasBooleanValue(Element elt, Attribute attribut, Boolean value) {
    super(elt, attribut, value);
}
}

A második :

public class HasStringValue extends HasAttValue<String> {

private String locale;

public HasStringValue() {
}

public HasStringValue(Element element, Attribute attribut, String value)   {
    super(element, attribut, value);
}

Ebben az esetben a grafikon a következő:

(element)->[HAS_ATT_VALUE]->(HasBooleanValue|HasStringValue)->[ATTRIBUTE]->(Attribute)

és egy másik ív a gráfban (elem)‹-[ELEMENT]-(HasBooleanValue|HasStringValue)

Tehát hogyan tudom megtenni, hogy mindig legyen (elem)->[HAS_ATT_VALUE]->(attribútum), ahol a "has_att_value" egy adatokat tartalmazó kapcsolat, de eltérő implementációkkal rendelkezik a Java kódomban? Ez ismét jól működött az SDN3-ban, amikor a neo4jTemplate.createRelationshipBetween(eltOrRel, attribútum, valueClass, GraphRelationType.HAS_ATT_VALUE, true) paramétert használtam a "hasAttValue" kapcsolatEntity létrehozásához.

Nagyon szépen köszönjük


  • Köszönöm @Clement, a példa nagyon hasznos volt. Frissítettem a válaszomat 24.09.2015

Válaszok:


1

Az SDN 4.0-ban a kapcsolatokat nem kell kifejezetten Neo4jTemplate metódusokkal létrehozni. A @Relationships definiálására szolgáló entitás fenntartása elegendő ahhoz, hogy hozzon létre kapcsolatokat. Ha rendelkezik tulajdonságokkal a kapcsolathoz, akkor szüksége lesz egy @RelationshipEntity.

Az SDN 4.0 objektummodelljeinek magyarázata itt található: http://graphaware.com/neo4j/2015/09/03/sdn-4-object-model.html

Frissítés @clement további információi alapján:

Csak helyezze át a @RelationshipEntity megjegyzést a HasAttValue osztályból az egyes alosztályokba, például

@RelationshipEntity(type = "HAS_ATT_VALUE")
public class HasBooleanValue extends HasAttValue<Boolean> {

Vegye figyelembe, hogy szüksége lesz a legfrissebb OGM-pillanatképre, mivel az absztrakt kapcsolat entitásokkal kapcsolatos problémát éppen most javították ki. Kérlek használd

  <dependency>
       <groupId>org.neo4j</groupId>
       <artifactId>neo4j-ogm</artifactId>
       <version>1.1.3-SNAPSHOT</version>
  </dependency>
 <repository>
       <id>neo4j-snapshots</id>
       <url>http://m2.neo4j.org/content/repositories/snapshots</url>
       <snapshots>
           <enabled>true</enabled>
       </snapshots>
  </repository> 

Vagy használja az SDN 4.1 pillanatképet

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-neo4j</artifactId>
    <version>4.1.0.BUILD-SNAPSHOT</version>
</dependency>

Ezután a grafikonnak így kell kinéznie

adja meg itt a kép leírását

A Cypher közvetlen használata nem jó ötlet, mivel meg kell tudnia keresni a csomópontokat (talán azonosító alapján), ami azt jelenti, hogy először el kell menteni őket.

21.09.2015
  • Igen, tudom, és már használom a @ RelationshipEntity-t. A @ StartNode-om Element.class, az @ EndNode-om pedig Attribut.class típusú. De annak az osztálynak, amelyhez hozzáadom ezt a megjegyzést, vannak alosztályai (A osztály és B osztály), amelyekben a tulajdonságok kissé eltérőek lehetnek. Nem akarok két különböző készletet létrehozni az Element.class-omban (egyet az A típushoz és egyet a B típushoz), hanem csak egy adatkészletet szeretnék megtartani (amelyben A és B objektumok vannak). Ez tökéletesen működik SDN3-ban, de nem tudom, hogyan kell ezt megtenni SDN4-el. Hogyan tudok ilyen Cypher kérést írni? 21.09.2015
  • Azért térek vissza hozzád, mert néhány teszt után rájöttem, hogy a gráfból a java-ba visszatérő adatok nem konvertálódnak jó típusba. Például mentettem egy HasBooleanValue értéket, és amikor egy másik munkamenetben megkapom ezeket az adatokat, az adatok HasDateValue típusúak... Ez egyáltalán nem jó pont. Sőt, amikor a grafikont nézem a szerverböngészőben, nincs információ a HAS_ATT_VALUE relációról, amely jelezné, hogy melyik típust kell használni. Ám átváltottam a neo4j-ogm 1.1.6-SNAPSHOT-ra. Valami ötlet erről? 25.09.2015
  • Hmm, jó pont. Nem lesz semmilyen extra információ a kapcsolatról, kivéve a kapcsolatentitás tulajdonságait. Éppen ezért a kapcsolat beolvasásakor nincs semmi, ami megmondja, hogy melyik alosztályt kell példányosítani (az OGM nem vizsgálja a tulajdonságokat). Ezt a csapatnak meg kell vitatnia – nyisson meg egy problémát a következő címen: github.com/neo4j/neo4j -ogm ? (BTW nincs 1.1.6-SNAPSHOT, hanem 1.1.3-SNAPSHOT) 25.09.2015
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..