Neo4j Cypher 手动关系索引、APOC 触发器和数据复制2
Neo4j Cypher manual relationship index, APOC trigger and data duplication 2
继续下面的问题Neo4j Cypher manual relationship index, APOC trigger and data duplication我已经创建了重现问题的场景:
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)
现在,让我们尝试 select 拥有 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
上面的查询正确return只有一个节点。
现在,让我们做同样的事情,但是 return 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)
上面的查询 returns count = 2
.
为什么这个查询 returns count = 2
而不是单个节点?
此外,以下查询:
MATCH (p:Person)-[r:LIVES_IN]->(c:City)
CALL apoc.index.relationships('LIVES_IN', 'time:10') YIELD rel
RETURN rel
returns 2 关系:
{
"time": 10
}
{
"time": 10
}
但我希望手动索引中只有一个 time = 10
。
我做错了什么?
您示例中的第一个查询 returns 也是两行。显然,您以图表的形式查看结果。尝试或切换到 table 模式,或为此更改查询:
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)
只是你的查询示例是错误的,使用这个:
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)
继续下面的问题Neo4j Cypher manual relationship index, APOC trigger and data duplication我已经创建了重现问题的场景:
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)
现在,让我们尝试 select 拥有 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
上面的查询正确return只有一个节点。
现在,让我们做同样的事情,但是 return 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)
上面的查询 returns count = 2
.
为什么这个查询 returns count = 2
而不是单个节点?
此外,以下查询:
MATCH (p:Person)-[r:LIVES_IN]->(c:City)
CALL apoc.index.relationships('LIVES_IN', 'time:10') YIELD rel
RETURN rel
returns 2 关系:
{
"time": 10
}
{
"time": 10
}
但我希望手动索引中只有一个 time = 10
。
我做错了什么?
您示例中的第一个查询 returns 也是两行。显然,您以图表的形式查看结果。尝试或切换到 table 模式,或为此更改查询:
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)
只是你的查询示例是错误的,使用这个:
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)