Соединение узлов с отношениями в 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. Я хотел бы сделать auth_name свойство узлов Author в качестве индекса для связи с узлами Mainstream_news. Любые предложения будут отличными.

2 ответа

Вы создаете новый Authors узел каждый раз в вашем цикле, даже если узел Автор (с такими же свойствами) уже существует.

Во-первых, я думаю, что вы должны создать ограничения уникальности для Authors(auth_name) а также Mainstream_News(id), чтобы обеспечить выполнение ваших требований. Это нужно сделать только один раз. Ограничение уникальности также автоматически создает для вас индекс, что является бонусом.

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

Но вам, вероятно, придется сначала очистить вашу БД (по крайней мере, Authors а также Mainstream_News узлы и их отношения), так как я предполагаю, что в настоящее время в нем много дублирующих узлов.

Затем вы можете использовать merge_one а также create_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))

Это то, что я обычно делаю, так как мне легче узнать, что происходит. Насколько я знаю, есть но, когда вы создаете unun только с Node, и нет необходимости создавать узлы, когда вам также нужно создать ребро.

У меня нет базы данных на этом компьютере, поэтому, пожалуйста, потерпите меня, если есть какие-то опечатки, я исправлю это утром, но я думаю, у вас скорее будет быстрый ответ..:-)

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

Я включил первые строки дерева, чтобы сделать его более общим. Возвращает объект-объект или None.


РЕДАКТИРОВАТЬ:

@cybersam использование схемы это круто, реализовать это, я постараюсь использовать его также myselfe..:-)

Вы можете прочитать больше об этом здесь: http://neo4j.com/docs/stable/query-constraints.html http://py2neo.org/2.0/schema.html

Другие вопросы по тегам