我有一个存储在Neo4j中的大型网络.基于特定的根节点,我想提取该节点周围的子图并将其存储在其他地方.所以,我需要的是符合我的过滤条件的节点和边的集合.
Afaik没有开箱即用的解决方案.有一个图形匹配组件可用,但它只适用于完美匹配.Neo4j API本身只定义了图遍历,我可以用它来定义应该访问哪些节点/边:
Traverser exp = Traversal
.description()
.breadthFirst()
.evaluator(Evaluators.toDepth(2))
.traverse(root);
Run Code Online (Sandbox Code Playgroud)
现在,我可以将所有节点/边添加到所有路径的集合中,但这是非常低效的.你会怎么做?谢谢!
编辑将每个遍历的最后一个节点和最后一个关系添加到子图中是否有意义?
我通过基于所有遍历端点构造诱导子图来解决这个问题。
从每次遍历的最后一个节点和边的集合构建子图不起作用,因为不包括不属于任何最短路径的边。
代码片段如下所示:
Set<Node> nodes = new HashSet<Node>();
Set<Relationship> edges = new HashSet<Relationship>();
for (Node n : traverser.nodes())
{
nodes.add(n);
}
for (Node node : nodes)
{
for (Relationship rel : node.getRelationships())
{
if (nodes.contains(rel.getOtherNode(node)))
edges.add(rel);
}
}
Run Code Online (Sandbox Code Playgroud)
每条边都添加两次。一次用于传出节点,一次用于传入节点。使用 Set,我可以确保它只在集合中出现一次。
可以仅迭代传入/传出边缘,但尚不清楚如何处理循环(从节点到其自身的边缘)。他们属于哪一类?这个片段不存在这个问题。
| 归档时间: |
|
| 查看次数: |
5911 次 |
| 最近记录: |