2017-01-21 11 views
1

I以下サイファーのクエリがあります。のNeo4jサイファークエリヌルまたは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<>(); 

.... 

} 

に属することができますが parentDおよびが Tenantのいずれにも属していないか、 Tenantに属し、 {tenantIds}に設定されているIDを持つすべての childDが返されるようにするには、この質問で私を助けてください。

答えて

3

サイファーは非常に表情豊かな言語であり、ちょうどあなたのテキストの要件に従ってください...

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