在使用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
好的,可以通过以下方式避免这种情况:
@NodeEntity
public abstract class A {
@GraphId
public Long id;
@Indexed(unique = true, level = Level.INSTANCE)
public Long technicalId;
}
或使用failOnDuplicate
(虽然在文档中没有提及,即使是3.3,但我发现它here和here)避免了创建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}