Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 选择缺少某种类型关系的节点_Neo4j - Fatal编程技术网

Neo4j 选择缺少某种类型关系的节点

Neo4j 选择缺少某种类型关系的节点,neo4j,Neo4j,我想选择数据库中与任何其他节点没有给定关系类型的所有节点 这是我的数据库结构:我有发布事件节点的用户节点。发布关系更为具体,有各种类型的关系,例如type1和type2 如何快速选择与事件有type1关系但与事件没有type2关系的所有用户节点 下面是我现在使用的查询: START u = node:users("*:*") MATCH (ev1)<-[r1:type1]-(u)-[r2?:type2]->(ev2) WHERE r2 IS NULL RETURN u STAR

我想选择数据库中与任何其他节点没有给定关系类型的所有节点

这是我的数据库结构:我有发布事件节点的用户节点。发布关系更为具体,有各种类型的关系,例如
type1
type2

如何快速选择与事件有
type1
关系但与事件没有
type2
关系的所有用户节点

下面是我现在使用的查询:

START u = node:users("*:*") 
MATCH (ev1)<-[r1:type1]-(u)-[r2?:type2]->(ev2) 
WHERE r2 IS NULL
RETURN u
START u=node:users(“*:*”)
匹配(ev1)(ev2)
其中r2为空
返回u
问题是r2是一个可选关系。这使得上面的查询非常慢,证实了neo4j文档的说法

如何提高此查询的速度?我可以更好地建模数据以提高性能吗

谢谢大家!!
Alex

我发现的解决方案有两个方面,具体取决于用例。我有两个:

  • 查找具有类型为
    type1
    但不具有类型为
    type2
    的关系的所有用户节点 两个查询可以解决此问题,一个使用neo4j手册警告不要使用的
    可选关系

    START u = node:users("some query")
    MATCH (ev1)<-[r1:TYPE1]-(u)-[r2?:TYPE2]->(ev2)
    WHERE r2 IS NULL
    RETURN u
    
    START u=节点:用户(“一些查询”)
    匹配(ev1)(ev2)
    其中r2为空
    返回u
    
    或者使用更快的变体,对模式进行过滤

    START u=节点:用户(“一些查询”)
    匹配(ev1)()
    返回u
    
  • 查找具有类型为
    type1
    但不具有类型为
    type2
    且具有特定属性的节点关系的所有用户节点

    开始u=节点:用户(“某些查询”) 匹配(ev1)(ev2) 其中ev2.property=value r2.property=value 返回u

  • 考虑到我的问题有一个性能说明,我将添加两条建议来加速上述查询:

    • 在Lucene中尽可能巧妙地索引,并将尽可能多的查询条件从
      WHERE
      移动到索引查询。所有这些都是为了减少起始节点的数量!注意!大量索引会降低写入性能。有关可用的查询语法,请参见
    • 使用参数化查询,以便neo4j可以缓存查询的执行策略
    可能重复@StefanArmbruster我使用了您推荐的问题的答案,查询响应类型增加了50%。这里是我使用的查询:start u=node:users(':')match(u)-[:type1]>()where not(u)-[:type2]>()return count(distinct(u))@StefanArmbruster然而,我现在注意到我无法在
    where not
    构造中附加对关系/节点的引用。Ie.
    …其中非(u)-(r2:type2]->(ev2).
    发出此错误:未知标识符
    ev2
    。未知标识符
    r2
    。有什么解决方案吗?因为您要在
    中匹配不存在的路径,而不在
    中,所以您不能为其部分指定变量名(它们不存在)。因此,选择where not(u)-[:type2]->(),它的意思是“通过那些没有类型为
    type2
    的传出关系的人过滤u”。@Stefan Armbruster是的,这很有意义!我试图做的是检查用户是否与没有特定属性的节点有关系。在这种情况下,我不需要在使用参数化密码时使用
    where not
    check.strong+1。索引总是以写性能换取读性能。所以“索引尽可能多”听起来有点误导,它应该是“索引尽可能聪明”以减少潜在的开始节点数。@StefanArmburster已修改!10倍
    START u = node:users("some query")
    MATCH (ev1)<-[r1:TYPE1]-(u)
    WHERE NOT (u)-[:TYPE2]->()
    RETURN u