2011-04-20 28 views
3

我正在将RDF数据加载到JUNG图中以进行一些分析。 所以我创建一个新的图:在JUNG图中表示RDF数据

DirectedGraph g = new DirectedSparseGraph<String,GraphLink>();

我创建了一个支持类用于指定的链接:

public class GraphLink { 
    String uri; 
    Float weight; 
} 

然后我填充它是这样的:

for each rdf triple <s,p,o>{ 
    g.addVertex(s) 
    g.addVertex(o) 

    GraphLink link = new GraphLink() 
    link.uri = pred 
    link.weight = some weight; 
    g.addEdge(link, s, o) 
} 

是这是一种有效的方法,或者有更好的方法? 边缘的表示是非常违反直觉的,但如果我这样做:

g.addEdge(p, s, o) 

我得到复制边缘的例外。

任何提示?

UPDATE:此代码似乎运作良好:

DirectedGraph<RDFNode,Statement> g = new DirectedSparseGraph<RDFNode,Statement>() 
// list all statements 
// TODO: pagination for very large graphs. 
assert m.size() < 10000000,"graph is too large." 
m.listStatements().each{ stm-> 
    RDFNode sub = stm.getSubject() 
    RDFNode obj = stm.getObject() 
    g.addVertex(sub) 
    if (includeLiterals || !obj.isLiteral()){ 
     g.addVertex(obj) 
     g.addEdge(stm, sub, obj, EdgeType.DIRECTED) 
    } 
} 

Mulone

回答

4

这可能不是你想要的所有东西,但你可以尝试JenaJung,报告提出了耶拿模型作为荣格图。

自述文件:

Model model = FileManager.get().loadModel("http://example.com/data.rdf"); 
Graph<RDFNode, Statement> g = new JenaJungGraph(model); 

Layout<RDFNode, Statement> layout = new FRLayout(g); 
layout.setSize(new Dimension(300, 300)); 
BasicVisualizationServer<RDFNode, Statement> viz = 
    new BasicVisualizationServer<RDFNode, Statement>(layout); 
+0

非常有用的,谢谢! – Mulone 2011-04-20 21:48:30