在Cypher中没有边缘

时间:2014-06-26 09:46:08

标签: neo4j cypher

如何在Cypher中表达以下内容

"返回所有节点,其中至少有一个类型A的传入边缘和传出边缘"。

最好的问候

2 个答案:

答案 0 :(得分:6)

您可以使用模式从结果子集中排除节点,如下所示:

MATCH ()-[:A]->(n) WHERE NOT (n)-->() RETURN n

答案 1 :(得分:0)

尝试

MATCH (n)
WHERE ()-[:A]->n AND NOT n-->()
RETURN n

MATCH ()-[:A]->(n)
WHERE NOT n-->()
RETURN DISTINCT n

修改

模式表达式既可用于模式匹配,也可用作过滤的谓词。如果在MATCH子句中使用,则回答模式的路径将包含在结果中。如果用于过滤,则在WHERE子句中,模式用作先前已匹配的路径的限制条件。结果是有限的,未扩展到包括过滤条件。当模式用作过滤的谓词时,该谓词的否定也是可用作过滤条件的谓词。没有路径可以回答模式的否定(如果存在这样的事情),那么在MATCH子句中不能使用模式的否定。短语

  

返回所有节点,其中至少有一个类型A的传入边缘,没有传出边

涉及节点n上的两种模式,即any incoming relationship [:A] on nany outgoing relationship on n。第二个必须被解释为谓词过滤条件的模式,因为它涉及否定not any outgoing relationship on n。但是,第一个可以解释为与n匹配的模式,或者解释为另一个模式谓词过滤条件。

这两种解释产生了上面的两个密码查询。第一个查询匹配所有节点,并使用两种模式过滤结果。第二个匹配n上的传入关系以及n,并使用第二个模式过滤结果。

第一个查询将在过滤发生前仅匹配每个节点一次。因此,它将为每个符合条件的节点返回一个结果项。对于每个路径,第二个查询将匹配模式any incoming relationship [:A] on n,即n上的每个传入关系一次。因此,它可能在结果中多次包含一个节点,因此DISTINCT关键字可以删除双精度数。

如果感兴趣的项目恰好是节点,那么在WHERE子句中使用两种模式作为谓词在我看来是正确的解释。它也更有效,因为它需要在[:A]上只找到零或一个传入的n来解析谓词。如果传入的关系也是有意义的,那么第二个查询的某个版本是正确的选择。人们需要绑定关系并对它做一些有用的事情,比如返回它。

以下是在' fresh'上执行的两个查询的执行计划。 neo4j console

First query:
----
Filter
  |
  +AllNodes

+----------+------+--------+-------------+------------------------------------------------------------------------------------------------------------------------------+
| Operator | Rows | DbHits | Identifiers |                                                                                                                        Other |
+----------+------+--------+-------------+------------------------------------------------------------------------------------------------------------------------------+
|   Filter |    0 |      0 |             | (nonEmpty(PathExpression((17)-[  UNNAMED18:A]->(n), true)) AND NOT(nonEmpty(PathExpression((n)-[  UNNAMED36]->(40), true)))) |
| AllNodes |    6 |      7 |        n, n |                                                                                                                              |
+----------+------+--------+-------------+------------------------------------------------------------------------------------------------------------------------------+

Second query:
----
Distinct
  |
  +Filter
    |
    +TraversalMatcher

+------------------+------+--------+-------------+--------------------------------------------------------------+
|         Operator | Rows | DbHits | Identifiers |                                                        Other |
+------------------+------+--------+-------------+--------------------------------------------------------------+
|         Distinct |    0 |      0 |             |                                                              |
|           Filter |    0 |      0 |             | NOT(nonEmpty(PathExpression((n)-[  UNNAMED30]->(34), true))) |
| TraversalMatcher |    0 |     13 |             |                                             n,   UNNAMED8, n |
+------------------+------+--------+-------------+--------------------------------------------------------------+