Neo4j:获取已删除属性的值
我正在使用事务事件处理程序对删除的节点进行安全检查,以确保是否允许当前用户执行此操作 为了确保我有正确的节点进行检查,我首先必须确定它是否具有某个属性,然后检查另一个属性的值,因此理想情况下,代码应该如下所示:Neo4j:获取已删除属性的值,neo4j,Neo4j,我正在使用事务事件处理程序对删除的节点进行安全检查,以确保是否允许当前用户执行此操作 为了确保我有正确的节点进行检查,我首先必须确定它是否具有某个属性,然后检查另一个属性的值,因此理想情况下,代码应该如下所示: graphDatabaseService.registerTransactionEventHandler(new TransactionEventHandler.Adapter<Object>() { @Override pub
graphDatabaseService.registerTransactionEventHandler(new TransactionEventHandler.Adapter<Object>() {
@Override
public Object beforeCommit(TransactionData data) throws Exception {
for (Node node : data.deletedNodes()) {
if (node.hasProperty("checkProperty")){
if (node.hasProperty("propertyToCheck")){
String value = (String) node.getProperty("propertyToCheck");
... do checking on value
}
}
}
return null;
}
我发现的唯一解决办法是:
for (Node node : data.deletedNodes()) {
boolean check = false;
String valueToCheck = null;
for (PropertyEntry prop : data.removedNodeProperties()) {
if (node.equals(prop.entity())) {
if (prop.key().equals("checkProperty")) {
check = true;
}
if (prop.key().equals("propertyToCheck")) {
valueToCheck = (String) prop.previouslyCommitedValue();
}
}
}
if (check){
... do checking on value
}
}
但是这会通过所有删除的属性,所以这显然不是一个好的解决方案
所以我的问题是:有没有更好的方法
使用neo4j 1.9.3因为
TransactionEventHandler#beforeCommit
中的代码本身就是事务的一部分,所以您无法访问已删除节点或关系上的任何属性。正如您所发现的,访问已删除属性的唯一方法是通过TransactionData#removedNodeProperties()
和TransactionData#removedRelationshipProperties()
您可以通过在removedNodeProperties()
上运行单个迭代来优化代码(只需下面的伪代码):
for(PropertyEntry pe:data.removedNodeProperties()){
if(pe.key().equals(“checkProperty”)){
runCheckForDeletedNodeAndValue(pe.entity(),pe.PreviouslyCommittedValue())
}
}
public void runCheckForDeletedNodeAndValue(节点节点,对象oldValue){
//如果当前用户不允许删除,则引发异常
//这将回滚整个事务
}
您的代码片段将为每个已删除的节点迭代此集合。谢谢您的建议。您忽略了一个事实,即基于1个属性的存在,我需要检查另一个属性的值,以作为安全决策的基础。所以我还需要另一个循环。当然,踢出deletedNodes循环是个好主意。
for (Node node : data.deletedNodes()) {
boolean check = false;
String valueToCheck = null;
for (PropertyEntry prop : data.removedNodeProperties()) {
if (node.equals(prop.entity())) {
if (prop.key().equals("checkProperty")) {
check = true;
}
if (prop.key().equals("propertyToCheck")) {
valueToCheck = (String) prop.previouslyCommitedValue();
}
}
}
if (check){
... do checking on value
}
}
for (PropertyEntry<Node> pe: data.removedNodeProperties()) {
if (pe.key().equals("checkProperty")) {
runCheckForDeletedNodeAndValue(pe.entity(), pe.previouslyCommitedValue())
}
}
public void runCheckForDeletedNodeAndValue(Node node, Object oldValue) {
// throw exception if current user is not allowed to delete
// this will rollback whole transaction
}