2016-03-30 15 views
1

İki tür içeren basit bir grafik veritabanım var.Neo4J Cypher sorgu - IN koleksiyonu?

blogpost Etiket

blog yayınını birçok etiketi olabilir.

Bir BlogPost yazdım ve 4 etiket verdim. En azından bu dört etiketi içeren diğer BlogPost'ları aramak istiyorum.

Ben

MATCH (b:BlogPost{id='156'})-[:tagged]->(original_tag) 
WITH b, collect(original_tag) AS original_tags 
MATCH (b2)-[:tagged]-(second_blog_tag) 
WITH b, original_tags, collect(second_blog_tag) AS second_blog_tags, b2 
WHERE original_tags IN second_blog_tags 
RETURN b2.id 

hat

WHERE original_tags IN second_blog_tags 

yanlıştır Ancak

denedim. Herhangi biri yardım sunabilir mi? Kullanmak hakkında düşünmem doğru mu, yoksa daha iyi bir yolu var mı?

cevap

3

bu deneyin:

MATCH (b:BlogPost{id='156'})-[:tagged]->(original_tag) 
WITH b, collect(original_tag) AS original_tags 
MATCH (b2)-[:tagged]-(second_blog_tag) 
WITH b, original_tags, collect(second_blog_tag) AS second_blog_tags, b2 
WHERE ALL(tag IN original_tags WHERE tag IN second_blog_tags) 
RETURN b2.id 

da deneyebilirsiniz:

MATCH (b:BlogPost{id='156'})-[:tagged]->(original_tag)<-[:tagged]-(b2:BlogPost) 
WITH b, b2, count(distinct original_tag) as tagCount 
WHERE tagCount = size((b)-[:tagged]->()) 
RETURN b2.id 
+0

Doğru ve çok yararlı - teşekkür hem de çok. İki sorgunun setlerini nasıl karşılaştırılacağını anlamak için daha yeni ve daha yeni bir çaba gösteriyorum - bu cevap bana gerçekten yardımcı oldu – Airomega