2015-06-09 4 views
1

В продолжать этот вопрос Neo4j how to delete nodes recursively from some start nodeNeo4j 2.2.2 и неправильно Cypher запрос

я переехал в Neo4j 2.2.2 и теперь есть проблема с одним Cypher запроса, который отлично работает на предыдущей Neo4j 2.1.7

Я использую Spring Data Neo4j:

@Query("MATCH (d:Decision) WHERE id(d) IN {decisionsIds} WITH d OPTIONAL MATCH (d)-[r]-(t) DELETE d, r WITH t, r OPTIONAL MATCH (t)-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR]-() WITH t, r2, r WHERE none(x in labels(t) WHERE x in ['User', 'Decision']) DELETE t, r2") 
void deleteDecisions(@Param("decisionsIds") List<Long> decisionsIds); 

ошибка:

org.springframework.dao.InvalidDataAccessResourceUsageException: Error executing statement MATCH (d:Decision) WHERE id(d) IN {decisionsIds} WITH d OPTIONAL MATCH (d)-[r]-(t) DELETE d, r WITH t, r OPTIONAL MATCH (t)-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR]-() WITH t, r2, r WHERE none(x in labels(t) WHERE x in ['User', 'Decision']) DELETE t, r2; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: Error executing statement MATCH (d:Decision) WHERE id(d) IN {decisionsIds} WITH d OPTIONAL MATCH (d)-[r]-(t) DELETE d, r WITH t, r OPTIONAL MATCH (t)-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR]-() WITH t, r2, r WHERE none(x in labels(t) WHERE x in ['User', 'Decision']) DELETE t, r2; nested exception is org.neo4j.kernel.api.exceptions.EntityNotFoundException: Unable to load NODE with id 227. 
    at org.springframework.data.neo4j.support.query.CypherQueryEngineImpl.query(CypherQueryEngineImpl.java:61) 
    at org.springframework.data.neo4j.repository.query.GraphRepositoryQuery.dispatchQuery(GraphRepositoryQuery.java:108) 
    at org.springframework.data.neo4j.repository.query.GraphRepositoryQuery$1.doWithGraph(GraphRepositoryQuery.java:90) 
    at org.springframework.data.neo4j.support.Neo4jTemplate.doExecute(Neo4jTemplate.java:465) 
    at org.springframework.data.neo4j.support.Neo4jTemplate.access$000(Neo4jTemplate.java:87) 
    at org.springframework.data.neo4j.support.Neo4jTemplate$2.doInTransaction(Neo4jTemplate.java:479) 
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133) 
    at org.springframework.data.neo4j.support.Neo4jTemplate.exec(Neo4jTemplate.java:476) 
    at org.springframework.data.neo4j.repository.query.GraphRepositoryQuery.execute(GraphRepositoryQuery.java:84) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:431) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:409) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 

что может быть неправильным?

ОБНОВЛЕНО

После отладки я понял, что Невозможно загрузить узел с идентификатором 227 227 является дочерним узлом идентификатор .. например, у меня ParentNode (ID = 201) с одной ChildNode (с id = 227). Я хочу удалить ParentNode со всеми своими детьми. Таким образом, мне нужно передать в {decisionsIds} идентификаторы родительского узла и дочернего узла (в порядке [227, 201] - сначала ребенок, потом родительский), и сейчас проблема заключается в том, что запрос Cypher не может удалить дочерний узел со следующей ошибкой Невозможно загрузить УЗЕЛ с идентификатором 227 .. но почему она работает в Neo4j 2.1.7 и как это исправить в Neo4j 2.2.2

ответ

1

[EDIT # 2]

дополнительная информация очень полезна , Проблема может заключаться в том, что t может быть удаленным дочерним узлом.

Попробуйте этот запрос, который гарантирует, что t, который используется после первоначальных удалений, не является удаленным узлом.

MATCH (d:Decision) 
WHERE id(d) IN {decisionsIds} 
OPTIONAL MATCH (d)-[r]-(t) 
DELETE d, r 
WITH t, r 
WHERE NOT (id(t) IN {decisionsIds}) 
OPTIONAL MATCH (t)-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR]-() 
WHERE r2 <> r 
WITH t, r2 
WHERE none(x in labels(t) WHERE x in ['User', 'Decision']) 
DELETE t, r2; 
+0

Спасибо за ваш ответ, я снял "г" из запроса, но это не помогает (- MATCH (d: Решение) WHERE ID (d) В {decisionsIds} С г ФАКУЛЬТАТИВНЫМ MATCH (г) - [r] - (t) DELETE d, r WITH t OPTIONAL MATCH (t) - [r2: VOTED_ON |: CREATED_BY |: VOTED_FOR] -() WITH t, r2 WHERE none (x в методах (t) WHERE x in ['Пользователь', 'Решение']) DELETE t, r2 – alexanoid

+0

Я обновил свой ответ – cybersam

+0

Добавил этот новый запрос, но все равно не помогает (@Query ("MATCH (d: Решение) WHERE id (d) IN {solutionsIds} WITH d ДОПОЛНИТЕЛЬНАЯ МАТЧА (d) - [r] - (t) DELETE d, r WITH t, r ДОПОЛНИТЕЛЬНАЯ МАТЧА (t) - [r2: VOTED_ON |: CREATED_BY |: VOTED_FOR] -() \t WHERE r2 < > r WITH t, r2 WHERE none (x в методах (t) WHERE x in ['User', 'Decision']) \t DELETE t, r2 ") – alexanoid

Смежные вопросы