【问题标题】:Mapping a tree structure with Neo4J OGM使用 Neo4J OGM 映射树结构
【发布时间】:2019-07-31 08:26:10
【问题描述】:

我正在使用 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 类拥有唯一的 id。

@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

【问题讨论】:

  • 您在数据库中创建的节点总数大约是多少?
  • 不要认为查询有任何问题。尝试增加 JVM 和 Neo4j 的堆大小
  • 节点数不是很高,大约20个以下。它与数据量无关,仅与循环引用有关。我切换到 SCHEMA_LOAD_STRATEGY,但这不会使我的成员水合,而不是无休止地递归。

标签: java neo4j cypher neo4j-ogm neo4j-embedded


【解决方案1】:

您不需要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() {} 
    ... 
} 

除此之外:hasChildrenNd 类型名称似乎令人困惑,因为传出的 hasChildrenNd 关系指向父级而不是子级。

【讨论】:

  • 我担心这没有帮助。我尝试恢复为 SCHEMA_LOAD_STRATEGY,但不是无休止地递归,它不会加载一半的模式,包括我上面定义的树状结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 2019-03-11
相关资源
最近更新 更多