Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j:获取已删除属性的值_Neo4j - Fatal编程技术网

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
}