我有一个循环子图。我想知道该子图中的所有关系。我不知道子图有多深,也不想硬编码任何关系类型。
到目前为止,我发现的最好的事情是由这个片段驱动的。
match(n:X)-[r*]->(m)
来自r
,我可以找到我需要的东西。但是,即使对于小子图,r*
的基数也可以是30k或更多。 Neo没有必要计算子图中的每条路径。我真的只需要节点或个人关系(首选)。
在子图中获取个人关系的方法是什么?我们正在使用Cypher。
答案 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
}