gpt4 book ai didi

neo4j - 将来自更多 MATCHes 的节点组合成单个变量

转载 作者:行者123 更新时间:2023-12-02 07:30:33 25 4
gpt4 key购买 nike

使用 neo4j 社区版 2.x。在 Cypher 中,我需要以(两种)不同的方式匹配节点,然后将这些(两)组匹配的节点组合成一组(一个变量名)。然后该集合将用于进一步的操作。

naive graph example (我不能发布图片)

我想找到松鼠的所有知识,包括她所属的组共享的知识。 (例子是虚构的)

我想象的是这样的:

MATCH (u:User{username:'squirrel'}), (:User{username:'squirrel'})<-[:MEMBER]-(g:Group)
WITH "COMBINATION OF u AND g" AS ug
MATCH (ug)-[:KNOW_HOW]->(k:Knowledge)
RETURN k.type

结果应该是“破解坚果”和“逃脱捕食者”。

在“组合 u 和 g”的地方,我尝试了 collect(u)+collect(g)、EXTRACT 等变体。但没有成功。

到目前为止,我发现的最简单的工作方式是使用 UNION。

MATCH (u:User{username:'squirrel'})-[:KNOW_HOW]->(k:Knowledge)
RETURN k.type
UNION
MATCH (u:User{username:'squirrel'})<-[:MEMBER]-(:Group)-[:KNOW_HOW]->(k:Knowledge)
RETURN k.type

这可能会解决这个简单的示例,但不适用于更复杂的查询。我寻求更一般问题的解决方案:匹配几组节点,将它们粘合成单个集合(单个变量)并继续这个新集合。

有什么想法吗?我错过了一些基本的东西吗?或者这是不可能的?谢谢!

grokbase 上可能有类似内容.

编辑:

this hacky solution to similar question我能够通过从节点集合中提取内部 ID 来解决问题:

MATCH (u:User{username:'squirrel'}), (:User{username:'squirrel'})<-[:MEMBER]-(g:Group)
WITH [x in collect(u)+collect(g)|id(x)] as collectedIds MATCH (ug) WHERE id(ug) in collectedIds
MATCH (ug)-[:KNOW_HOW]->(k:Knowledge)
RETURN k.type

还能做得更好吗?

最佳答案

至少从 Neo4j 3.0 开始,您可以使用可变长度模式匹配来解决这个问题。只需将最小长度显式设置为 0 并将标签测试移动到单独的 WHERE 子句:

MATCH (:User {username:'squirrel'}) <-[:MEMBER*0..1]- (ug)
WHERE ug:User OR ug:Group
WITH ug
MATCH (ug)-[:KNOW_HOW]->(k:Knowledge)
RETURN k.type

关于neo4j - 将来自更多 MATCHes 的节点组合成单个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22239053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com