【发布时间】:2019-04-12 07:19:05
【问题描述】:
我有这个数据库:
客户 => 事件 => 文件 => 文件名
客户有一个 ID 事件有一个 ID 和一个reportedOn 属性 文件具有 ID 和 fileSize、mimeType、恶意软件属性 文件名有一个 ID 客户端有一个传出边缘到事件(报告),事件有一个传出边缘到文件(包含文件),文件有一个传出边缘到文件名(hasName)。
这是一些示例数据:
g.addV('client').property('id','1').as('1').
addV('incident').property('id','11').property('reportedON', '2/15/2019 8:01:19 AM').as('11').
addV('file').property('id','100').property('fileSize', '432534').as('100').
addV('fileName').property('id','file.pdf').as('file.pdf').
addE('reported').from('1').to('11').
addE('containsFile').from('11').to('100').
addE('hasName').from('100').to('file.pdf').iterate()
在下面的 C# 代码中,我正在检查数据库中的每个文件名是否有特殊的文件扩展名。之后,我使用具有这些特殊文件扩展名的文件名来获取它们的所有值以及它们周围的顶点以及它们在 foreach 循环中的第二个查询中的值:
var resultSet = await SubmitQueryAsync("g.V().hasLabel('fileName')");
if (resultSet.Length > 0)
{
foreach (var result in resultSet)
{
JObject jsonData = result;
string fileId = jsonData["Id"].Value<string>();
string fileExtension = "";
string[] fileExtensions = { ".ace", ".arj", ".iso", ".rar", ".gz", ".acrj", ".lnk", ".z", ".tar", ".xz" };
HashSet<string> hSet = new HashSet<string>(fileExtensions);
if (fileId.Contains("."))
{
fileExtension = fileId.Substring(fileId.LastIndexOf('.'));
}
if (hSet.Contains(fileExtension))
{
var resultSet2 = await SubmitQueryAsync("g.V().has(id, '" + fileId + "').as('FILENAME').in('hasName').as('FILE').in('containsFile').as('INCIDENT').select('FILE').valueMap().as('FILEVALUES').select('INCIDENT').valueMap().as('INCIDENTVALUES').select('FILE', 'FILEVALUES', 'FILENAME', 'INCIDENTVALUES')");
list = FillList(list, resultSet2);
}
}
}
因此,对于每个具有特殊文件扩展名之一的文件名,我在 foreach 循环中执行一个查询。问题是对数据库的查询太多了。那么如何才能提高效率呢?
【问题讨论】: