2017-10-19 10 views
0

neo4j에서 속성을 공유하는 노드 사이에 가장자리를 만들려고합니다. 각 노드에는 a, b, c, d, e 등 5 가지 속성이 있습니다. 2 노드가 속성 'a'만 공유하면 edge의 이름은 'a'가됩니다. 2 노드가 속성 b, d, e를 공유하면 edge의 이름은 'bde'가됩니다. 각 쌍에 대해 속성을 공유하면 단일 모서리 만 만들고 싶습니다. 감사합니다. .neo4j에서 노드 사이에 조건부 가장자리를 만드는 방법은 무엇입니까?

MATCH (m), (n) 
WHERE ID(m) < ID(n) 
WITH m, n, [x IN KEYS(m) WHERE m[x] = n[x] | x] AS common_keys 
FOREACH (k IN common_keys | CREATE (m)-[:FOO {name: k}]->(m)) 

WHERE ID(m) < ID(n) 절에서 mn 방지 :

+0

그 것 몇 가지 정보가있다 귀하의 질문에 대한 답변을 얻으십시오. 1. 가장자리 이름으로, 가장자리의'유형'을 의미합니까? 2. 그렇다면 [APOC 라이브러리] (https://neo4j-contrib.github.io/neo4j-apoc-procedures/)를 사용할 수 있습니까? –

답변

2

이 질의는 모든 노드 쌍 사이에 동일한 값 (즉, 주 모든 특성 값)을 갖는 속성의 nameFOO 관계를 만들어야 동일한 노드이므로 동일한 쌍의 중복 평가도 방지합니다.

[업데이트]

당신이 그들이 여러 속성 값을 공유 할 경우에도 2 개 노드 사이에 단 하나의 FOO 관계를 원한다면,이 쿼리가 작동합니다 :

MATCH (m), (n) 
WHERE ID(m) < ID(n) 
WITH m, n, 
    REDUCE(s = '', k IN KEYS(m) | CASE m[k] WHEN n[k] THEN s + k ELSE s END) AS common_keys 
WHERE common_keys <> '' 
CREATE (m)-[:FOO {name: common_keys}]->(m) 
+0

감사합니다. 검색어가 여러 가장자리를 만듭니다. 그래서 'ade'와 같은 이름으로 단일 가장자리를 만드는 변경 작업을 수행했습니다. – Neo

+0

@cybersam 업데이트 주셔서 감사합니다. 대형 데이터 세트를위한 더 효율적인 방법이 있습니까? 감사! – Neo

+0

이 쿼리는 데카르트 제품을 생성하고 데이터 크기가 매우 큽니다 (~ 1 백만). 가장자리를 만드는 더 효율적인 방법이 있습니까? 감사! – Neo