我是Neo4j的新手,遇到了我需要的数据问题。我正致力于社交网络的可视化项目。我想根据根节点的id获取所有连接和关系(CONNECTED_TO),这样我就可以遍历数据并为D3构建数据结构。
我已尝试在浏览器中玩弄大量查询。当前的结果在浏览器中返回正确的结果并自动完成关闭,但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
答案 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