【问题标题】:neo4j improving cypher query performanceneo4j 提高密码查询性能
【发布时间】:2018-12-05 13:27:09
【问题描述】:

我有items 图形数据库。每个item连接多个properties,可以被多个items共享。 我添加了一个由少数properties 定义的search 节点。

所以我有(search_node)连接到多个(properties_nodes)连接到多个(items_nodes)

现在我想通过 {x} 个属性或更多属性获取回答此搜索的项目列表。按匹配属性的数量排序。

start se=node:node_auto_index(name = {name}), pr = node:node_auto_index(type="item_property")
MATCH p=(se) -[rt:SEARCH]- > (pr)<-[r]-(item)
WHERE Has(item.type) and (item.type = "item")
WITH item, collect(distinct pr.name) as rs
where length(rs) > {x}
RETURN item.name as item_name, length(rs) as matching_properties
ORDER BY  matching_properties desc 

对我来说,性能问题是它会搜索所有匹配的项目,甚至那些只匹配一个属性的项目,然后删除所有匹配小于 {x} 的项目。 如果 {x} 大于 1,那就太浪费了。

如何仅通过 {x} 个匹配属性来“匹配”?

创建了一个匹配的样本:http://console.neo4j.org/?id=adrgsh

(neo4j 版本 1.9.2)

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    恕我直言,要仅匹配具有 > x 属性的项目,您仍然需要找到所有与搜索节点具有共同属性的项目。发布后,您可以过滤掉具有

    您可以简化您的查询(控制台上的匹配结果,但可能会丢失一些未在此问题中指定的详细信息)

    START se=node(11) 
    MATCH (se)-[:SEARCH]- >(pr)<-[:HAS]-(item) 
    WHERE HAS (item.type) AND (item.type = "item") 
    WITH count(pr) AS matching_properties, item 
    WHERE matching_properties>1 
    RETURN item.name AS item_name, matching_properties 
    ORDER BY matching_properties DESC
    

    【讨论】:

    • 现在,我正在测试一个包含 5000 个项目的数据集。对于某些“搜索”,我可以有 500 个回答一个属性,但只有 50 个回答两个或更多属性。这个统计数据对我不利。如果我扩大规模,它的性能会很差,因为通常我需要多个匹配的属性。
    • 我同意 Luanne,你能在足够大的数据集上测试 Luannes 查询建议,看看它的表现如何?
    • 现在,我在 EC2 Micro 实例上运行,这是一台非常“弱”的机器。因此,即使是对 5000 个数据集的查询,也需要 3 - 4 秒。我正在使用neo4j for node js来查询数据库...
    • 两个查询同时返回?
    • 这项改进确实将性能提高了 0.5 秒至 1 秒。不幸的是,由于几个技术原因,性能不断变化,但仍然很慢。如果确定的答案是我不能将搜索的“匹配”部分限制为仅匹配搜索的 {x} 属性的那些项目,那么我会批准这个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2013-09-29
    • 2013-08-03
    相关资源
    最近更新 更多