2013-06-11 2 views
0

I는 다음과 같은 패턴을 형성하는 사용자를위한 이벤트의 역사를 나타내는 노드의 목록이 있습니다Neo4j - 목록에서 노드 간의 추가 관계를 추가

()-[:s]->()-[:s]->()하고 그렇게

의 각 노드에 목록은 사용자 (관계를 통해 연결됨)에 속합니다.

개별 사용자 기록을 만들려고합니다 (특정 사용자에게 발생하는 모든 이벤트 사이에 successs_for_user 관계를 추가하여 각 이벤트에 연속 이벤트가 하나만 있음).

나는 관계에 있어야 노드를 추출하기 위해 이런 일을하려고했다 :

start u = node:class(_class = "User") 
match p = shortestPath(n-[:s*..]->m), n-[:belongs_to]-u-[:belongs_to]-m 
where n <> m 
with n, MIN(length(p)) as l 
match p = n-[:s*1..]->m 
where length(p) = l 
return n._id, m._id, extract(x IN nodes(p): x._id) 

을하지만 고통스럽게 느립니다.

누구나 더 좋은 방법을 알고 있습니까?

답변

1

Neo4j는 거기에서 가장 짧은 경로를 많이 계산합니다.

당신이 (내 쿼리가 ID x의 목적으로) 역사의 시작 노드를 가정하면,이 같은 사용자 ID를 대응하는 이벤트 노드의 정렬 된 목록을 얻을 수 있습니다 : 당신이 할 수있는

"START n=node(x) # history start 
MATCH p = n-[:FOLLOWS*1..]->(m)<-[:DID]-u # match from start up to user nodes 
return u._id, 
    reduce(id=0, 
      n in filter(n in nodes(p): n._class != 'User'): n._id) 
    # get the id of the last node in the path that is not a User 
    order by length(p) # ordered by path length, thus place in history" 

을 그런 다음 프로그램에서 결과를 반복하고 동일한 사용자에 속한 노드간에 관계를 추가하십시오. 필자는 큰 데이터 세트가 없지만 더 빠를 수도 있습니다.

관련 문제