2013-08-10 2 views
0

관계에없는 노드를 찾고 싶습니다. 그래서 나는 현재 노드 인스턴스와의 관계에서 노드를 찾는 동안 사용했다.MATCH의 연산자가 없습니다.

@Query(value = "start user=node({self}) match (user)<-[r:KNOWS]-(known) return known") 
@Fetch 
private Iterable<GraphUser> knowsMe; 

그러나 현재 노드를 모르는 노드를 찾으려고했을 때 해결책을 찾았습니다. 나는이 neo4j 온라인 실행기를 실행하면

@Query(value = "start user=node({self}), doesNotKnowMe=node(*) where has(user.userId) and NOT((user)<-[:KNOWS]-(doesNotKnowMe)) return doesNotKnowMe") 
    @Fetch 
    private Iterable<GraphUser> doesNotKnowMe; 

, 그것은 잘 작동 (http://www.neo4j.org/learn/cypher) 내가 사이트에 사용 된 샘플은 같은 것입니다.;

START m=node:node_auto_index(id="603"), actor=node(*) 
WHERE HAS (actor.name) AND NOT ((m)<-[:ACTS_IN]-(actor)) 
RETURN actor 

참고 : 결과를 얻으려면 영화와 관련이없는 노드를 배치해야합니다. 끝나면 쿼리가 추가 된 레코드가됩니다.

spring-data-neo4j로 실행할 때 문제가 있습니다. 관계 ([: 지식])에 [r : 지식]과 같은 별칭이없는 것은 좋아하지 않습니다.

예외 :

Caused by: org.neo4j.graphdb.NotFoundException: '__type__' property not found for NodeImpl#0. 
    at org.neo4j.kernel.impl.core.Primitive.newPropertyNotFoundException(Primitive.java:184) 
    at org.neo4j.kernel.impl.core.Primitive.getProperty(Primitive.java:179) 
    at org.neo4j.kernel.impl.core.NodeImpl.getProperty(NodeImpl.java:52) 
    at org.neo4j.kernel.impl.core.NodeProxy.getProperty(NodeProxy.java:155) 
    at org.springframework.data.neo4j.support.typerepresentation.AbstractIndexingTypeRepresentationStrategy.readAliasFrom 

그러나 아시다시피, 우리는 WHERE 절에 allias를 정의 할 수 없습니다. MATCH 절에서 정의 할 수 있지만, 일치로도 NOT 연산자를 사용할 수 없습니다.

NOT 연산자는 WHERE에서 사용할 수 있으므로 어떻게 사용해야합니까? 또는 어떻게 든 spring-data-neo4j 예외를 수정하는 방법이 있습니다.

감사합니다!

답변

0

Micheal Bachman이 언급했듯이 개체가 userId인지 확인하지 못했습니다. 누락 된 부분은 has(doesNotKnowMe.userId)입니다. 따라서 다른 유형 노드가 있더라도 노드가 내 모델이 될 것이라고 보증했습니다.

@Query(value = "start user=node({self}), doesNotKnowMe=node(*) where has(user.userId) and has(doesNotKnowMe.userId) and NOT((user)<-[:KNOWS]-(doesNotKnowMe)) return doesNotKnowMe") 
    @Fetch 
    private Iterable<GraphUser> doesNotKnowMe; 

그래서 위의 쿼리와 관련이없는 노드를 얻을 수있었습니다.

Michal Bachman에게 감사드립니다.

1

예외가 당신이 문제라고 주장하는 것과 다른 것으로 말하는 것처럼 보입니다. 그것은 루트 노드 (ID = 0의 노드)에 __type__ 속성이 없다는 것에 불평합니다. __type__ 속성은 Spring 데이터가 내부 정보를 저장하여 노드 밖으로 객체를 생성 할 수 있다고 믿습니다.

루트 노드가 나타내는 내용을 확인하십시오. 거기에 있어야한다고 생각하지 않으면 삭제하고 다시 시도하십시오. 또는 시스템에서 사용자와 같은 것을 나타내는 경우 다른 사용자 노드를 살펴보고 __type__ 속성에 대한 값을 가져 와서 루트 노드에 동일한 값을 설정하십시오.

관련 문제