2017-11-08 2 views
3

Neo4j와 Traversal이 할 수있는 것에 관해 복잡한 질문이 있습니다.Neo4j 그래프 역 추적 알고리즘

하면 다음 Neo4j 그래프를 상상

Graph

내 생각은 전체 그래프를 통과하는 것입니다, 나는이 '거짓'노드를 발견하면, 자신의 이웃이 상태를 확장 등등, 및 마지막으로이 예에서는 모든 노드에 '거짓'상태가 표시됩니다. (실제 생활에서 , 나는 통과하면서 참 또는 거짓이 상태를 설정하는 이상의 조건을 가지고,하지만 난 그것을 질문에 대한 약간 간체)

나는이 작업을 수행하는 몇 가지 되돌아 알고리즘을 필요가 있다고 생각을하지만, Neo4j에서 나는 이것을하는 법을 모른다. 또한이 그래프는 매우 큰 그래프 일 수 있습니다.

Java와 Neo4j를 사용하면 어떻게 될까요?

감사합니다.

+1

'false'로 원하는 속성을 가진 노드와 일치하는 것으로 충분하면 연결 가능한 노드를 모두 false로 변경하십시오. – InverseFalcon

답변

0

귀하의 질문을 완전히 이해했는지 모르겠지만 간단한 Cypher 쿼리로 충분하다고 생각합니다. 다음과 같은 것 :

MATCH ({someProperty : false})-[*]-(neighbours) 
SET neighbours.someProperty = false 
+0

이렇게하면 어떤 깊이에서도 false 속성이 확장되므로 제대로 작동 할 것입니다. 확장하는 동안 조건을 추가해야하지만 시도해 보겠습니다. 내 질문에 나는 자바로이 일을 해달라고 부탁했다. (자기 자신을 설명하지 않으면 미안하지만 TraversalDescription, Expanders ...). 왜 사이퍼인가? 더 쉬워? Thanks – jpadilladev

+0

@jpadilladev Cypher는이 데이터베이스를 처리하는 쿼리 언어이기 때문에 Neo4j로 작업 할 때 "자연스러운"선택입니다. 그리고 네, Cypher는 Java API와 비교할 때 작업하기가 더 쉽습니다. 그러나 Java API는 더 많은 유연성과 덜 추상화를 제공합니다. 귀하의 요구 사항을 완전히 이해했다면 transversing이 완료되는 동안 조건을 동적으로 추가하려고합니다 ...이 경우 Java API로 작업해야 할 것입니다. –

2

도달 가능한 노드에 효율적으로 일치시키기 위해 잘 작동하는 두 가지 옵션이 있습니다.

Neo4j 3.2.x에는 가변 관계 성냥과 DISTINCT의 사용을 통해 모든 개별 도달 가능 노드와 일치하는 효율적인 수단이 있지만 가변 길이 관계에 대한 상한이 필요합니다. 적절하게 높은 숫자를 사용하면 효과가 있습니다. 뭔가 같은 :

MATCH (start:SomeLabel{someProperty:false}) 
CALL apoc.path.subgraphNodes(start, {}) YIELD node 
SET node.someProperty = false; 

편집

첫 번째 옵션에 대한 자세한 내용을 추가하려면 (왜 안 :

MATCH (:SomeLabel{someProperty:false})-[*..999999]->(x) 
WITH distinct x 
SET x.someProperty = false 

그렇지 않으면, APOC Procedures 또한 서브 그래프에 도달 노드에 효율적으로 매칭을 수행 apoc.path.subgraphNodes()을 제공합니다 *을 사용하고 DISTINCT를 사용해야하는 이유) 기본적으로 Cypher는 *을 사용할 때 가능한 모든 경로와 일치합니다. 경로가 이전 노드와 동일한 노드에서 끝나더라도 일치하는 경로. 이것은 충분히 연결된 그래프에서 비효율적이 될 수 있습니다 (합리적인 상한선이없고 LIMIT을 사용하지 않을 때). 힙을 불거나 무한정 매달릴 가능성이 있습니다.

우리가 가능한 모든 경로에 관심이 없거나 도달 가능한 모든 노드에만 관심이있는 경우 특히 피해야합니다.

In Neo4j 3.2, 최적화는 다음의 모두에 해당하는 경우 순회 로직을 변경하는,라고 치기 - var에 확장 도입 :

  1. 우리는 VAR 길이 확장
  2. 우리는을 참조하지 않는에게 있습니다 (경로 변수를 일치 패턴으로 설정하거나 var-length 관계에 변수를 설정하는 것과 같이)
  3. var-length 확장에 상한이 있습니다.
  4. DISTINCT 확장으로 얻을 수있는 노드 또는 값

기본적으로 쿼리가 var-length 확장에서 별개의 노드 (또는 별개 노드의 값)를 원하며 경로를 신경 쓰지 않는 쿼리 인 경우.

플래너는 다음과 같이 pluning var expand (EXPLAIN 또는 PROFILE에서 쿼리 계획을 확인하여 확인할 수 있음)를 사용하여 도달 가능한 노드와 효율적으로 일치시킵니다.

+0

* 만 작동합니다 (Bruno Peres 대답 및 [이 답변] (https://stackoverflow.com/a/26799022/3133256)). 왜 DISTINCT입니까? – jpadilladev

+0

커다란 그래프에서'*'를 사용하는 제한과 전정 var 확장 최적화에 대한 세부 사항을 추가했습니다. – InverseFalcon

+0

굉장한 설명! –