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
Java 使用spring数据neo4j更新关系的属性_Java_Neo4j_Spring Data Neo4j - Fatal编程技术网

Java 使用spring数据neo4j更新关系的属性

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

我目前正在创建一个网络爬虫,它使用neo4j来存储每个页面的内容。除了存储内容外,neo4j还用于存储页面之间的链接,这些链接稍后将用于计算页面排名

我正在使用spring-data-neo4j 4.1.12.RELEASE,在尝试更新两个节点之间的关系时遇到了一个问题。以下是所有相关代码

领域 网页(节点)

存储库 注意

@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);
}