Отображение древовидной структуры с Neo4J OGM - PullRequest
4 голосов
/ 09 марта 2019

Я использую Neo4J OGM (последние версии) для сериализации моих данных во встроенную базу данных Neo4J.

Это работает с большинством моих сущностей, но как только я пытаюсь сохранить древовидную структуру, требуетсянавсегда, чтобы сохранить и, кажется, создает тысячи таких отношений, хотя я просто сохраняю некоторые узлы:

RequestExecutor: 223 - creating new node id: -32715, 14690, [255, 100, 139, 207]
RequestExecutor: 223 - creating new node id: -32718, 14691, [29, 95]
RequestExecutor: 223 - creating new node id: -32721, 14692, [255, 102, 142, 212]
RequestExecutor: 223 - creating new node id: -32724, 14693, [30, 95]
RequestExecutor: 223 - creating new node id: -32727, 14694, [255, 103, 143, 213]
RequestExecutor: 223 - creating new node id: -32730, 14695, [31, 95]
RequestExecutor: 223 - creating new node id: -32733, 14696, [255, 103, 143, 213]
RequestExecutor: 223 - creating new node id: -32736, 14697, [32, 95]

Эти операции раскрутки тоже занимают много времени (эта строка намного длиннее, просто отрывок):

EmbeddedRequest: 152 - Request: UNWIND {rows} as row MATCH (startNode) WHERE ID(startNode) = row.startNodeId WITH row,startNode MATCH (endNode) WHERE ID(endNode) = row.endNodeId MERGE (startNode)-[rel:`hasParentNd`]->(endNode) RETURN row.relRef as ref, ID(rel) as id, {type} as type with params {type=rel, rows=[{startNodeId=33, relRef=-32770, endNodeId=32, props={}}, {startNodeId=34, relRef=-32773, endNodeId=61, props={}}, {startNodeId=35, relRef=-32776, endNodeId=34, props={}}, {startNodeId=36, relRef=-32779, endNodeId=61, props={}}, {startNodeId=37, relRef=-32782, endNodeId=36, props={}}, {startNodeId=38, relRef=-32785, endNodeId=61, props={}}, {startNodeId=39, relRef=-19, endNodeId=14698, props={}}, {startNodeId=40, relRef=-32788, endNodeId=38, props={}}, {startNodeId=41, relRef=-22, endNodeId=39, props={}}, {startNodeId=42, relRef=-32791, endNodeId=61, props={}}, {startNodeId=43, relRef=-25, endNodeId=41,......

Сам узел выглядит следующим образом.Класс NeoEntity содержит уникальный идентификатор.

@NodeEntity
public class NeoNode extends NeoEntity implements Node, Node.Op {

    @Property("unique")
    private boolean unique = true;

    @Relationship(type = "hasChildrenNd", direction = Relationship.INCOMING)
    private ArrayList<NeoNode.Op> children = new ArrayList<>();

    @Transient
    private NeoArtifact.Op<?> artifact;

    @Relationship(type = "hasParentNd")
    private Op parent;

    public NeoNode() {}
    ...
}

Я перепробовал все виды отношений, но не нашел решения.Был бы очень благодарен за любую идею.


Дополнительная информация: Если я просто позволю ему работать, он заполняет кучу, пока не выйдет из строя:

Exception in thread "neo4j.Scheduler-1" Exception in thread "Neo4j UDC Timer" java.lang.OutOfMemoryError: Java heap space

1 Ответ

0 голосов
/ 14 марта 2019

Вам не нужен тип отношения hasParentNd, поскольку все отношения neo4j можно перемещать в двух направлениях.Вы должны просто повторно использовать отношения hasChildrenNd с противоположной направленностью.Это позволит двунаправленно перемещаться по одному и тому же экземпляру отношения (вместо создания нового избыточного отношения).

Попробуйте изменить код на:

@NodeEntity 
public class NeoNode extends NeoEntity implements Node, Node.Op { 

    @Property("unique")
    private boolean unique = true;

    @Relationship(type = "hasChildrenNd", direction = Relationship.INCOMING)
    private ArrayList<Op> children = new ArrayList<>();

    @Transient 
    private NeoArtifact.Op<?> artifact; 

    @Relationship(type = "hasChildrenNd", direction = Relationship.OUTGOING)
    private Op parent;

    public NeoNode() {} 
    ... 
} 

В стороне: The hasChildrenNd имя типа выглядит сбивающим с толку, поскольку исходящие отношения hasChildrenNd указывают на родителя, а не на ребенка.

...