原文链接:https://graphacademy.neo4j.com/courses/modeling-fundamentals/8-adding-intermediate-nodes/2-c-add-intermediate-node/
:Person
, :Movie
)。MERGE (p:Person {name: 'Tom Hanks'})
MERGE (m:Movie {title: 'Forrest Gump'})
MERGE (p)-[:ACTED_IN]->(m)
// MATCH (m:Movie {title: 'Forrest Gump'})
// DETACH DELETE m
Tom Hanks 作为演员出演了 Forrest Gump。
✅ 合适的建模:
MERGE (:Movie {title: 'Inception', released: 2010})
❌ 不推荐的建模(过度实体化):
MERGE (:Movie {title: 'Inception'})-[:RELEASED_IN]->(:Year {value: 2010})
您可以通过运行以下代码来验证是否已创建节点:
MATCH (n) RETURN n
ACTED_IN
, DIRECTED
, FOLLOWS
)。MERGE (:Person {name: 'Keanu Reeves'})-[:ACTED_IN {role: 'Neo'}]->(:Movie {title: 'The Matrix'})
例如:你能否快速查询“Keanu Reeves 演过哪些电影”?
MATCH (p:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(m:Movie)
RETURN m.title
重构前:
您可以使用关键字PROFILE
查看查询的性能。
PROFILE MATCH (p:Person)-[:ACTED_IN]-()
WHERE p.born < '1950'
RETURN p.name
在此查询的第一步中,我们看到返回了 5 行。 您可以想象,如果这是一个包含数百万个节点的满载图形,那么在步骤 1 中,它将需要检索大量 Person 节点,其中一些节点不是 actor。 优化此检索的一种方法是更改数据模型以包含 Person 节点的 Actor 标签。
重构后: 增加了 :Actor
标签:
MATCH (p:Person)
WHERE exists ((p)-[:ACTED_IN]-())
SET p:Actor
//使用重构后的查询
MATCH (p:Actor)
WHERE p.born < '1950'
RETURN p.name
“语义正交”是一个花哨的术语,意思是标签彼此无关。 您应该注意不要在不同的上下文中使用相同类型的标签。 例如,对所有类型的节点使用区域对于大多数查询没有用。
下面是一个示例,其中 Person 节点和 User 节点都标有区域。 如果没有区域对这两种类型的节点都很重要的使用案例, 对 Person 节点和 User 节点使用相同的标签没有帮助。
别这样: