0
我有一个像节点(1) - >节点(2) - >节点(3)的树结构。我有一个名称作为用于检索节点的属性。给定节点say节点(3),我想检索节点(1)。在有向图中找到树的根
查询尝试:
MATCH(P:节点) - [:HAS *] - >(C:节点)WHERE c.name = “节点3” RETURN p LIMIT 5
但是,不能够获得节点1.
我有一个像节点(1) - >节点(2) - >节点(3)的树结构。我有一个名称作为用于检索节点的属性。给定节点say节点(3),我想检索节点(1)。在有向图中找到树的根
查询尝试:
MATCH(P:节点) - [:HAS *] - >(C:节点)WHERE c.name = “节点3” RETURN p LIMIT 5
但是,不能够获得节点1.
您的查询不仅会返回“节点1”,但它至少应包含一个包含它的路径。这是可能的筛选路径只得到了一个一路穿越到根,但是:
MATCH (c:Node {name: "node 3"})<-[:HAS*0..]-(p:Node)
// The root does not have any incoming relationship
WHERE NOT (p)<-[:HAS]-()
RETURN p
注意使用0长度的,它匹配所有的情况下,包括一个在起始节点是的根。有趣的事实:即使你在Node:name上有一个索引,它也不会被使用(除非你使用的是Neo4j 3.1,它至少在3.1 Beta2之后似乎是固定的),你必须明确地指定它。
MATCH (c:Node {name: "node 3"})<-[:HAS*0..]-(p:Node)
USING INDEX c:Node(name)
WHERE NOT (p)<-[:HAS]-()
RETURN p
第一查询使用PROFILE
(带有一个数字id
属性,而不是name
):
+-----------------------+----------------+------+---------+-------------------------+----------------------+
| Operator | Estimated Rows | Rows | DB Hits | Variables | Other |
+-----------------------+----------------+------+---------+-------------------------+----------------------+
| +ProduceResults | 0 | 1 | 0 | p | p |
| | +----------------+------+---------+-------------------------+----------------------+
| +AntiSemiApply | 0 | 1 | 0 | anon[23], c -- p | |
| |\ +----------------+------+---------+-------------------------+----------------------+
| | +Expand(All) | 1 | 0 | 3 | anon[58], anon[67] -- p | (p)<-[:HAS]-() |
| | | +----------------+------+---------+-------------------------+----------------------+
| | +Argument | 1 | 3 | 0 | p | |
| | +----------------+------+---------+-------------------------+----------------------+
| +Filter | 1 | 3 | 3 | anon[23], c, p | p:Node |
| | +----------------+------+---------+-------------------------+----------------------+
| +VarLengthExpand(All) | 1 | 3 | 5 | anon[23], p -- c | (c)<-[:HAS*]-(p) |
| | +----------------+------+---------+-------------------------+----------------------+
| +Filter | 1 | 1 | 3 | c | c.id == { AUTOINT0} |
| | +----------------+------+---------+-------------------------+----------------------+
| +NodeByLabelScan | 3 | 3 | 4 | c | :Node |
+-----------------------+----------------+------+---------+-------------------------+----------------------+
Total database accesses: 18
,并在第二个:
+-----------------------+----------------+------+---------+-------------------------+------------------+
| Operator | Estimated Rows | Rows | DB Hits | Variables | Other |
+-----------------------+----------------+------+---------+-------------------------+------------------+
| +ProduceResults | 0 | 1 | 0 | p | p |
| | +----------------+------+---------+-------------------------+------------------+
| +AntiSemiApply | 0 | 1 | 0 | anon[23], c -- p | |
| |\ +----------------+------+---------+-------------------------+------------------+
| | +Expand(All) | 1 | 0 | 3 | anon[81], anon[90] -- p | (p)<-[:HAS]-() |
| | | +----------------+------+---------+-------------------------+------------------+
| | +Argument | 1 | 3 | 0 | p | |
| | +----------------+------+---------+-------------------------+------------------+
| +Filter | 1 | 3 | 3 | anon[23], c, p | p:Node |
| | +----------------+------+---------+-------------------------+------------------+
| +VarLengthExpand(All) | 1 | 3 | 5 | anon[23], p -- c | (c)<-[:HAS*]-(p) |
| | +----------------+------+---------+-------------------------+------------------+
| +NodeUniqueIndexSeek | 1 | 1 | 2 | c | :Node(id) |
+-----------------------+----------------+------+---------+-------------------------+------------------+
Total database accesses: 13
抱起来,为什么不名称被查询中的索引自动使用?是否有影响Neo4j 3.0.x的错误? – InverseFalcon
@InverseFalcon我想是这样的(在基于成本的规划师),这不是我第一次添加一个明确的USING INDEX,当它应该选择它(这就是为什么我在这里检查)。 –
我想我已经看到了一个答案,然后提到标签集的大小可能与成本计划人员计算何时使用索引进行查找有关,我会尽量在稍后查找。可能是索引查找的好处可能更昂贵,或者可能无法为给定标签的小组节点提供任何显着增益的情况。 – InverseFalcon