使用py2neo中的关系连接节点

时间:2015-01-20 17:30:00

标签: neo4j py2neo

我有以下python代码在neo4j中制作图表。我使用的是py2neo 2.0.3版。

 import json
    from py2neo import neo4j, Node, Relationship, Graph

    graph = neo4j.Graph("http://localhost:7474/db/data/")
       with open("example.json") as f:
        for line in f:
            while True:
                try:
                    file = json.loads(line)
                    break
                except ValueError:
                    # Not yet a complete JSON value
                    line += next(f)

                    # Now creating the node and relationships

            news, = graph.create(Node("Mainstream_News", id=unicode(file["_id"]), entry_url=unicode(file["entry_url"]),
                                      title=unicode(file["title"])))  # Comma unpacks length-1 tuple.
            authors, = graph.create(
                Node("Authors", auth_name=unicode(file["auth_name"]), auth_url=unicode(file["auth_url"]),
                     auth_eml=unicode(file["auth_eml"])))

            graph.create(Relationship(news, "hasAuthor", authors ))

我可以使用节点Mainstream_News和Authors创建一个图表,其关系为' hasAuthor'。我的问题是当我这样做时,我有一个Mainstream_News节点和一个作者,但实际上一个作者节点有多个Mainstream_News。我想将Author节点的auth_name属性作为索引来连接Mainstream_news节点。任何建议都会很棒。

2 个答案:

答案 0 :(得分:4)

每次循环都会创建一个新的Authors节点,即使作者节点(具有相同的属性)已经存在。

首先,我认为您应该在Authors(auth_name)Mainstream_News(id)上创建唯一性约束,以强制执行您的要求。这只需要一次。唯一性约束也会自动为您创建索引,这是一个奖励。

graph.schema.create_uniqueness_constraint("Authors", "auth_name")
graph.schema.create_uniqueness_constraint("Mainstream_News", "id")

但是你可能必须首先清空你的数据库(至少是所有AuthorsMainstream_News节点及其关系),因为我认为它当前有很多重复的节点。

然后,您可以使用merge_onecreate_unique API来防止重复的节点和关系:

news = graph.merge_one("Mainstream_News", "id", unicode(file["_id"]))
news.properties["entry_url"] = unicode(file["entry_url"])
news.properties["title"] = unicode(file["title"])

authors = graph.merge_one("Authors", "auth_name", unicode(file["auth_name"]))
news.properties["auth_url"] = unicode(file["auth_url"])
news.properties["auth_eml"] = unicode(file["auth_eml"])

graph.create_unique(Relationship(news, "hasAuthor", authors))

答案 1 :(得分:0)

这就是我通常做的事情,因为我发现更容易知道发生了什么。据我所知,有一个但是当你只使用一个Node创建create_unique时,并且不需要创建节点,当你还需要创建边缘时。

我在这台电脑上没有数据库,所以请耐心等待我,如果有一些错字,我会在早上纠正它,但我想你宁愿快速回答.. : - )

news = graph.cypher.execute_one('MATCH (m:Mainstream_News) '
    'WHERE m.id = {id} '
    'RETURN p'.format(id=unicode(file["_id"])))

if not news:
   news = Node("Mainstream_News")
   news.properties['id] = unicode(file["_id"])
   news.properties['entry_url'] = unicode(file["entry_url"])
   news.properties['title'] = unicode(file["title"])

# You can make a for-loop here
authors = Node("Authors")
authors.properties['auth_name'] = unicode(file["auth_name"])
authors.properties['auth_url'] = unicode(file["auth_url"])
authors.properties['auth_eml'] = unicode(file["auth_eml"])

rel = Relationship(new, "hasAuthor", authors)
graph.create_unique(rel)
# For-loop should end here

我已将树的第一行包括在内,以使其更通用。它返回一个node-object或None。


编辑

@cybersam使用架构很酷,实现它,我会尝试使用它myselfe也..: - )

您可以在此处详细了解: http://neo4j.com/docs/stable/query-constraints.html http://py2neo.org/2.0/schema.html