繁体   English   中英

在具有不同属性的节点之间创建相同的关系

[英]Create same relationships between nodes with different properties

我正在创建一个简单的社交图,用户可以在其中创建帖子、标记它并对其发表评论。 我正在使用py2neo进行建模。 该模型将userpost作为节点。 用户对TAGGED进行了POSTEDpostCOMMENTED 在我的例子中,单个用户可以在单个post上创建多个tagcomment (就像那里的任何社交网络一样)。 根据我的模型,这需要多个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) 这是用例的最佳模型选择吗?

你可以使用 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/

尽管 neo4j(以及大多数 neo4j 的编程接口,如 Cypher)确实支持一对节点之间相同类型的多个关系(可能具有不同的属性集), py2neo似乎不支持(请参阅本期)。

我建议您考虑使用其他方式从 Python 使用 neo4j ,例如官方支持的neo4j Python 驱动程序

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM