Neo4j 关于关系基数的Cypher/Efficiency

Neo4j 关于关系基数的Cypher/Efficiency,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,使用Neo4j 2.X和Cypher,我想查询所有直接或通过朋友认识的用户 我希望这样: MATCH (me:User("123"))-[:KNOWS*1..2]-(friend) //does not work of course 我考虑了最短路径功能,但它不是太贵了吗 此外,如果我有这个问题: MATCH (a)-[:SOME_REL]->(b)<-[:OWNS_BY]-(me:User("123")) // would load the whole in memory

使用Neo4j 2.X和Cypher,我想查询所有直接或通过朋友认识的
用户

我希望这样:

MATCH (me:User("123"))-[:KNOWS*1..2]-(friend)  //does not work of course
我考虑了
最短路径
功能,但它不是太贵了吗

此外,如果我有这个问题:

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

MATCH(a)-[:SOME_REL]->(b)我不确定自己是否完全理解,我想您的第一个查询是否可行

MATCH (me:User{userId:123})-[:KNOWS*1..2]-(friend:User)
WHERE me <> friend
RETURN friend
MATCH(me:User{userId:123})-[:KNOWS*1..2](朋友:User)
我的朋友在哪里
交友

很难知道为其他查询编写什么,因为OWNS\u BY和一些\u REL组件似乎与friend of friend组件无关,如果您可以将查询的两部分与具体示例联系起来,我可以解释一种最佳方法

一些关键点是你应该

  • 以您认为匹配最小节点集的内容开始查询(以约束必须完成的工作)
  • 确保所有查询组件都使用标签和关系类型
  • 为将在查找中使用的属性创建索引
  • 查询优化的一个优秀资源是


    图的大小不需要使查询更昂贵,因为您将主要处理一个子图,该子图可能具有更固定大小的边界。当然,如果您的查询需要跨越整个图形,那么大小将成为速度的问题

    为什么第一个查询不起作用?我只是阅读了文档,除了
    最短路径
    ,没有找到这个模式。。我认为该模式仅限于
    最短路径
    所以,“OWNS\u BY和某些\u REL组件似乎与friend of a friend组件无关”=>事实上,这只是一个示例。您写道:“以您认为匹配最小节点集的内容开始查询”。这是否意味着应该拆分此查询?:
    MATCH(a)-[:SOME_REL]->(b)(b)感谢Wes的链接,我现在理解拆分的好处;):从最小匹配(就返回的节点而言)开始,它将过滤整个匹配,以简化和简化第二个匹配。
    
    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)
    
    MATCH (me:User{userId:123})-[:KNOWS*1..2]-(friend:User)
    WHERE me <> friend
    RETURN friend