最后我决定了Gephi 0.9。问题是这个版本的应用程序没有与Neo4j服务器的驱动程序一起提供,所以我必须创建它并使该应用程序适应这个新驱动程序。
这里是改变我没有,
1)模块DBDrivers.-
我创建的驱动器,用于Neo4j的服务器如下,
package org.gephi.io.database.drivers;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Jose Alvarez de Lara
*/
public class Neo4jDriver implements SQLDriver {
public Neo4jDriver() {
try {
// load the Neo4j-JDBC driver using the current class loader
Class.forName("org.neo4j.jdbc.Driver");
} catch (ClassNotFoundException ex) {
Logger.getLogger(Neo4jDriver.class.getName()).log(Level.SEVERE, null, ex);
}
}
public Connection getConnection(String connectionUrl, String username, String passwd) throws SQLException {
return DriverManager.getConnection(connectionUrl, null, null);
}
@Override
public String getPrefix() {
return "neo4j";
}
@Override
public String toString() {
return "Neo4j";
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Neo4jDriver) {
return ((Neo4jDriver) obj).getPrefix().equals(getPrefix());
} else {
return false;
}
}
@Override
public int hashCode() {
return getPrefix().hashCode();
}
}
2)模块ImportPluginUI。 -
我在EdgeListPanel的代码中做了一些改变。 Java类文件女巫是如下,
在我添加的Neo4j延伸的构造,
public EdgeListPanel() {
databaseManager = new EdgeListDatabaseManager();
initComponents();
driverComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent ie) {
initDriverType((SQLDriver) ie.getItem());
}
});
browseButton.setVisible(false);
browseButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
String lastPath = NbPreferences.forModule(EdgeListPanel.class).get(LAST_PATH, "");
final JFileChooser chooser = new JFileChooser(lastPath);
chooser.setAcceptAllFileFilterUsed(false);
chooser.setDialogTitle(NbBundle.getMessage(EdgeListPanel.class, "EdgeListPanel.sqliteFileChooser.title"));
DialogFileFilter dialogFileFilter = new DialogFileFilter(NbBundle.getMessage(EdgeListPanel.class, "EdgeListPanel.sqliteFileChooser.filefilter"));
dialogFileFilter.addExtension("sqlite");
dialogFileFilter.addExtension("neo4j"); //add extensión for neo4j
dialogFileFilter.addExtension("db");
chooser.addChoosableFileFilter(dialogFileFilter);
int returnFile = chooser.showSaveDialog(null);
if (returnFile != JFileChooser.APPROVE_OPTION) {
return;
}
File file = chooser.getSelectedFile();
hostTextField.setText(file.getAbsolutePath());
//Save last path
NbPreferences.forModule(EdgeListPanel.class).put(LAST_PATH, file.getParentFile().getAbsolutePath());
}
});
}
在initDriverType()方法我启用Neo4j的面板,
private void initDriverType(final SQLDriver driver) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (driver != null && driver.getPrefix().equals("sqlite")) {
hostLabel.setText(NbBundle.getMessage(EdgeListPanel.class, "EdgeListPanel.fileLabel.text"));
portTextField.setEnabled(false);
portLabel.setEnabled(false);
dbLabel.setEnabled(false);
dbTextField.setEnabled(false);
userLabel.setEnabled(false);
userTextField.setEnabled(false);
pwdLabel.setEnabled(false);
pwdTextField.setEnabled(false);
pwdTextField.setText("");
userTextField.setText("");
dbTextField.setText("");
portTextField.setText("");
browseButton.setVisible(true);
} else if (driver != null && driver.getPrefix().equals("neo4j")) {
hostLabel.setText(NbBundle.getMessage(EdgeListPanel.class, "EdgeListPanel.hostLabel.text"));
portTextField.setEnabled(true);
portLabel.setEnabled(true);
dbLabel.setEnabled(false);
dbTextField.setEnabled(false);
userLabel.setEnabled(false);
userTextField.setEnabled(false);
pwdLabel.setEnabled(false);
pwdTextField.setEnabled(false);
pwdTextField.setText("");
userTextField.setText("");
dbTextField.setText("");
browseButton.setVisible(false);
} else {
hostLabel.setText(NbBundle.getMessage(EdgeListPanel.class, "EdgeListPanel.hostLabel.text"));
portTextField.setEnabled(true);
portLabel.setEnabled(true);
dbLabel.setEnabled(true);
dbTextField.setEnabled(true);
userLabel.setEnabled(true);
userTextField.setEnabled(true);
pwdLabel.setEnabled(true);
pwdTextField.setEnabled(true);
browseButton.setVisible(false);
}
group.validateAll();
}
});
}
以下方法是一个更通用的方法,然后是旧的isSqlite(),因为它允许我传递任何我需要的前缀。在这种情况下,它们应该是“源码”和“Neo4j的”
private static boolean isValidDriverPrefix(EdgeListPanel panel, String prefix) {
if (panel.databaseManager.getEdgeListDatabases().size() > 0) {
if (panel.databaseManager.getEdgeListDatabases().get(0).getSQLDriver().getPrefix().equals(prefix)) {
return true;
}
return false;
} else if (panel.getSelectedSQLDriver().getPrefix().equals(prefix)) {
return true;
}
return false;
}
我用它在以下内部类这一块,
private static class HostOrFileValidator implements Validator<String> {
private EdgeListPanel panel;
public HostOrFileValidator(EdgeListPanel panel) {
this.panel = panel;
}
@Override
public boolean validate(Problems problems, String compName, String model) {
if (isValidDriverPrefix(panel, "sqlite")) {
return Validators.FILE_MUST_BE_FILE.validate(problems, compName, model);
} else {
return Validators.REQUIRE_NON_EMPTY_STRING.validate(problems, compName, model);
}
}
}
private static class NotEmptyValidator implements Validator<String> {
private EdgeListPanel panel;
public NotEmptyValidator(EdgeListPanel panel) {
this.panel = panel;
}
@Override
public boolean validate(Problems problems, String compName, String model) {
if (isValidDriverPrefix(panel, "sqlite") || isValidDriverPrefix(panel, "neo4j")) {
return true;
} else {
return Validators.REQUIRE_NON_EMPTY_STRING.validate(problems, compName, model);
}
}
}
private static class PortValidator implements Validator<String> {
private EdgeListPanel panel;
public PortValidator(EdgeListPanel panel) {
this.panel = panel;
}
@Override
public boolean validate(Problems problems, String compName, String model) {
if (isValidDriverPrefix(panel, "sqlite")) {
return true;
} else {
return Validators.REQUIRE_NON_EMPTY_STRING.validate(problems, compName, model)
&& Validators.REQUIRE_VALID_INTEGER.validate(problems, compName, model)
&& Validators.numberRange(1, 65535).validate(problems, compName, model);
}
}
}
3)模块ImportPlugin.-
在这个模块中,我不得不修改类文件ImporterEdgeList.java,改变方法getNodes()和getEdges(),因为它们在实现Neo4j图形数据库时抛出了NullPointerException。这真的很简单,
private void getNodes(Connection connection) throws SQLException {
//Factory
ElementDraftFactory factory = container.factory();
//Properties
PropertiesAssociations properties = database.getPropertiesAssociations();
Statement s = connection.createStatement();
ResultSet rs = null;
try {
rs = s.executeQuery(database.getNodeQuery());
} catch (SQLException ex) {
report.logIssue(new Issue("Failed to execute Node query", Issue.Level.SEVERE, ex));
return;
}
findNodeAttributesColumns(rs);
ResultSetMetaData metaData = rs.getMetaData();
int columnsCount = metaData.getColumnCount();
int count = 0;
while (rs.next()) {
String id = null;
for (int i = 0; i < columnsCount; i++) {
String columnName = metaData.getColumnLabel(i + 1);
NodeProperties p = properties.getNodeProperty(columnName);
if (p != null) { //Here p could be null
if (p.equals(NodeProperties.ID)) {
String ide = rs.getString(i + 1);
if (ide != null) {
id = ide;
}
}
}
}
NodeDraft node;
if (id != null) {
node = factory.newNodeDraft(id);
} else {
node = factory.newNodeDraft();
}
for (int i = 0; i < columnsCount; i++) {
String columnName = metaData.getColumnLabel(i + 1);
NodeProperties p = properties.getNodeProperty(columnName);
if (p != null) {
injectNodeProperty(p, rs, i + 1, node);
} else {
//Inject node attributes
ColumnDraft col = container.getNodeColumn(columnName);
injectElementAttribute(rs, i + 1, col, node);
}
}
// injectTimeIntervalProperty(node);
container.addNode(node);
++count;
}
rs.close();
s.close();
}
private void getEdges(Connection connection) throws SQLException {
//Factory
ElementDraftFactory factory = container.factory();
//Properties
PropertiesAssociations properties = database.getPropertiesAssociations();
Statement s = connection.createStatement();
ResultSet rs = null;
try {
rs = s.executeQuery(database.getEdgeQuery());
} catch (SQLException ex) {
report.logIssue(new Issue("Failed to execute Edge query", Issue.Level.SEVERE, ex));
return;
}
findEdgeAttributesColumns(rs);
ResultSetMetaData metaData = rs.getMetaData();
int columnsCount = metaData.getColumnCount();
int count = 0;
while (rs.next()) {
String id = null;
for (int i = 0; i < columnsCount; i++) {
String columnName = metaData.getColumnLabel(i + 1);
EdgeProperties p = properties.getEdgeProperty(columnName);
if (p != null) { //Here p could be null
if (p.equals(EdgeProperties.ID)) {
String ide = rs.getString(i + 1);
if (ide != null) {
id = ide;
}
}
}
}
EdgeDraft edge;
if (id != null) {
edge = factory.newEdgeDraft(id);
} else {
edge = factory.newEdgeDraft();
}
for (int i = 0; i < columnsCount; i++) {
String columnName = metaData.getColumnLabel(i + 1);
EdgeProperties p = properties.getEdgeProperty(columnName);
if (p != null) {
injectEdgeProperty(p, rs, i + 1, edge);
} else {
//Inject edge attributes
ColumnDraft col = container.getEdgeColumn(columnName);
injectElementAttribute(rs, i + 1, col, edge);
}
}
// injectTimeIntervalProperty(edge);
container.addEdge(edge);
++count;
}
rs.close();
s.close();
}
就这样。
这些变化后的Gephi 0.9针对Neo4j 2.1.8电影数据库和Neo4j 2.3.0-M01的同一个示例数据库在不需要验证时进行测试。
希望它有帮助!
是否进口graphdb工作? –
是的,这是一种可能性,但我应该需要Neo4j的驱动程序。谢谢,让我试试看。 – oggie0563