2014-03-02 3 views
1

용어 노드로 태그가 지정된 콘텐츠 노드가있는 그래프에서 작업하고 있습니다. 다른 (검색) 용어 노드와 동일한 콘텐츠 노드에 연결된 용어 노드를 반환하는 쿼리를 가져 오려고합니다.동일한 중개자에 연결된 노드 매치 - cypher/neo4j

(matched:term)--(contentNode:content)--(search:term) 

아니라 어떤 이상에 연결된 검색어의 모든을 가지고 콘텐츠에 연결되어 내가 일치하는 용어 노드를 반환하는 데 문제. 여기

내 현재 쿼리의 단순화 된 버전입니다 : 여기
query = [ 
      'MATCH (matched:term)<-[:TAGGED_WITH]-(contentNode:content)-[:TAGGED_WITH]->(searchTerms:term) ', 
      'WHERE searchTerms.UUID IN {searchTerms} ', 
      'RETURN DISTINCT matched.name AS name, matched.UUID AS UUID, matched.contentConnections AS connections ', 
      'ORDER BY connections DESC LIMIT 10' 
     ].join('\n'); 

연습의 예이다 - 용어의 최고 그룹 내 쿼리에 의해 일치하는 용어입니다, 바닥은 사용되는 용어입니다 검색 :

search image

용어 '천문학'반환되지해야하지만, '이미지'로 태그 된 어떤 내용도 '천문학'태그이기 때문이다. 결과

그래프 표현 : 내용 (회색 노드)의 한 조각이 두 용어를 일치

graph rep 1

주 (이것은 노드 ID가 표시되는 내용이기 때문에 얘기하기 어렵다). 이 검색은 어떤 조건을 양보해서는 안

second search image

: 무엇 예상됩니다 만 "이미지"와 "기관"

또 다른 예는 모두 태그 된 콘텐츠에 연결되어있는 용어를 반환하는 것입니다 그러나 '기관지'와 '천문학'으로 태그 된 콘텐츠가 없기 때문에 태그 된 용어를 둘 중 하나로 반환합니다.

그래프 표현 :

graph rep 2

나는 내 질문에 분명했습니다 바랍니다. count()과 함께 작업하여 결과를 그룹화했지만 제대로 작동 시키려고 애 쓰고 있습니다.

도움을 주시면 감사하겠습니다.

편집은 :

은 쿼리 : 선택한 다음 두 조건을

query = [ 
    'MATCH (contentNode:content)-[:TAGGED_WITH]->(searchTerms:term) ', 
    'WITH contentNode, COUNT(contentNode) as countContent, searchTerms ', 
    'WHERE searchTerms.UUID IN {searchTerms} AND countContent = {searchTermsCount} ', 
    'MATCH (typeNode:termType)<-[:IS_TYPE]-(matched:term)<-[:TAGGED_WITH]-contentNode, ', 
     'matched-[:HAS_LANGUAGE {languageCode: {language} }]-(termMeta:termMeta) ', 
    'WHERE NOT matched.UUID IN {ignoreTerms}', 
    'RETURN DISTINCT termMeta.name AS name, matched.UUID AS UUID, matched.contentConnections AS connections ', 
    'ORDER BY connections DESC LIMIT 10' 
].join('\n'); 

이 쿼리는 내용 ('진화', '개미'의 그 조각 하나에 태그 용어를 반환 할 것으로 예상된다, 등), 그러나 위의 쿼리를 사용하면 용어가 반환되지 않습니다.

update issue

답변

1

당신은 두 쿼리를 분할 시도 할 수 있습니다 : 당신의 도움에 RaduK에 대한

MATCH (contentNode:content)-[:TAGGED_WITH]->(searchTerms:term) 
WHERE searchTerms.UUID IN {searchTerms} 
WITH contentNode, COUNT(*) as cnt 
WHERE cnt = {_searchTerms_size_} 
MATCH (matched:term)<-[:TAGGED_WITH]-contentNode  
RETURN DISTINCT matched.name AS name, matched.UUID AS UUID, matched.contentConnections AS connections 
ORDER BY connections DESC LIMIT 10 
+0

감사합니다,하지만이 쿼리는 예상대로 잘 작동하지 않습니다. 전체 복잡성에서 다시 추가 할 때 나는 그것을 깨뜨릴 수있었습니다.또한 대답은 포함 된 용어를 기반으로 필터링 할 수 있도록하기 위해 with 절에 searhTerm을 포함해야한다는 오류를 생성합니다. 문제를 설명하기 위해 내 질문에 다른 이미지를 추가했습니다. – bornytm

+0

올바르게 작동하는 쿼리에 대한 응답을 수정했습니다. WITH 절 앞에 나타나야하는 검색어에 대해 WHERE 절이 사용되었습니다. 또한 별개의 노드를 반환하는 것이 바람직합니다. 도와 주셔서 다시 한번 감사드립니다 -이 두 번째 피클은 내가 도왔을 때 도움이되었습니다. – bornytm

관련 문제