繁体   English   中英

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

[英]Cypher, get all nodes with and relationships for a given label without duplicates, empty relationships or empty nodes

我是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子句时,它仅返回根Connection及其直接连接,而没有所有关系

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

具有约200个Connections和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

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

当使用具有可变长度关系的MATCH时,将探索所有路径,这将导致冗余关系的建立,并可能在足够大的网络上崩溃。

APOC过程通过其路径扩展过程可以有效地扩展子图的所有节点。 一旦我们拥有网络中的所有连接节点,我们就可以在它们所连接的节点上进行匹配,并输出两个节点以及连接关系。

同样,从您对空关系的描述中,听起来似乎很少有这些关系具有属性。 没有属性的关系的文本输出是一个空映射{},尽管在代码本身中,应该有可用的关系ID和类型数据。

如果确实要显式返回关系的类型及其属性,则可以使用地图投影将关系的类型及其其余属性包括在内。

完整查询可能如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM