【问题标题】:Create same relationships between nodes with different properties在具有不同属性的节点之间创建相同的关系
【发布时间】:2017-04-26 07:27:14
【问题描述】:

我正在创建一个简单的社交图谱,用户可以在其中创建帖子、标记帖子并对其发表评论。我正在使用py2neo 进行建模。该模型有userpost 作为节点。 post 上的用户 TAGGEDPOSTEDCOMMENTED。就我而言,单个用户可以在单个post 上创建多个tags 或comments(就像那里的任何社交网络一样)。根据我的模型,这需要多个TAGGEDCOMMENTED 关系,但具有不同的属性。模型是这样构建的:

from py2neo.ogm import (
    GraphObject, 
    Property, 
    RelatedTo, 
    RelatedFrom
)


class User(GraphObject):
    __primarykey__ = 'name'

    name = Property()

    posts = RelatedTo('Post', 'POSTED')
    comments = RelatedTo('Post', 'COMMENTED')
    tags = RelatedTo('Post', 'TAGGED')

    def __init__(self, name):
        self.name = name


class Post(GraphObject):

    # assumes __id__ as primary key because
    # left undefined

    title = Property()

    users = RelatedFrom('User', 'POSTED')
    comments = RelatedFrom('User', 'COMMENTED')
    tags = RelatedFrom('User', 'TAGGED')

    def __init__(self, title):
        self.title = title

我运行以下命令来构建图表:

user = User(name='john')
post = Post(title='Wow!')

user.posts.add(
    post,
    {'date': '2017-04-26'}
)
graph.push(user)

user.comments.add(
    post,
    {'caption': 'I know!', 'date': '2017-04-26'}
)
graph.push(user)

for tag in ['yellow', 'green']:
    user.tags.add(
        post,
        {'tag': tag, 'date': '2017-04-26'}
    )
    graph.push(user)

我希望有两个TAGGED 关系,如下所示:

但我发现情况并非如此:

我的问题是双重的。 (1) 可以创建多个具有不同属性的相同类型的关系吗? (2) 这是用例的最佳模型选择吗?

【问题讨论】:

    标签: neo4j relationship graph-databases py2neo


    【解决方案1】:

    您可以使用 neo4jrestclient。它允许您拥有多个相同类型的关系,而且它也很容易使用。您可以使用以下代码:

        from neo4jrestclient.client import GraphDatabase
        gdb=GraphDatabase("http://localhost:7474/db/data/")
        user=gdb.nodes.create(name='john')
        post=gdb.nodes.create(title='wow')
        user.labels.add('User')
        post.labels.add('Post')
        u=gdb.labels.get('User')
        p=gdb.labels.get('Post')
    

    现在是多重关系

        for tag in ['yellow', 'green']:
            u.get(name='john')[0].relationships.create('TAGGED',p.get(id=0)[0],tag=tag,date='2017-04-26')
    

    应该这样做。 .get 用于更新节点,就像 .push 一样。 可以有更清洁的方法来做到这一点,但你明白了。文档也很不错。 https://readthedocs.org/projects/neo4j-rest-client/downloads/pdf/latest/

    【讨论】:

      【解决方案2】:

      虽然 neo4j(以及 Neo4j 的大多数编程接口,如 Cypher)确实支持一对节点之间相同类型的多个关系(可能具有不同的属性集),py2neo 似乎并不支持(参见this issue )。

      我建议你考虑使用其他方式来使用neo4j from Python,比如官方支持的neo4j Python Driver

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多