2017-12-20 2 views
0

Neo4j 데이터베이스의 특정 노드에서 시작하여 종료되는 모든 루프를 찾고 싶습니다. 나는 시도했다 :Neo4j Cypher 특정 노드의 루프 찾기

START n=node:Event(time=",timestamp,") 
MATCH p=(n)-[:LINKED_TO*1..5]->(n) 
WHERE NONE (n IN nodes(p) WHERE size(filter(x IN nodes(p) WHERE n = x))> 2) 
RETURN p, length(p) 

이것은 내가 웹에서 매쉬업 할 수있는 최선의 방법이다. 이 점에 대해 내가 좋아하지 않는 두 가지가 있습니다 : 1. 이 충돌합니다. 2. 시작 + 종료 노드를 허용하려면 카운트 임계 값이 "> 2"여야합니다. 이는 같은 중간 노드를 두 번 방문하는 루프가 포함된다는 것을 의미합니다.

저는 최단 경로에 관심이 없습니다. 시작 노드로 돌아 오는 모든 루프를 알고 싶습니다.

미리 감사드립니다.

답변

1

시작 및 종료 지정된 노드와 다른 반복 노드가없는 모든 루프 반환해야이 쿼리 :

START n=node:Event(time=",timestamp,") 
MATCH p=(n)-[:LINKED_TO*1..5]->(n) 
UNWIND TAIL(NODES(p)) AS m 
WITH p, COUNT(DISTINCT m) AS cm 
WHERE LENGTH(p)-1 = cm 
RETURN p, LENGTH(p); 
+0

이것이 마침내 나를 위해 일한 것으로 나타났습니다. –

0

이 cybersam 감사를! 도움이되었습니다. 입력 할 때 몇 가지 오류가 발생하여 "START"가 사용되지 않습니다. 나는 다음과 같은 수정 작업 발견 :

MATCH (n:Event{time:1458238060505007}) 
MATCH p=(n)-[:LINKED_TO*1..5]->(n) 
UNWIND TAIL(NODES(p)) AS m WITH p RETURN p 

이 유일한 문제는 그것이 N, 에게 원하는 시작 노드를 통해 이동하는 모든 경로를 제공하는 표시이다. 그게 사실이야? 그렇다면이 문제를 해결할 수있는 방법이 있습니까?

+0

이것은 답변이 아닙니다. 내 답변에 대한 의견이거나 질문에 대한 편집에 포함되어 있거나 새로운 질문이 있어야합니다. 그건 그렇고,이 새로운 Cypher 쿼리는 당신이 원한대로하지 않기 때문에 새로운 질문이 있습니까? – cybersam

0

마지막으로 나에게 도움이 된 것. 그것은 사이버 햄이 제안한 것과 매우 가깝습니다. 이 "잘못된 길"을하는 것에 대한 사과. 사이버 암이 저를 다시 소리 지르 겠지만, 코멘트를 통해 코드를 추가하는 것은 읽기가 쉽지 않습니다. 앞서 언급 한 바와 같이

MATCH p=(n:Event{time:",timestamp,"})-[:LINKED_TO*1..5]->(n) 
UNWIND TAIL (NODES(p)) AS m 
WITH p,COUNT(DISTINCT m) AS cm 
WHERE LENGTH(p) = cm 
RETURN p 

는 하나 개의 난제는 (내가 사용 R에 RNeo4j를 사용하는 경우, 예를 들어,) 사용되지 않으며 오류가 발생한다 "START"의 사용이었다. 새로운 방법은 MATCH를 사용하고 경로 패턴에서 시작 노드를 지정하는 것입니다. 나를 혼란스럽게하는 또 다른 이유는 "길이 (p)"대신 "길이 (p) -1"을 사용했기 때문입니다. 한 노드가 다른 노드에 연결될 때 경로 길이는 3이 아닌 길이가 2이고 두 개의 노드 만 있습니다. 내 응용 프로그램의 경우 "LENGTH (p) = cm"이 작동했습니다.

마지막으로 경로에 노드가 있으면 "WITH m, ..."을 사용하지 마십시오. 이유가 무엇인가에 따라 "COUNT (DISTINCT (m))"계산이 망가지기 때문입니다. 알다.