У меня есть следующий запрос, который использует операции простого отношения для фильтрации узлов:
MATCH (dg:DecisionGroup)-[:CONTAINS]->(childD:Decision)
WHERE dg.id = 1
MATCH (childD)-[relationshipValueRel2:HAS_VALUE_ON]->(filterCharacteristic2:Characteristic)
WHERE filterCharacteristic2.id = 2
WITH relationshipValueRel2, childD, dg
WHERE (ANY (id IN [".NET"] WHERE id IN relationshipValueRel2.value ))
RETURN childD.name
, который возвращает только один узел (как и ожидалось):
"Candidate1"
Вывод PROFILE:
Я хотел бы оптимизировать производительность запроса, и поэтому я использую следующий триггер для добавлениясвязь с индексом вручную:
CALL apoc.trigger.add('HAS_VALUE_ON_ASSIGNED_RELATIONSHIP_PROPERTIES_TRIGGER', "UNWIND keys({assignedRelationshipProperties}) AS key
UNWIND {assignedRelationshipProperties}[key] AS map
WITH map
WHERE type(map.relationship) = 'HAS_VALUE_ON'
CALL apoc.index.addRelationship(map.relationship, keys(map.relationship)) RETURN true",
{phase:'before'})
и следующий запрос для получения тех же данных, что и первый, но только из индекса вручную:
MATCH (dg:DecisionGroup)-[:CONTAINS]->(childD:Decision)
WHERE dg.id = 1
MATCH (childD)-[relationshipValueRel2:HAS_VALUE_ON]->(filterCharacteristic2:Characteristic)
WHERE filterCharacteristic2.id = 2
WITH relationshipValueRel2, filterCharacteristic2, childD, dg
CALL apoc.index.in(filterCharacteristic2,'HAS_VALUE_ON','(value:(".NET"))')
YIELD node WITH node AS childD
RETURN childD.name
, но проблема заключается в, что этот запрос возвращает два экземпляра одного и того же узла:
"Candidate1"
"Candidate1"
Выход PROFILE:
Что я делаю не так и почему этот запрос возвращает 2 экземпляра вместо одного?