使用Neo4j 2.X和Cypher,我想查询我直接或通过朋友知道的所有Users
。Cypher /效率关系基数
我希望是这样的:
MATCH (me:User("123"))-[:KNOWS*1..2]-(friend) //does not work of course
我想想shortestPath
功能,但不会是太贵了?
而且,如果我有这个疑问:
MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123")) // would load the whole in memory before filtering by knowledge !
WITH shortestPath((me)-[:KNOWS*..2]-(friend)) as path
WHERE path.length <= 2
OR
MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123")) // would load the whole in memory before filtering by knowledge !
MATCH path = shortestPath((me)-[:KNOWS*..2]-(friend))
WHERE path.length <= 2
那岂不是更多(也许太庞大图的情况下?)贵吗?
事实上,这将是更好的,如果它的工作:
MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123"))-[:KNOWS*1..2]-(friend)
加载在内存中只有合适的路径。
我也可以用这样的一种替代方案:
OPTIONAL MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123"))-[:KNOWS]-(friend)
OPTIONAL MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123"))-[:KNOWS]-()-[:KNOWS]-(friend)
但想象一下,如果我想三度分离(知识)的...查询将是非常多余。
是否有一个很好的语法会导致一个非常有效的查询?
我应该使用什么?
为什么第一个查询不起作用? – JohnMark13 2014-10-19 08:05:18
我刚刚阅读文档,并没有发现这种模式,除了'shortestPath' ..我认为这个模式是专门用于'shortestPath'的。 – Mik378 2014-10-19 11:14:56