2014-04-23 2 views
1

У меня есть требование пересечь все узлы и удалить все узлы (и их отношения и связанные узлы) на основе определенных критериев. Для целей тестирования (чтобы убедиться, что я могу удалить узлы во время перемещения), я пытаюсь просто удалить один узел в середине траверса и использовать другой обход, чтобы удалить все узлы и отношения, привязанные к этому узлу. Я могу удалить все узлы и отношения, но после этого я получаю IllegalStateException (Node удален), когда цикл возвращается к 1-му обходу. Можно ли удалить узлы/отношения во время прохождения? Если да, то какой эффективный способ пересечь все узлы и удалить некоторые узлы на этом пути. Заранее спасибо!# Neo4j Удаление узлов/отношений при обходе с использованием java API

private void traverseGivenNode(Node node, TraversalDescription friendsTraversal) { 

    for (Node currentNode : friendsTraversal.traverse(node).nodes()) 
    { 
     if (currentNode.getProperty("name").equals("AAA")) { 
      deleteNodeAndItsConnections(currentNode); 

     } 
    }  
} 

private void deleteNodeAndItsConnections(Node currentNode) { 

    TraversalDescription traversal = graphDb.traversalDescription() 
      .breadthFirst() 
      .uniqueness(Uniqueness.NODE_PATH).evaluator(Evaluators.excludeStartPosition()).relationships(RelTypes.KNOWS, Direction.OUTGOING); 


    for (Node node : traversal.traverse(currentNode).nodes()) 
    { 
     deleteNode(node); 
    } 

    deleteNode(currentNode); 

} 

private void deleteNode(Node node) { 
    Iterable<Relationship> allRelationships = node.getRelationships(); 
    for (Relationship relationship : allRelationships) { 
     relationship.delete(); 
    } 
    node.delete(); 
} 
+0

Пожалуйста, покажите ваши Cypher запросы. – cybersam

+0

@cybersam Спасибо, что нашли время, чтобы прочитать мой вопрос. Я использую JAVA API для обхода. Я добавил пример кода Java. – user3564731

ответ

1

Один из способов решить это - не удалять ничего, пока обход не будет завершен. Вместо этого во время обходов просто добавьте каждый узел и связь, которые нужно удалить, в соответствующий HashSet. После этого вызовите функцию Relationship.delete() на все, что находится в наборе отношений, а затем Node.delete() на все в наборе узлов.

+0

Спасибо, что нашли время ответить и ваши предложения. Наш график будет увеличиваться во времени, поэтому я думал о добавлении свойства в узле и отношениях (что-то вроде отметки для удаления), а затем может быть запущен запрос Cypher для удаления. Я думал, что это может быть быстрее по сравнению с добавлением их в коллекцию и последующим их удалением. Я собираюсь проверить это, но знаете ли вы, какой путь быстрее/эффективнее? Заранее спасибо! – user3564731

0

Создать набор для отношений, которые необходимо добавить и удалить.

Set<Relationship> removableRelations = new HashSet<Relationship>(); 
Set<Node> removableNodes = new HashSet<Node>(); 

Добавить узлы и отношения должны быть удалены в removableRelations и removableNodes

затем написать ниже код для удаления этих:

for(Relationship removableRel:removableRelations){ 
      removableRel.delete(); 
     } 
for(Node remNode:removableNodes){ 
      remNode.delete(); 
     } 
Смежные вопросы