2017-01-21 13 views
1

У меня есть следующий запрос: CypherNeo4j Cypher запрос нуль или IN

MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) 
WHERE id(parentD) = {decisionId} 
RETURN ru, u, childD 
SKIP 0 LIMIT 100 

Decision объект может принадлежать 0..n Tenant объектов

@NodeEntity 
public class Decision { 
    private final static String BELONGS_TO = "BELONGS_TO"; 

    @Relationship(type = BELONGS_TO, direction = Relationship.OUTGOING) 
    private Set<Tenant> tenants = new HashSet<>(); 

.... 

} 

мне нужно расширить Cypher запрос выше чтобы вернуть все childD, где parentD и childD не принадлежат ни одному из Tenant или принадлежат к Tenant с идентификаторами, указанным в {tenantIds}. Пожалуйста, помогите мне с этим запросом.

ответ

3

Cypher очень выразительный язык, просто следовать вашим текстуальные требованиям ...

MATCH (t:Tenant) WHERE ID(t) in {tenantIds} 
WITH COLLECT(t) as tenants 
MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) 
WHERE 
id(parentD) = {decisionId} 
AND 
    // not belong to any of Tenant or belong to Tenant 
    (not (parentD)-[:BELONGS_TO]-(:Tenant) OR any(t in tenants WHERE (parentD)-[:BELONGS_TO]-(t))) 
AND 
    // not belong to any of Tenant or belong to Tenant 
    (not (childD)-[:BELONGS_TO]-(:Tenant) OR any(t in tenants WHERE (childD)-[:BELONGS_TO]-(t))) 
RETURN ru, u, childD 
SKIP 0 LIMIT 100 
2

Использование optional match для сбора и тестирования tenants:

MATCH (parentD) WHERE id(parentD) = {decisionId} 
    OPTIONAL MATCH (parentD)-[:BELONGS_TO]->(T:Tenant) 
      WHERE NOT id(T) IN {tenantIds} 
WITH parentD, collect(T) AS TC 
    WHERE size(TC) <= 0 
MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) 
    OPTIONAL MATCH (childD)-[:BELONGS_TO]->(T:Tenant) 
      WHERE NOT id(T) IN {tenantIds} 
WITH childD, ru, u, collect(T) AS TC 
    WHERE size(TC) <= 0 
RETURN ru, u, childD 
SKIP 0 LIMIT 100