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 如何在不返回null的情况下运行多匹配搜索?_Neo4j_Cypher - Fatal编程技术网

Neo4j 如何在不返回null的情况下运行多匹配搜索?

Neo4j 如何在不返回null的情况下运行多匹配搜索?,neo4j,cypher,Neo4j,Cypher,您好,我有一个示例查询,如果您想了解我将要参考的图形的概念: CREATE(u:User{name:“Tim Cook”})-[:FOLLOWS]>(t:Thing{name:“意大利”}),(t)(p1:Post{name:“Post 2”}),(u)-[:FOLLOWS]>(u3:User{name:“Joe Biden”})-[:writed]>(p2:Post{name:“Post 3” 这里也有: 我试图获得所有用户直接关注作者(写文章的人)或关注文章中“标记”的内容的帖子 因此,在示

您好,我有一个示例查询,如果您想了解我将要参考的图形的概念:

CREATE(u:User{name:“Tim Cook”})-[:FOLLOWS]>(t:Thing{name:“意大利”}),(t)(p1:Post{name:“Post 2”}),(u)-[:FOLLOWS]>(u3:User{name:“Joe Biden”})-[:writed]>(p2:Post{name:“Post 3”

这里也有:

我试图获得所有用户直接关注作者(写文章的人)或关注文章中“标记”的内容的帖子

因此,在示例查询中,如果您是Tim Cook,您应该收到帖子2和3,因为您直接关注作者,而帖子1是因为您关注在该帖子中标记的意大利

我到处都在找,很难找到。降落在这里。我使用“可选”这样,如果用户没有跟踪任何人,第一个不会使整个查询崩溃,或者如果用户没有跟踪任何东西,第二个不会崩溃。然而,根据我在下面所做的,对于任何一个空查询,它都返回Null

因此,如果第一部分没有匹配项,第二部分没有匹配项6,那么我将得到一个长度为7的数组。[null,post1,post2,…post6]

我该怎么做呢?提前谢谢你

OPTIONAL MATCH (this)-[:FOLLOWS]->(u1)-[:WROTE]->(post:Post)
RETURN post
ORDER BY post.id
UNION
OPTIONAL MATCH (this)-[:FOLLOWS]->(t:Thing)<-[:TAGGED]-(post:Post)
RETURN post
ORDER BY post.id
可选匹配(this)-[:FOLLOWS]->(u1)-[:writed]->(post:post)
回程站
邮购
联合

可选的匹配(这个)-[如下:->(t:事物)可以将路径中间的节点(用户或标签)视为通用对象,因此从这里使用多关系类型模式匹配:

MATCH (u:User {name: "Tim Cook"})
MATCH (u)-[:FOLLOWS]->(thing)-[:WROTE|TAGGED]-(p:Post)
RETURN p.name

╒════════╕
│"p.name"│
╞════════╡
│"Post 3"│
├────────┤
│"Post 2"│
├────────┤
│"Post 1"│
└────────┘
```

From there, if you want to know if the user is following the author, it's just plain logic, you return if the node in the middle is of type 'User' (which would validate the assumption since the first relationship is FOLLOWS thing)

```
MATCH (u:User {name: "Tim Cook"})
MATCH (u)-[:FOLLOWS]->(thing)-[:WROTE|TAGGED]-(p:Post)
RETURN p.name, ('User' IN labels(thing)) AS followingAuthor

╒════════╤═════════════════╕
│"p.name"│"followingAuthor"│
╞════════╪═════════════════╡
│"Post 3"│true             │
├────────┼─────────────────┤
│"Post 2"│true             │
├────────┼─────────────────┤
│"Post 1"│false            │
└────────┴─────────────────┘
```



哇!把(东西)放在那里而不是(东西),然后使这种关系没有方向,这是一个伟大的呼吁!使它可以是任何节点,这真的很聪明。非常感谢你!如果有人跟踪一个作者,也跟踪一个贴子上标记的东西,现在他们都回来了。所以我把returndistinct p放在这里,这是避免重复的最佳选择吗?再次感谢你!!这是个不错的选择。在使用聚合函数时,您还可以利用Cypher的隐式GroupBy,例如返回p,count(*)作为分数,以防您想对结果进行排名再次感谢!