在Neo子图中找到节点

时间:2015-11-30 21:04:22

标签: neo4j cypher

我有一个循环子图。我想知道该子图中的所有关系。我不知道子图有多深,也不想硬编码任何关系类型。

到目前为止,我发现的最好的事情是由这个片段驱动的。

match(n:X)-[r*]->(m)

来自r,我可以找到我需要的东西。但是,即使对于小子图,r*的基数也可以是30k或更多。 Neo没有必要计算子图中的每条路径。我真的只需要节点或个人关系(首选)。

在子图中获取个人关系的方法是什么?我们正在使用Cypher。

2 个答案:

答案 0 :(得分:1)

Cypher无法在不遵循路径的情况下获取子图中的所有关系。此外,它必须探索这些路径,以便弄清楚哪些节点和关系属于子图。

为了确保只在循环子图中获得一次关系,您可以这样做:

MATCH p=(:Foo)-[*]->()
WITH RELATIONSHIPS(p) AS ps
UNWIND ps AS p
RETURN DISTINCT p;

但是,请注意,没有上限的可变长度路径查询可能非常昂贵,并且可能会永远运行"永远"。

替代方法

如果您可以识别所需子图中的所有节点,那么可以采用更高效的方法。

例如,假设所需子图中的所有节点(以及那些节点)都具有标签X。在这种情况下,此快速查询将返回子图中的所有关系:

MATCH p=(:Foo)-[r]->()
RETURN r;

答案 1 :(得分:1)

您可以使用breadth first or depth first search without filter收集已连接组件中的所有节点。

neo4j REST API有一个遍历端点,可用于完成该操作。它不是Cypher查询,但它可以解决您的问题:http://neo4j.com/docs/stable/rest-api-traverse.html

对于节点,您可以POST这样的事情,有选项只能采用唯一的节点。不确定,但这可能有助于循环图。

{
  "order" : "breadth_first",
  "uniqueness" : "node_global",
  "return_filter" : {
    "language" : "builtin",
    "name" : "all"
    },
  "max_depth" : 20
}