2014-10-19 51 views
2

使用Neo4j 2.X和Cypher,我想查询我直接或通过朋友知道的所有UsersCypher /效率关系基数

我希望是这样的:

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) 

但想象一下,如果我想三度分离(知识)的...查询将是非常多余。

是否有一个很好的语法会导致一个非常有效的查询?
我应该使用什么?

+1

为什么第一个查询不起作用? – JohnMark13 2014-10-19 08:05:18

+0

我刚刚阅读文档,并没有发现这种模式,除了'shortestPath' ..我认为这个模式是专门用于'shortestPath'的。 – Mik378 2014-10-19 11:14:56

回答

3

我不确定我完全理解,我认为你的第一个查询会起作用吗?

MATCH (me:User{userId:123})-[:KNOWS*1..2]-(friend:User) 
WHERE me <> friend 
RETURN friend 

很难知道该怎么写的其他查询作为OWNS_BY和SOME_REL成分似乎无关的朋友组成的朋友,如果你可以用一个具体的例子涉及查询的两半,我可以解释一个最佳方法。

一些关键的指针,你应该

  1. 与你的想法会匹配最小节点集(约束是必须做的工作)的启动查询。
  2. 确保所有查询组件都使用标签和关系类型。
  3. 为将在查找中使用的属性创建索引。

查询优化的优秀资源是Wes Freeman's Pragmatic Optimisation

图的大小并不需要使查询更昂贵,因为您将主要工作在可能具有更多固定大小边界的子图上。当然,如果您的查询需要跨越整个图表,那么大小将成为速度问题!

+1

“OWNS_BY和SOME_REL组件似乎与朋友组件的朋友无关”=>的确,这只是一个示例。你写道:“用你认为符合最小节点集合的条件开始你的查询”。这意味着这个查询应该被拆分吗?:MATCH(a) - [:SOME_REL] - >(b)< - [:OWNS_BY] - (me:User(“123”)) - [:KNOWS * 1。 .2] - (朋友)我在哪里<>朋友RETURN朋友?如果我按如下方式分割:MATCH(a) - [:SOME_REL] - >(b)< - [:OWNS_BY] - (me:User(“123”)) MATCH(me) - [:KNOWS * 1..2] - (朋友:用户) 我在哪里<>朋友 RETURN friend',是否浪费了一些内存? – Mik378 2014-10-19 11:13:42

+1

感谢Wes的链接,我明白现在分裂的好处;)。 :以最小匹配(以返回节点的形式)开始,以便过滤整体,以便简化和缓解第二次匹配。 – Mik378 2014-10-19 11:59:16