在我的数据库中,项目节点之间的连接是通过三向节点连接完成的,如下图突出显示的那样。我选择这种方式是因为我认为没有办法可以建立三向箭头或关系。
不管怎样,我不认为这个建模本身有问题。但我想以放弃
CREATED_BY
关系并将连接路径折叠为简单关系的方式查询该图。我如何在 Neo4j 中使用 Cypher 来做到这一点?
apoc.refactor.collapseNode
过程,但是,据我所知,它实际上会改变数据库?有没有办法仅用作查询?更不用说,就我而言,我将不得不以某种方式忽略折叠节点上的其他关系。
这是如何重现我所拥有的内容的示例:
// Users
// #1
CREATE (:User{name: "philippe_fanaro"});
CREATE (:User{name: "john_doe"});
// Items
// #1
MATCH (u:User{name: "john_doe"})
CREATE (u)-[:CREATED]->(:Item{title: "Designing Data-Intensive Applications"});
// #2
MATCH (u:User{name: "philippe_fanaro"})
CREATE (u)-[:CREATED]->(:Item{title: "System Design Interview – An insider's guide"});
// Connections
// #1
MATCH (i1:Item), (i2:Item), (u:User{name: "philippe_fanaro"})
WHERE i1.title CONTAINS "Designing"
AND i2.title CONTAINS "System"
CREATE (i1)- [:CONNECTION_ORIGIN]
->(c:Connection{title: "Relation"})
- [:CONNECTION_DESTINATION]->(i2),
(c)-[:CONNECTED_BY]->(u);
不确定您到底要查询什么以及想要结果是什么。但是,如果您想做类似于
apoc.refactor.collapseNode()
的操作,但作为虚拟路径而不是修改图形,那么也许这样的操作可以工作(此查询基于您在上面的示例中与 John Doe 和 Philippe 创建的节点和关系) Fanaro 并创建了一条从“设计”书到“系统”书的路径,具有名为“:CONNECTION”的虚拟关系)?
MATCH (n1)-[:CONNECTION_ORIGIN]->(r)-[:CONNECTION_DESTINATION]->(n2)
WITH n1, apoc.create.vRelationship(n1, "CONNECTION", {}, n2) AS rel
RETURN apoc.path.create(n1, [rel])