Запрос Neo4j Cypher для поиска узлов с точным соответствием (И вместо ИЛИ)

Я пытаюсь создать запрос, который принесет мне некоторый узел, который точно совпадает с набором узлов. В этом случае я хочу привести впечатления, которые имеют теги, например, какие впечатления имеют теги: «еда» И «ночная жизнь» И «культура».

Мой запрос «работает», но в результате используется ИЛИ вместо И. Как я могу это исправить?

Я не уверен, что использую правильный подход

@Query("START experience = node:__types__(className=\"...\"), tags = node({0}) " +
  "WHERE experience-[:TAGGED]->tags " +
  "RETURN experience")
public Set<Experience> findExperiencesByTags(Set<Long> tagIds);

Я использую Spring Data 2.0.1 и neo4j 1.6.3.


person Flavio Alves    schedule 19.11.2012    source источник


Ответы (2)


попробуйте разделить его на 3 отдельные фразы ПОИСКПОЗ:

"MATCH experience-[:TAGGED]->tags1, experience-[:TAGGED]->tags2,  experience-[:TAGGED]->tags3, " +
"WHERE tags1.tag='food' AND tags2.tag='culture' AND tags3.tag='nightlife' "
person ulkas    schedule 19.11.2012
comment
Я пытаюсь сделать что-то более универсальное. Я получаю набор идентификаторов тегов, таких как параметр этого метода, и я должен использовать их для создания предложения where... - person Flavio Alves; 19.11.2012
comment
о, теперь я вижу. разве вы не можете просто разделить набор входных тегов на отдельные определения? вместо tags = node({0}) попробуйте сначала разобрать массив входных тегов на отдельные начальные узлы - tag1=node({tagIds[0]}), tag2=node({tagIds[1]}), tag3=node ({tagIds[2]}), ... до конца tagId. чем сопоставлять узлы, как я писал выше (без предложения where/and). - person ulkas; 20.11.2012
comment
Я создал динамический запрос, следуя предложению @ulkas, и он работает! - person Flavio Alves; 26.11.2012

Я согласен с @ulkas

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

START tags = node({0}) 
MATCH experience-[:TAGGED]->tags
WITH experience, count(*) as cnt
WHERE cnt = length({0})
RETURN experience
person Michael Hunger    schedule 22.11.2012