据我所知,没有办法在子图上创建可变长度的路径,也就是说你不能说明像(){-[:PUBLISH]->(:SERVICE)<-[:DEPENDSON]-}*()
这样的东西。
我复制你的样本数据集与此代码:
CREATE
(war1:WAR {name: 'war1'}),
(war2:WAR {name: 'war2'}),
(war3:WAR {name: 'war3'}),
(s1:SERVICE {name: 's1'}),
(s2:SERVICE {name: 's2'}),
(s3:SERVICE {name: 's3'}),
(war1)-[:PUBLISH]->(s1),
(war1)-[:PUBLISH]->(s2),
(war2)-[:DEPENDSON]->(s1),
(war2)-[:DEPENDSON]->(s2),
(war2)-[:PUBLISH]->(s3),
(war3)-[:DEPENDSON]->(s3)
如果这是可能在你的使用情况,您在图形中插入额外的边缘:
MATCH (w:WAR)-[:PUBLISH]->(s:SERVICE)<-[:DEPENDSON]-(otherWar:WAR)
MERGE (w)<-[:WAR_DEPENDS]-(otherWar)
,并使用这些遍历:
MATCH (w1:WAR)-[:WAR_DEPENDS*]->(w2:WAR)
RETURN w1, w2
这给:
╒════════════╤════════════╕
│w1 │w2 │
╞════════════╪════════════╡
│{name: war1}│{name: war2}│
├────────────┼────────────┤
│{name: war1}│{name: war3}│
├────────────┼────────────┤
│{name: war2}│{name: war3}│
└────────────┴────────────┘
如果你不想坚持这种优势,关键是要在一个查询中运行这个和不提交事务:
MATCH (w:WAR)-[:PUBLISH]->(s:SERVICE)<-[:DEPENDSON]-(otherWar:WAR)
MERGE (w)<-[:WAR_DEPENDS]-(otherWar)
WITH otherWar AS w1
MATCH (w1)-[:WAR_DEPENDS*]->(w2:WAR)
RETURN DISTINCT w1, w2
这又导致:
╒════════════╤════════════╕
│w1 │w2 │
╞════════════╪════════════╡
│{name: war2}│{name: war1}│
├────────────┼────────────┤
│{name: war3}│{name: war1}│
├────────────┼────────────┤
│{name: war3}│{name: war2}│
└────────────┴────────────┘
我认为这是一个很好的解决方案,但它看起来像你有:WAR_DEPENDS关系倒转。如果'w'发布'otherWar'所依赖的服务,则otherWar将依赖于w。 – InverseFalcon
@InverseFalcon非常感谢你指出 - 最后的查询也是错误的,因为我通过了'war'和'otherWar'并重用它们。这显然是错误的(它只提供直接连接),所以我修复并测试了查询。 –