我对Neo4j有一些乐趣,我需要知道如何找到与给定子图的每个节点有关系的节点。
让我们用一个例子解释一下:
(我的数据库中有大约15000个节点)
现在,给定子图(c1:Thing),(c2:Thing),...(cn:Thing) 我想知道所有不属于(c1),...,(cn)的节点,但它们与(c1),...,(cn)的每个节点有关系
换句话说,我会发现Cj存在关系: 的(C) - [R 1] - (C1) 。 。 。 的(C) - [RN] - (CN)
而j不在{1,......,n}
See this image to see an example
所以基本上我想要MATCH节点,比如c6,那些与子图的每个节点相连的节点(红色节点)。
注意:给定的子图可以有任意数量的节点(n是可变的)。
我的第一个想法是:
比赛(c1:事情) - [r1] - (建议:事情),(c2:事情) - [r2] - (建议:事情),....,(cn:Thing) - [rn] - (提示:物) WHERE c1.id = 1 AND ..... AND cn.id = n AND NOT(suggest.id IN [1,....,n]) 返回c1,r1,......,cn,rn,建议;
但是当我们有一个" n"这是一个很大的数字。
你能帮帮我吗?
谢谢,祝你有愉快的一天!
答案 0 :(得分:1)
以下是在对数据建模做出一些假设时解决问题的方法。
类似于这个的查询可能会得到你想要的东西:
MATCH p=(n:Thing)-[:RELATED_TO]->(n2), (suggest:Thing)
WHERE n <> n2 AND NOT suggest IN nodes(p) AND ALL (x IN nodes(p) WHERE (suggest)-[:RELATED_TO]->(x))
RETURN suggest
现在,假设感兴趣的子图(即c1到cn)通过相同的关系相关联。当然,您可以根据自己的喜好定义路径/子图,甚至可以更好地了解您的起点和终点,但您可能也可能没有这些信息。此外,如果您正在进行多长度路径/子图,请小心限制它们。如果您正在考虑多长度路径/子图,那么您将获得的结果可能不是唯一的。
另一个假设是(建议)与子图的每个节点具有相同的关系,并且与子图中的关系具有相同的类型。根据需要调整一下。
那就是说,这应该足以让你开始和/或思考正确的方向。与往常一样,您对数据建模的方式与编写查询的方式同样重要,如果不是更多的话。
HTH