2015-03-02 34 views
1

让我们假设我们有这个简单的模式:Neo4J/Cypher:是否有可能在where子句中过滤路径的长度?

p=(a)-[r]-(b) 

,其中节点A和B都有自己的特性已经在WHERE子句中(设置如:电影,a.title =“黑客帝国”和B:电影)。 我想在WHERE子句中添加另一个条件样

LEGHT(p) =2 OR LENGTH(p)>6 

(不正确的语法,我知道)

据我所知,这是不可能性指定路径的长度在语法[r * min..max]的MATCH子句中,但不包括我正在寻找的情况。

任何帮助,将不胜感激=)

回答

2

是的,这可以在neo4j中工作,完全按照您的指定。

样本数据:

create (a:Foo)-[:stuff]->(b:Foo)-[:stuff]->(c:Foo); 

然后此查询:仅

MATCH p=(x:Foo)-[:stuff*]->(y:Foo) 
WHERE length(p)>1 RETURN p; 

返回从a->b->c而不是任何一个步路径(a->bb->c)2步路径

+0

我已经试过用简单的电影数据库Neo4J提供的方法。虽然它只有有限数量的节点/关系,但它陷入了“正在执行查询...”。我在寻找更坚实的东西。 – fgiacc 2015-03-02 16:54:52

+1

您应该对源节点和目标节点施加严格的限制。如果你一般这样做,比如'MATCH(a) - [b] - >(c)',那么你的查询必须匹配**整个数据库**中的每一个可能的路径。这个数字会非常高,并且您的查询需要很长时间。 – FrobberOfBits 2015-03-02 17:12:39

+0

是的,这应该工作。这里的问题在于,严格限制将取决于用户,我不能预见它是否足够聪明,因此=) – fgiacc 2015-03-02 17:24:28

0

这是否对你的工作?

MATCH p=(a)-[r*2..]-(b) 
WHERE LENGTH(r) = 2 OR LENGTH(r) > 6 
RETURN p 

注意用大DB此查询可能需要很长的时间,还是没有完成,因为MATCH条款不设置上限的路径长度。

+0

这是我所害怕的。 我正在创建一个用于构建密码查询的UI,并且将其他路径(例如节点标签,关系类型等)的路径属性设置为“legth”。用户应该有可能决定路径长度是否应该是=,<,<=,>,> =指定的数量。我现在想象我不得不重新考虑那个...... – fgiacc 2015-03-02 17:08:28