Cypher,获取给定标签的所有节点和关系,无需重复,空关系或空节点

时间:2017-02-16 22:54:37

标签: d3.js neo4j cypher

我是Neo4j的新手,遇到了我需要的数据问题。我正致力于社交网络的可视化项目。我想根据根节点的id获取所有连接和关系(CONNECTED_TO),这样我就可以遍历数据并为D3构建数据结构。

Current Schema Image

我已尝试在浏览器中玩弄大量查询。当前的结果在浏览器中返回正确的结果并自动完成关闭,但NodeJS中返回的结果将返回重复项和空关系。

MATCH p=(a:Connection)-[r:CONNECTED_TO]-(b:Connection)-[r2:CONNECTED_TO]-()
WHERE id(a) = 1673
RETURN [a, b] as nodes [r, r2]

下面的语句返回我想要的东西,它没有WHERE子句。添加where子句时,它只返回根连接及其没有所有关系的直接连接

MATCH (a:Connection)-[r:CONNECTED_TO]-(b:Connection)
RETURN [a, b] AS nodes, r AS relationship

媒体的数据集,有大约200个连接和2200个关系,所以性能也是要记住的。

任何帮助都会非常值得赞赏。

更新

InverseFalcon建议的APOC路径扩展程序运行良好。与使用可变长度关系相比,它非常有效。

这是查询结果

MATCH (head:Connection)
WHERE id(head) = 1673
CALL apoc.path.expandConfig(head, {relationshipFilter:'CONNECTED_TO', uniqueness:'NODE_GLOBAL', bfs: true}) YIELD path
WITH LAST(NODES(path)) as a
MATCH (a)-[r:CONNECTED_TO]->(b)
RETURN [a, b] as nodes, r as relationship

1 个答案:

答案 0 :(得分:0)

听起来您想要为用户找到整个网络,然后从网络中的那些节点输出通过:CONNECTED_TO关系连接的每个节点配对。

当使用带有variable-length relationships的MATCH时,将探索所有路径,这将导致冗余关系的累积,并且可能在足够大的网络上爆炸。

APOC程序有一种有效的方法来扩展子图的所有节点及其path expansion procedure。一旦我们拥有了网络中的所有连接节点,我们就可以匹配它们所连接的节点,并输出这两个节点以及连接关系。

此外,根据您对空关系的描述,如果这些关系中的任何一个具有属性,则听起来很少。没有属性的关系的文本输出是一个空映射{},尽管在代码本身中,应该有关系id和类型数据可用。

如果您确实希望显式返回关系类型及其属性,可以使用map projection包含关系类型及其余属性。

完整查询可能如下所示:

MATCH (head:Connection)
WHERE id(head) = 1673
CALL apoc.path.expandConfig(head, {relationshipFilter:'CONNECTED_TO>', uniqueness:'NODE_GLOBAL'}) YIELD path
WITH LAST(NODES(path)) as a
MATCH (a)-[r:CONNECTED_TO]->(b)
RETURN [a, b] as nodes, r {TYPE(r), .*} as relationship