【发布时间】:2019-10-29 06:41:36
【问题描述】:
我正在尝试从原始图构建一个子图,场景如下
这里的节点 b 和 C 与节点 A 相连。我想要的输出是如果两个节点与一个公共节点相连,那么它们是相连的。如何使用 neo4j 或 networkX 解决这个问题?我的重点是用于密码查询的 neo4j,但它们也有 networkX 绑定。我正在使用 python 来开发这个解决方案。
【问题讨论】:
我正在尝试从原始图构建一个子图,场景如下
这里的节点 b 和 C 与节点 A 相连。我想要的输出是如果两个节点与一个公共节点相连,那么它们是相连的。如何使用 neo4j 或 networkX 解决这个问题?我的重点是用于密码查询的 neo4j,但它们也有 networkX 绑定。我正在使用 python 来开发这个解决方案。
【问题讨论】:
你有这样的想法吗?
为了方便可能的进一步答案和解决方案,我记下了我的图表创建声明:
CREATE
(nodeA:Node {name:'Node A'}),
(nodeB:Node {name:'Node B'}),
(nodeC:Node {name:'Node C'}),
(nodeD:Node {name:'Node D'}),
(nodeE:Node {name:'Node E'}),
(nodeF:Node {name:'Node F'}),
(nodeA)-[:CONNECTED]->(nodeB),
(nodeA)-[:CONNECTED]->(nodeC),
(nodeC)-[:CONNECTED]->(nodeD),
(nodeD)-[:CONNECTED]->(nodeE),
(nodeD)-[:CONNECTED]->(nodeF);
MATCH
path = (sourceNode:Node)<-[:CONNECTED]-(:Node)-[:CONNECTED]->(targetNode:Node)
WHERE
id(sourceNode)<id(targetNode)
RETURN
sourceNode, targetNode;
第二行描述了两个节点之间有一个公共节点的模式,而第四行只过滤了一个方向的结果对。
╒═════════════════╤═════════════════╕
│"sourceNode" │"targetNode" │
╞═════════════════╪═════════════════╡
│{"name":"Node B"}│{"name":"Node C"}│
├─────────────────┼─────────────────┤
│{"name":"Node E"}│{"name":"Node F"}│
└─────────────────┴─────────────────┘
以下 Cypher 查询通过依赖节点之间的直接关系 (NEW_CONNECTED) 丰富您现有的图表。
MATCH
path = (sourceNode:Node)<-[:CONNECTED]-(:Node)-[:CONNECTED]->(targetNode:Node)
WHERE
id(sourceNode)<id(targetNode)
MERGE
(sourceNode)<-[:NEW_CONNECTED]-(targetNode);
【讨论】: