2014-10-13 5 views
0

나는 neo4j 데이터베이스에서 몇 가지 기본적인 유사 검색을하려고합니다. 다음과 같이 보입니다.Neo4j/Cypher : 감소를 사용하여 집합

begin 
create (_1:`Article` {`name`:"Bow", `weight`:"20"}) 
create (_2:`Article` {`name`:"Shield", `weight`:"30"}) 
create (_3:`Article` {`name`:"Knife", `weight`:"40"}) 
create (_4:`Article` {`name`:"Sword", `weight`:"50"}) 
create (_5:`Article` {`name`:"Helmet", `weight`:"15"}) 
create (_6:`Order` {`customer`:"Peter"}) 
create (_7:`Order` {`customer`:"Paul"}) 
create (_8:`Order` {`customer`:"Mary"}) 
create (_9:`Accessory` {`name`:"Arrow",`type`:"optional", `weight`:"2"}) 
create _6-[:`CONTAINS` {`timestamp`:"1413204480"}]->_1 
create _6-[:`CONTAINS` {`timestamp`:"1413204480"}]->_2 
create _6-[:`CONTAINS` {`timestamp`:"1413204480"}]->_3 
create _7-[:`CONTAINS` {`timestamp`:"1413204480"}]->_1 
create _7-[:`CONTAINS` {`timestamp`:"1413204480"}]->_4 
create _8-[:`CONTAINS` {`timestamp`:"1413204480"}]->_5 
create _9-[:`BELONGS_TO` {`timestamp`:"1413204480"}]->_1 
; 
commit 

아주 잘 알려지지 않은 데이터베이스입니다. 이 게시물에 대한 유일한 이유.

새 주문이 접수되면 유사한 주문이 이미 접수되었는지 여부를 알아야합니다. 비슷한 의미 : 기존 고객 또는 신규 고객 및 동일한 제품. 어려운 부분은 : (직접 또는 간접적으로) 포함 된 모든 노드의 가중치 합이 필요합니다.

여기에 내가 가진 무엇 :

START n=node(*) 
MATCH p1 = (a:Order)-[*]->n, p2 = (b:Order)-[*]->m 
WHERE a<>b AND n.name = m.name 
RETURN reduce (sum="", x in p2 | sum+x.weight) limit 25; 

을하지만, 그 P2가 건너 집계 할 수있는 권리 일이 아니다 보인다. Cypher는 경로가 아닌 컬렉션을 기대합니다.

정말로이 초보자 용 게시물을 유감스럽게 생각하지만 안심하십시오. 저는 매우 감사하는 초보자입니다. 감사! 꼬마 도깨비

+0

당신은 단지'reduce (sum = 0, x IN nodes (p2) | sum + x.weight)'를 사용할 수 있습니다. –

+0

당신은 경로에서 무제한 경로가 아닌 관계 유형을 사용해야합니다. –

+0

안녕 마이클, 관계 유형이 내 프로젝트의 할 일 목록에 있습니다. 결국 경로는 결국 5 개 정도되지 않습니다. 이 단계에서, 나는 경로 길이에 대해 정말로 신경 쓰지 않는다, 나는 단지이 총을 똑바로하고 싶다. – rene

답변

2

검색어에 따르면 p2이 새로운 주문의 경로 인 것으로 가장하는 것처럼 보입니다. 나는 실제 쿼리에서 b을 특정 노드에 바인딩한다고 가정합니다. 또한 시간 소인과 가중치에는 숫자 값 (따옴표 제외)이 있어야합니다.

이 쿼리는 "새"경로의 총 가중치를 반환합니다. 이게 니가 원하는거야?

MATCH p1 =(a:Order)-[*]->n, p2 =(b:Order)-[*]->m 
WHERE a<>b AND n.name = m.name 
WITH p2, collect(m) AS ms 
RETURN reduce(sum=0, x IN ms | sum+x.weight) 
LIMIT 25; 

그런데 START n=node(*)은 불필요합니다. 언 바운드 n을 사용하는 것과 같습니다.

this console을 참조하십시오.

+0

좋은 물건. 고마워, 사이버 탐! 확실히 나를 돕는다. – rene

+0

내 그래프가 더 발전하고 다시 붙어 있습니다. 이제 그래프는 "처리"속성과 관계가 있습니다. 현재 버전은 다음과 같습니다 : [link] http://console.neo4j.org/r/g9b10p Mary의 배치 순서는 Paul과 Peter의 순서와 비슷합니다. 그냥 취급이 다릅니다. 달성하고자하는 것 : 1. 해당 사용자 (Paul and Peter)
을 찾습니다. 2. Mary의 주문 그래프에서 처리 값을 합산합니다. 3. Paul의 주문 그래프에서 처리 값을 합산합니다. 4. Peter의 순서 내에서 처리 값을 합산합니다 그래프 도움을 주시면 감사하겠습니다. 환호 - rene – rene

+0

새로운 질문으로이 질문을하십시오. 또한 연결된 콘솔이 올바르게 작동하지 않습니다. 불필요한 추가 CREATES 집합이 있고 MATCH 쿼리가없는 것 같습니다. – cybersam

관련 문제