Java 使用spring数据neo4j更新关系的属性
我目前正在创建一个网络爬虫,它使用neo4j来存储每个页面的内容。除了存储内容外,neo4j还用于存储页面之间的链接,这些链接稍后将用于计算页面排名 我正在使用spring-data-neo4j 4.1.12.RELEASE,在尝试更新两个节点之间的关系时遇到了一个问题。以下是所有相关代码 领域 网页(节点) 存储库 注意Java 使用spring数据neo4j更新关系的属性,java,neo4j,spring-data-neo4j,Java,Neo4j,Spring Data Neo4j,我目前正在创建一个网络爬虫,它使用neo4j来存储每个页面的内容。除了存储内容外,neo4j还用于存储页面之间的链接,这些链接稍后将用于计算页面排名 我正在使用spring-data-neo4j 4.1.12.RELEASE,在尝试更新两个节点之间的关系时遇到了一个问题。以下是所有相关代码 领域 网页(节点) 存储库 注意 @NodeEntity public class WebPage { @GraphId private Long nodeId; private
@NodeEntity
public class WebPage {
@GraphId
private Long nodeId;
private String url;
@Relationship(type = "LINKED_TO", direction = Relationship.OUTGOING)
private Set<Link> outgoingLinks = new HashSet<>();
public WebPage() {}
public String getUrl() {
return url;
}
public WebPage setUrl(String url) {
this.url = url;
return this;
}
@Relationship(type = "LINKED_TO", direction = Relationship.OUTGOING)
public Set<Link> getOutgoingLinks() {
return outgoingLinks;
}
@Relationship(type = "LINKED_TO", direction = Relationship.OUTGOING)
public void setOutgoingLinks(Set<Link> outgoingLinks) {
this.outgoingLinks = outgoingLinks;
}
public void addOutgoingLink(WebPage linkedWebPage, String anchor) {
Link outgoingLink = new Link(this, linkedWebPage, anchor);
outgoingLinks.remove(outgoingLink);
outgoingLinks.add(outgoingLink);
}
}
equals和hashCode在链接域上被重写,因此它仅使用源网页和链接网页来确定相等性。我这样做是因为我不想在两个网页之间创建多个链接。因此,如果一个网页有多个指向另一个网页的链接,那么所有的锚都收集在一个链接下
问题
@NodeEntity
public class WebPage {
@GraphId
private Long nodeId;
private String url;
@Relationship(type = "LINKED_TO", direction = Relationship.OUTGOING)
private Set<Link> outgoingLinks = new HashSet<>();
public WebPage() {}
public String getUrl() {
return url;
}
public WebPage setUrl(String url) {
this.url = url;
return this;
}
@Relationship(type = "LINKED_TO", direction = Relationship.OUTGOING)
public Set<Link> getOutgoingLinks() {
return outgoingLinks;
}
@Relationship(type = "LINKED_TO", direction = Relationship.OUTGOING)
public void setOutgoingLinks(Set<Link> outgoingLinks) {
this.outgoingLinks = outgoingLinks;
}
public void addOutgoingLink(WebPage linkedWebPage, String anchor) {
Link outgoingLink = new Link(this, linkedWebPage, anchor);
outgoingLinks.remove(outgoingLink);
outgoingLinks.add(outgoingLink);
}
}
在测试中,我创建/查找两个网页,然后创建/更新这两个网页之间的链接。下面是我用来更新链接的相关代码(来自上面)
public void addOutgoingLink(WebPage linkedWebPage, String anchor) {
Link outgoingLink = new Link(this, linkedWebPage, anchor);
outgoingLinks.remove(outgoingLink);
outgoingLinks.add(outgoingLink);
}
问题是关系将在第一次测试时创建,但在第二次测试时删除。这个创建和删除周期将无限期地继续下去
下面是一个运行示例,从数据库中并没有数据开始
运行#1
运行#2
运行3,与运行1相同
运行4,与运行2相同
有没有更好的方法来更新关系?从我的阅读来看,通过节点属性更新关系似乎是首选,因为使用@Query语法可能会导致数据的同步问题
在此问题上的任何帮助都将不胜感激
谢谢
马特
@Test
public void test() {
WebPage sourceWebPage = webPageRepository.findByUrl("http://www.test.com/");
if (sourceWebPage == null) {
sourceWebPage = new WebPage().setUrl("http://www.test.com/");
}
WebPage linkedWebPage = webPageRepository.findByUrl("http://www.example.com/");
if (linkedWebPage == null) {
linkedWebPage = new WebPage().setUrl("http://www.example.com/");
}
String anchor = "test";
sourceWebPage.addOutgoingLink(linkedWebPage, anchor);
webPageRepository.save(sourceWebPage);
}
public void addOutgoingLink(WebPage linkedWebPage, String anchor) {
Link outgoingLink = new Link(this, linkedWebPage, anchor);
outgoingLinks.remove(outgoingLink);
outgoingLinks.add(outgoingLink);
}