Neo4j Cypher ручной индекс взаимосвязи, триггер APOC и дублирование данных 2 - PullRequest
0 голосов
/ 24 мая 2018

Продолжая следующий вопрос Индекс отношений Neo4j Cypher вручную, триггер APOC и дублирование данных Я создал сценарий, который воспроизводит проблему:

CALL apoc.trigger.add('TEST_TRIGGER', "UNWIND keys({assignedRelationshipProperties}) AS key 
UNWIND {assignedRelationshipProperties}[key] AS map 
WITH map 
WHERE type(map.relationship) = 'LIVES_IN' 
CALL apoc.index.addRelationship(map.relationship, keys(map.relationship)) 
RETURN count(*)", {phase:'before'})

CREATE (p:Person) SET p.id = 1 return p
CREATE (p:Person) SET p.id = 2 return p
CREATE (c:City) return c

MATCH (p:Person), (c:City) WHERE p.id = 1 CREATE (p)-[r:LIVES_IN]->(c) SET r.time = 10 RETURN type(r)
MATCH (p:Person), (c:City) WHERE p.id = 2 CREATE (p)-[r:LIVES_IN]->(c) SET r.time = 20 RETURN type(r)

Теперь давайте попробуем выбратьчеловек с r.time = 10:

MATCH (p:Person)-[r:LIVES_IN]->(c:City) 
CALL apoc.index.in(c, 'LIVES_IN', 'time:10') YIELD node AS person 
RETURN person

Приведенный выше запрос корректно возвращает только один узел.

Теперь давайте сделаем то же самое, но вернем число person:

MATCH (p:Person)-[r:LIVES_IN]->(c:City) 
CALL apoc.index.in(c, 'LIVES_IN', 'time:10') YIELD node AS person 
RETURN count(person)

Приведенный выше запрос возвращает count = 2.

Почему этот запрос возвращает count = 2 вместо одного узла?

Кроме того, следующий запрос:

MATCH (p:Person)-[r:LIVES_IN]->(c:City) 
CALL apoc.index.relationships('LIVES_IN', 'time:10') YIELD rel
RETURN rel

возвращает 2 отношения:

{
  "time": 10
}
{
  "time": 10
}

, но я ожидаю, что в ручном индексе будет только один, где time = 10.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Просто ваш пример запроса неверен, используйте это:

CALL apoc.index.relationships('LIVES_IN', 'time:10') YIELD rel
RETURN rel

или это

MATCH (c:City) 
CALL apoc.index.in(c, 'LIVES_IN', 'time:10') YIELD node AS person 
RETURN count(person)
0 голосов
/ 25 мая 2018

Первый запрос в вашем примере возвращает также две строки.Видимо, вы смотрите на результат в виде графика.Попробуйте или переключитесь в табличный режим, или измените запрос для этого:

MATCH (p:Person)-[r:LIVES_IN]->(c:City) 
CALL apoc.index.in(c, 'LIVES_IN', 'time:10') YIELD node AS person 
RETURN ID(person)

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

MATCH (p:Person)-[r:LIVES_IN]->(c:City)
WITH DISTINCT c
CALL apoc.index.in(c, 'LIVES_IN', 'time:10') YIELD node AS person 
RETURN COUNT(DISTINCT person)
...