Cypher за намиране на подобни възли без повтарящи се съвпадения

Нов съм в шифъра. Искам да намеря подобни възли без повтарящи се съвпадения.

Примерни данни

CREATE (r1:Repository {id:"repository1"})
CREATE (r2:Repository {id:"repository2"})
CREATE (r3:Repository {id:"repository3"})
CREATE (a1:Actor {id: "actor1"}) 
CREATE (a2:Actor {id: "actor2"}) 
CREATE (a3:Actor {id: "actor3"})
CREATE (o1:Organization {id:"organization1"})
CREATE (o2:Organization {id:"organization2"})
MATCH (a:Repository {id:"repository1"}) MATCH (b:Actor {id: 'actor1'})    
CREATE (a)-[:IS_ACTOR]->(b)
MATCH (a:Repository {id:"repository1"}) MATCH (b:Actor {id: 'actor2'})    
CREATE (a)-[:IS_ACTOR]->(b)
MATCH (a:Repository {id:"repository1"}) MATCH (b:Actor {id: 'actor3'})   
CREATE (a)-[:IS_ACTOR]->(b)
MATCH (a:Repository {id:"repository1"}) MATCH (b:Organization {id:  
 'organization1'}) CREATE (a)-[:IN_ORGANIZATION]->(b)
MATCH (a:Repository {id:"repository2"}) MATCH (b:Actor {id: 'actor1'})    
CREATE (a)-[:IS_ACTOR]->(b)
MATCH (a:Repository {id:"repository2"}) MATCH (b:Actor {id: 'actor2'}) 
CREATE (a)-[:IS_ACTOR]->(b)
MATCH (a:Repository {id:"repository2"}) MATCH (b:Organization {id: 
'organization1'}) CREATE (a)-[:IN_ORGANIZATION]->(b)
MATCH (a:Repository {id:"repository3"}) MATCH (b:Actor {id: 'actor3'}) 
CREATE (a)-[:IS_ACTOR]->(b)
MATCH (a:Repository {id:"repository3"}) MATCH (b:Organization {id: 
'organization2'}) CREATE (a)-[:IN_ORGANIZATION]->(b)

Cypher

MATCH (a)-[r1:IS_ACTOR|IN_ORGANIZATION]->(match)<-   
[r2:IS_ACTOR|IN_ORGANIZATION]-(b) 
where not a.id = b.id  with a,b,count(match) as count, collect (match.id) as 
connections, collect (type(r1)) as rel1 
return a.id,b.id,count,connections,rel1 order by count desc

Резултат

 a.id           b.id        count  connections                     rel1
 repository2    repository1 3      actor1,actor2,organization1    IS_ACTOR, IS_ACTOR,IN_ORGANIZATION
 repository1    repository2 3      actor1,actor2,organization1    IS_ACTOR, IS_ACTOR,IN_ORGANIZATION
 repository3    repository1 1      actor3                         IS_ACTOR
 repository1    repository3 1      actor3                         IS_ACTOR

Как мога да премахна ред #2 & #4 от резултата?

Въз основа на отговор на подобен въпрос Опитах се да използвам филтър, но получавам синтактична грешка (шифр по-долу)

MATCH (a)-[r1:IS_ACTOR|IN_ORGANIZATION]->(match)<-  
[r2:IS_ACTOR|IN_ORGANIZATION]-(b) 
with filter(x in connections where x <> b.id) 
where not a.id = b.id  with a,b,count(match) as count, collect (match.id) as   
connections, collect (type(r1)) as rel1 
return a.id,b.id,count,connections,rel1 order by count desc

person harishvc    schedule 27.02.2015    source източник


Отговори (1)


Сравнявате пътя веднъж от двете страни, нещо, което можете да направите, за да принудите само един от тези пътища да бъде върнат. Сравнете идентификаторите, така че да поставите a и b във фиксиран ред и да избегнете другата комбинация.

MATCH (a)-[r1:IS_ACTOR|IN_ORGANIZATION]->(match)
      <-[r2:IS_ACTOR|IN_ORGANIZATION]-(b) 
where id(a) > id(b)
with a,b,count(match) as count, 
     collect (match.id) as connections, collect (type(r1)) as rel1 
return a.id,b.id,count,connections,rel1 order by count desc
person Michael Hunger    schedule 27.02.2015