超类的唯一索引和在不同子类之间重用的值

时间:2015-07-01 15:18:44

标签: spring-data-neo4j

在使用Spring Data Neo4j 3.2的项目中,我有一个看起来像的模型:

@NodeEntity
public abstract class A {
    @GraphId
    public Long id;
    @Indexed(unique = true)
    public Long technicalId;
}

@NodeEntity
public class B extends A {}

@NodeEntity
public class C extends A {}

我错过了paragraph in the documentation谈论默认合并功能,我们遇到了以下情况而没有出现异常:

B b = new B();
b.technicalId = 42;
neo4jTemplate.save(b);
// I now have Node[1] in Neo4j with the following labels: B, _B, A

C c = new C();
c.technicalId = 42;
neo4jTemplate.save(c);
// No exception and Node[1] now has the following labels: B, _B, A, C, _C

好的,可以通过以下方式避免这种情况:

  • 使用instance-based indices

    @NodeEntity
    public abstract class A {
        @GraphId
        public Long id;
        @Indexed(unique = true, level = Level.INSTANCE)
        public Long technicalId;
    }
    
  • 或使用failOnDuplicate(虽然在文档中没有提及,即使是3.3,但我发现它herehere)避免了创建3个索引而不是1 ,因此写入时的I / O更少,使用的磁盘空间更少:

    @NodeEntity
    public abstract class A {
        @GraphId
        public Long id;
        @Indexed(unique = true, failOnDuplicate = true)
        public Long technicalId;
    }
    

但是,默认行为是否会改变节点的性质(当涉及到类层次结构时)并创建可能阻止实体实例化的标签组合时,这不是一个错误吗?我的意思是节点现在有2个下划线前缀标签:n:B:_B:A:C:_C,因为执行的2个Cypher查询是:

MERGE (n:`A` {`technicalId`: {value}})
  ON CREATE SET n={props} SET n:SupplierCompany
  return n
// params {value=42, props={technicalId=42}}
match (n)
  where id(n)={nodeId}
  set n:`A`:`C`:`_C`
// params {nodeId=1}

我是否应该在SDN JIRAgithub上针对测试用例提出问题?

0 个答案:

没有答案