我做了很多研究,但找不到以下问题的简单解决方案。
我有一个 OrientDB 数据库,它有一个“MaltegoLink”类。MaltegoLink 有一个唯一索引以避免重复。
脚本本身遵循以下想法:
self.client = pyorient.OrientDB(host, port)
self.client.db_open( database, username, password )
maltego_links = [{"source": "n1", target: "n2"}, {"source": "n2", target: "n1"}]
sql_batch = "begin;"
for link in maltego_links:
sql_batch += "CREATE EDGE MaltegoLink FROM (SELECT FROM MaltegoEntity WHERE id='%s') TO (SELECT FROM MaltegoEntity WHERE id='%s');" % (link["source"], link["target"])
self.client.batch(self.sql_batch + "commit;")
这个想法是通过将其作为批处理来加速对数据库的插入。
还有问题本身: 当存在重复边时,如何进行批量查询并跳过数据库提供的错误?
据我所知,OrientDB SQL 语法中没有允许在发生错误时继续的命令。
编辑:
好的,终于自己找到了某种解决方法。该方法增加了执行时间,但它仍然是有益的:
LET t = SELECT FROM MaltegoLink WHERE in IN (SELECT FROM MaltegoEntity WHERE maltego_id="n1") AND out IN (SELECT FROM MaltegoEntity WHERE id="n2");
IF ( $t.size() == 0 ) {
LET b = CREATE EDGE MaltegoLink FROM (SELECT FROM MaltegoEntity WHERE maltego_id="n2") TO (SELECT FROM MaltegoEntity WHERE maltego_id="n1");
}