<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
Hello Alexander
<div><br>
</div>
<div>thank you for your quick and helpful response!</div>
<div>I was able to fix my code with your suggestion.</div>
<div><br>
</div>
<div> Given the inverse references that pony maintains between entities I expect that this Exception will happen frequently. so I recommend that you include a section about it in your documentation.</div>
<div><br>
</div>
<div> Keep up the good work</div>
<div> regards</div>
<div> Arthur<br>
<div><br>
<div>
<div>On Nov 2, 2014, at 3:41 PM, Alexander Kozlovsky <<a href="mailto:alexander.kozlovsky@gmail.com">alexander.kozlovsky@gmail.com</a>> wrote:</div>
<br class="Apple-interchange-newline">
<blockquote type="cite">
<div dir="ltr">Hi Arthur!<br>
<br>
When Pony stores objects to the database, it needs to determine the order of inserts. This order of inserts cannot be arbitrary, because of referential integrity constraints. We cannot insert a row which references to another row, if that another row is not
 exists in the database yet.<br>
<br>
In simple cases Pony can determine valid order of inserts automatically. But in your example there are cyclic references between objects. Pony cannot insert object `ID` with primary key "a", because Pony doesn't know which value to write to the `canonicalEquivalent`
 column (because the `EquivalentIDset` object is not exists in the database yet). But Pony cannot first save `EquivalentIDset` object also, because referential integrity rules prevent it to store value of "a" in `canonicalID` attribute.<br>
<br>
In order to break the cycle you can perform `flush()` command before creating `EquivalentIDset` object:<br>
<br>
<div>    a = ID(identifier='a')</div>
<div>    b = ID(identifier='b')</div>
<div>    flush()</div>
<div>    EquivalentIDset(equivalentIDs=[a, b], canonicalID=a)</div>
<div><br>
</div>
The `flush()` command forces Pony to store already created `ID` objects. At this moment the saving is possible, because `substituteIDs` and `canonicalEquivalent` attributes of newly created objects don't refer to any object yet, and contain None as a value.<br>
<br>
After the `flush()` command is executed, Pony can save `EquivalentIDset` object successfully, because the `ID` object referenced in the `canonicalID` attribute is already stored in the database. After the `EquivalentIDset` object is inserted, Pony will update
 `a` and `b` objects in order to link them with newly created `EquivalentIDset` object.<br>
<br>
Another option is to store all objects right away, but set the value of `canonicalID` attribute separately after the `flush` command:<br>
<br>
<div>    a = ID(identifier='a')</div>
<div>    b = ID(identifier='b')</div>
<div>    idset = EquivalentIDset(equivalentIDs=[a, b])<br>
</div>
<div>    flush()<br>
    idset.canonicalID = a</div>
<div><br>
</div>
<br>
Regards,<br>
Alexander<br>
<br>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Sun, Nov 2, 2014 at 7:57 PM, Goldberg, Arthur P <span dir="ltr">
<<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__mailto-3Aarthur.p.goldberg-40mssm.edu&d=AAMFaQ&c=4R1YgkJNMyVWjMjneTwN5tJRn8m8VqTSNCjYLg1wNX4&r=TntoeYH7lekXzpBRjXwLTkqiWTbWAvp3pHKo_kZp5qI&m=Im9GDt-vK57s6gDb1QpWydE9Os_4r6XEz5soJaYkN7M&s=kJ2xXdwv-R8Ehl3EmAEjpw4n3qg7Y32txt3ML0WrCkY&e=" target="_blank">arthur.p.goldberg@mssm.edu</a>></span>
 wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div>
<div><font><span style="font-size:10pt">
<div>Hi Folks<br>
<br>
I'm building an alias dbms. Multiple aliases can refer to the same person (genetics subject). I've two main entities: ID, an identifier; and an EquivalentIDset, which points to a set of aliased IDs. EquivalentIDset needs to be a separate entity, so it can have
 attributes. One of those attributes is canonicalID, the primary ID (if any) among the set.
<br>
<br>
However, when I set canonicalID and scan through the IDs, I get a 'Cannot save cyclic chain' exception. Here's an (almost) freestanding extract of my code that generates the error:<br>
<br>
</div>
</span></font></div>
<div><font><span style="font-size:10pt">
<div><br>
<br>
What does the exception mean?<br>
<br>
What's the best way to handle this? My thought is to not define canonicalID as an entity reference, but as a string equal to ID.identifier. But that would lose the dbms consistency benefits. Suggestions?<br>
<br>
Thanks<br>
Arthur<br>
<br>
PS:<br>
$ pip show pony<br>
---<br>
Name: pony<br>
Version: 0.5.4<br>
Location: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages<br>
<br>
</div>
</span></font></div>
</div>
<br>
_______________________________________________<br>
ponyorm-list mailing list<br>
<a href="mailto:ponyorm-list@ponyorm.org">ponyorm-list@ponyorm.org</a><br>
<a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__mailman-2Dmail5.webfaction.com_listinfo_ponyorm-2Dlist&d=AAMFaQ&c=4R1YgkJNMyVWjMjneTwN5tJRn8m8VqTSNCjYLg1wNX4&r=TntoeYH7lekXzpBRjXwLTkqiWTbWAvp3pHKo_kZp5qI&m=Im9GDt-vK57s6gDb1QpWydE9Os_4r6XEz5soJaYkN7M&s=1i-RmtLWX1db57f__7oaYczx8mSRITXwBgO66r3_Q0M&e=" target="_blank">/ponyorm-list</a><br>
<br>
</blockquote>
</div>
<br>
</div>
_______________________________________________<br>
ponyorm-list mailing list<br>
<a href="mailto:ponyorm-list@ponyorm.org">ponyorm-list@ponyorm.org</a><br>
https://urldefense.proofpoint.com/v2/url?u=https-3A__mailman-2Dmail5.webfaction.com_listinfo_ponyorm-2Dlist&d=AAIGaQ&c=4R1YgkJNMyVWjMjneTwN5tJRn8m8VqTSNCjYLg1wNX4&r=TntoeYH7lekXzpBRjXwLTkqiWTbWAvp3pHKo_kZp5qI&m=Im9GDt-vK57s6gDb1QpWydE9Os_4r6XEz5soJaYkN7M&s=1i-RmtLWX1db57f__7oaYczx8mSRITXwBgO66r3_Q0M&e=
<br>
</blockquote>
</div>
<br>
<div>
<div style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px; ">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; border-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; ">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<span class="Apple-style-span" style="orphans: 2; text-align: -webkit-auto; text-indent: 0px; widows: 2; -webkit-text-decorations-in-effect: none; ">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<span class="Apple-style-span" style="orphans: 2; text-align: -webkit-auto; text-indent: 0px; widows: 2; -webkit-text-decorations-in-effect: none; ">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<span class="Apple-style-span" style="orphans: 2; text-align: -webkit-auto; text-indent: 0px; widows: 2; -webkit-text-decorations-in-effect: none; ">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<span class="Apple-style-span" style="orphans: 2; text-align: -webkit-auto; text-indent: 0px; widows: 2; -webkit-text-decorations-in-effect: none; ">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<span class="Apple-style-span" style="orphans: 2; text-align: -webkit-auto; text-indent: 0px; widows: 2; -webkit-text-decorations-in-effect: none; ">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-transform: none; white-space: normal; word-spacing: 0px; border-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; ">
<div style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-transform: none; white-space: normal; word-spacing: 0px; border-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; ">
---</div>
<div> </div>
<div>Arthur Goldberg
<div style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-transform: none; white-space: normal; word-spacing: 0px; border-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; ">
Associate Professor of Psychiatry</div>
<div>Seaver Autism Center and Icahn Institute for Genomics & Multiscale Biology</div>
<div>Icahn School of Medicine at Mount Sinai</div>
<div style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-transform: none; white-space: normal; word-spacing: 0px; border-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; ">
Seaver Center, Room ABE-33</div>
<div style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-transform: none; white-space: normal; word-spacing: 0px; border-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; ">
212-241-4229<br>
<a href="mailto:Arthur.Goldberg@mssm.edu">Arthur.Goldberg@mssm.edu</a></div>
</div>
</div>
<div>Follow us on Twitter <a href="https://twitter.com/IcahnInstitute">@IcahnInstitute</a></div>
<div style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-transform: none; white-space: normal; word-spacing: 0px; border-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; ">
<br>
</div>
</div>
</div>
</span></div>
</span></div>
</span></div>
</span></div>
</span></div>
</span></div>
</span></div>
</div>
</div>
<br class="Apple-interchange-newline">
<br class="Apple-interchange-newline">
</div>
<br>
</div>
</div>
</body>
</html>