将节点与cypher中子图的所有节点进行匹配

时间:2014-07-29 14:39:55

标签: neo4j cypher nodes matching subgraph

我对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"这是一个很大的数字。

你能帮帮我吗?

谢谢,祝你有愉快的一天!

1 个答案:

答案 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