本文主要记录我自己遇到的一些常见问题
1Spring Boot NEO
The client is unauthorized due to authentication failure
解决方法:找到你安装neo4j的路径下的conf文件夹,找到neo4j.conf
#dbms.security.auth_enabled=false
将前面的注释#去掉,然后重启neo4j,在重启项目即可。
注意,将上面设置为false以后,即登录时候,不进行验证,使用匿名登录,因此不管用户名密码输入什么,都可以登录
Spring Data NEO日志无法打印cyper日志
我定义了如下一个根据userName打印的方法,但是SDN会为我生成什么样子的cypher语句
@Repository
public interface UserRepository extends Neo4jRepository<UserNode, Long> {
List<UserNode> findByUserName(String userName);
}
关于无法打印日志,楼主反正也是一顿找,一开始百度,发现百度找不到NEO打印日志的内容,后来去GPT,发现GPT说的一点用没有(3.5GPT的数据截止于2021年,2021的网上关于SDN的数据,可能不太好吧),后来上stackoverflow也是查看了很多,也没找到我想要的答案,也可能是因为SDN的版本太多,各版本之间的差异吧。
首先,把根目录日志设置为debug,这时候日志很多,不用管,然后启动项目以后(这个生产环境是一定禁止的,这种行为不可以上生产,这里把root设置为debug,这是为了我们解决问题,后续这个得删除),进行查询以后,可以发现SDN给我们生成的cypher。
logging:
level:
root: DEBUG
以下是我们通过观察日志得出的,SDN的PartTreeNeo4jQuery记录执行方法,BoltRequest记录了执行的cypher
//这个类打印了我们具体执行的是哪一个cypher接口,方便我们直接定位我们执行的是哪个方法
o.s.d.n.r.query.PartTreeNeo4jQuery(简写)
org.springframework.data.neo4j.repository.query.PartTreeNeo4jQuery(完整路径)
//这个类则直接打印了,我们执行的具体的cypher语句
o.n.o.drivers.bolt.request.BoltRequest(简写)
org.neo4j.ogm.drivers.bolt.request.BoltRequest(完整路径)
现在我们将这两个类配置到yml,日志等级设置为debug,并且将之前的logging.level.root注释掉。需要注意的是,请不要无脑照抄下面的配置,而且通过我们上面的方法,找到是NEO中的哪个类在打印日志,然后将打印日志的那个类设置为debug。
logging:
level:
#root: DEBUG
org.springframework.data.neo4j.repository.query.PartTreeNeo4jQuery: DEBUG
org.neo4j.ogm.drivers.bolt.request.BoltRequest: DEBUG
如果你使用的不是SpringBoot的默认日志,例如下面这样。使用logback或者log4j2这些框架,那么你需要将日志配置xml中
logging:
config: classpath:logback-spring.xml
<logger name="org.springframework.data.neo4j.repository.query.PartTreeNeo4jQuery" level="DEBUG"/>
<logger name="org.neo4j.ogm.drivers.bolt.request.BoltRequest" level="DEBUG"/>
最终实现效果如下
定义@RelationshipEntity导致@Relationship不能映射属性
当只有NodeEntity时
@Data
@NodeEntity("User")
public class UserNode {
@Id
@GeneratedValue
private Long id;
private String userName;
private int userAge;
private String userSex;
@Relationship(type = "老公")
private List<UserNode> laogong;
}
//此时user.getLaogong()不为null,能正确映射
UserNode user = userRepo.findById(id).orElse(null);
但是由于我需要在代码中创建user1和user2之间的关系,因此我定义了如下UserShip
UserShip userShip = new UserShip();
userShip.setStartNode(user1);
userShip.setEndNode(user2);
userShipRepo.save(userShip);
@Data
@RelationshipEntity("老公")
public class UserShip {
@Id
@GeneratedValue
private Long id;
@StartNode
private UserNode startNode;
@EndNode
private UserNode endNode;
}
这时候,我就发现,UserNode中的的Relationship的属性就为null
//此时user.getLaogong()为null
UserNode user = userRepo.findById(id).orElse(null);
当我尝试把UserShip这个类给删除掉以后,我发现又能查询到Relationship的属性了,或者@RelationshipEntity注释掉也可以,或者换个关系名字,只要不和@Relationship(type = “老公”)的名字一样就行了。
注释掉就能查询
//@RelationshipEntity("老公")
或者换个和@Relationship(type = "老公")不一样的关系
@Relationship(type = "老公xxx")
官方示例代码如下,我发现官方代码中@Relationship这里不是在node节点,而是ship节点
@NodeEntity
public class Actor {
Long id;
@Relationship(type="PLAYED_IN") private Role playedIn;
}
@RelationshipEntity(type = "PLAYED_IN")
public class Role {
@Id @GeneratedValue private Long relationshipId;
@Property private String title;
@StartNode private Actor actor;
@EndNode private Movie movie;
}
@NodeEntity
public class Movie {
private Long id;
private String title;
}
因此我尝试修改代码,把原本的node节点换成ship节点,并且还原了UserShip的代码
@RelationshipEntity("老公")
public class UserShip {
@Id
@GeneratedValue
private Long id;
@StartNode
private UserNode startNode;
@EndNode
private UserNode endNode;
}
@Relationship(type = "老公")
//private List<UserNode> laogong;
private List<UserShip> laogong;
当我在次查询,出现Json序列化循环依赖
通过查看后台的数据发现,已经取值到子节点了,但是发现startNode节点出现:
Exception occurred in target VM occurred invoking method.
这个问题好解决,因为startNode节点就是本身就是Relationship属性的父节点,在这里userNode节点是西子,startNode节点也是西子,因此嵌套了,我们将startNode忽略Json格式化即可
import com.fasterxml.jackson.annotation.JsonIgnore;
@JsonIgnore
@StartNode
private UserNode startNode;
如下是我们最后的一个实现效果及代码,需要注意的时候,你如果需要打印UserNode节点时,一定要重写toString,否则也会出现循环嵌套的问题,导致堆栈溢出。
如果你的endNode节点中也存在循环嵌套的问题,那么你也需要将嵌套的节点进行格式化忽略。
我使用Spring Data neo 5.3.9.RELEASE
这是我定义的User节点
@Data
@NodeEntity(“User”)
public class UserNode {
@Id
@GeneratedValue
private Long id;
private String userName;
private int userAge;
private String userSex;
@Relationship(type = “老公”)
private List laogong;
}
我通过下面这个方法能获取user对象,并且该对象有laogong这个属性值
UserNode user = userRepo.findById(id).orElse(null);文章来源:https://www.toymoban.com/news/detail-622785.html
但是当我定义了一个UserShip以后
@Data
@RelationshipEntity(“老公”)
public class UserShip {
@Id
@GeneratedValue
private Long id;
@StartNode
private UserNode startNode;
@EndNode
private UserNode endNode;
}
user对象的laogong属性为null了
这是怎么回事?我该怎么处理?文章来源地址https://www.toymoban.com/news/detail-622785.html
Cypher
到了这里,关于neo4j使用中的常见问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!