2016-12-16 3 views
1

Допустим, у нас есть график Neo4j, такой как (Brand) - [: from] -> (Post) < - [: нравится] - (Лицо).Запрос Cypher для возврата x Число определенного типа узла

Как я могу вернуть запрос cypher, который будет иметь минимальное количество сообщений о бренде, скажем 3. Я хочу, чтобы это было масштабируемо и не зависело от определенного значения атрибута свойства.

Следовательно, результаты вернут не менее 3 экземпляров узлов Бренд, а также, возможно, 5 из Почты и 15 из Лица.

Я пытался несколько различных вещей:

1.) Объявить несколько имен переменных для каждой марки (не масштабируемой)

Match (b:Brand)-[]->(p:Post)<-[]-(per:Person) 
    Match (b1:Brand)-[]->(p1:Post)<-[]-(per2:Person) 
    Match (b2:Brand)-[]->(p2:Post)<-[]-(per3:Person) 
    return b,b1,b2,p,p1,p2,per,per2,per3 
    limit 30 

Это не сработало, потому что она по существу возвращать такой же, как

Match (b:Brand)-[]->(p:Post)<-[]-(per:Person) 
    return b,p,per 
    limit 30 

2.) Используйте Еогеасп некоторые

Match (b:Brand) WITH collect (distinct b) as bb 
    FOREACH (b in bb[0..3] | MATCH (b)-[]->(p:Post)<-[]-(per:Person)) 
    RETURN b, p, per LIMIT 40 

Это не сработало, потому что вы не можете использовать Match внутри вызова Foreach.

Единственный способ, которым я знаю, как это сделать, - объявить предложение where с их уникальными значениями свойств бренда, которые не являются масштабируемыми. Это выглядит так:

Match (b:Brand)-[]->(p:Post)<-[]-(per:Person) 
    where b.brand = "b1" OR b.brand ="b2" or b.brand = "b3" 
    Return b,p,per 
    Limit 30 

Однако вышеуказанное не возвращает даже то, что я хочу.

Пожалуйста, помогите. Вот краткий график, чтобы проверить на:

Create (b1:Brand {brand:'b1'}) 
    Create (b2:Brand {brand:'b2'}) 
    Create (b3:Brand {brand:'b3'}) 
    Create (p1:Post {id: "001",message: "foo"}) 
    Create (p2:Post {id: "002",message: "bar"}) 
    Create (p3:Post {id: "003",message: "baz"}) 
    Create (p4:Post {id: "004",message: "raz"}) 
    Create (per1:Person {id: "001",name: "foo"}) 
    Create (per2:Person {id: "002",name: "foo"}) 
    Create (per3:Person {id: "003",name: "foo"}) 
    Create (per4:Person {id: "004",name: "foo"}) 
    Create (per5:Person {id: "005",name: "foo"}) 
    Create (per6:Person {id: "006",name: "foo"}) 
    Create (per7:Person {id: "007",name: "foo"}) 
    Merge (b1)-[:FROM]->(p1)  
    Merge (b1)-[:FROM]->(p2) 
    Merge (b2)-[:FROM]->(p3) 
    Merge (b3)-[:FROM]->(p4) 
    Merge (per1)-[:LIKES]->(p1) 
    Merge (per1)-[:LIKES]->(p2) 
    Merge (per1)-[:LIKES]->(p3) 
    Merge (per2)-[:LIKES]->(p1) 
    Merge (per2)-[:LIKES]->(p4) 
    Merge (per3)-[:LIKES]->(p3) 
    Merge (per4)-[:LIKES]->(p1) 
    Merge (per5)-[:LIKES]->(p2) 
    Merge (per6)-[:LIKES]->(p1) 
    Merge (per6)-[:LIKES]->(p2) 
    Merge (per6)-[:LIKES]->(p3) 
    Merge (per6)-[:LIKES]->(p4) 
    Merge (per7)-[:LIKES]->(p4) 

ответ

0

Вы можете использовать unwind вместо foreach:

Match (b:Brand) WITH collect (distinct b) as bb 
UNWIND bb[0..3] as b 
    MATCH (b)-[]->(p:Post)<-[]-(per:Person) 
RETURN b, p, per LIMIT 40 

Или объединить with и limit:

MATCH (b:Brand) WITH distinct b LIMIT 3 
MATCH (b)-[]->(p:Post)<-[]-(per:Person) 
RETURN b, p, per LIMIT 40